aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGuido Günther <agx@sigxcpu.org>2022-03-25 18:48:58 +0100
committerGuido Günther <agx@sigxcpu.org>2022-03-26 17:28:51 +0100
commitdd03d839ab56c3e5d7c607a8d76e58e0b75edb85 (patch)
treee18d6e0c42fbdbc1fec5518304bf346af50c09bd
parent4519117a6885736b26f2d8ff1af97886d184c155 (diff)
xdg-activation: Deduplicate token creation code
There were three places initializing a token: - wlr_xdg_activation_v1_add_token - wlr_xdg_activation_token_v1_create - activation_handle_get_activation_token The initialization of the token.destroy was missing in the first one. To prevent these functions from getting out of sync move the token creation into a common function. Fixes 4c59f7d4 ("xdg-activation: Allow to submit tokens")
-rw-r--r--types/wlr_xdg_activation_v1.c42
1 files changed, 20 insertions, 22 deletions
diff --git a/types/wlr_xdg_activation_v1.c b/types/wlr_xdg_activation_v1.c
index 02ba9e07..c54364cc 100644
--- a/types/wlr_xdg_activation_v1.c
+++ b/types/wlr_xdg_activation_v1.c
@@ -248,15 +248,11 @@ static void activation_handle_destroy(struct wl_client *client,
wl_resource_destroy(activation_resource);
}
-static void activation_handle_get_activation_token(struct wl_client *client,
- struct wl_resource *activation_resource, uint32_t id) {
- struct wlr_xdg_activation_v1 *activation =
- activation_from_resource(activation_resource);
-
+static struct wlr_xdg_activation_token_v1 *activation_token_create(
+ struct wlr_xdg_activation_v1 *activation) {
struct wlr_xdg_activation_token_v1 *token = calloc(1, sizeof(*token));
if (token == NULL) {
- wl_client_post_no_memory(client);
- return;
+ return NULL;
}
wl_list_init(&token->link);
wl_list_init(&token->seat_destroy.link);
@@ -265,6 +261,20 @@ static void activation_handle_get_activation_token(struct wl_client *client,
token->activation = activation;
+ return token;
+}
+
+static void activation_handle_get_activation_token(struct wl_client *client,
+ struct wl_resource *activation_resource, uint32_t id) {
+ struct wlr_xdg_activation_v1 *activation =
+ activation_from_resource(activation_resource);
+
+ struct wlr_xdg_activation_token_v1 *token = activation_token_create(activation);
+ if (token == NULL) {
+ wl_client_post_no_memory(client);
+ return;
+ }
+
uint32_t version = wl_resource_get_version(activation_resource);
token->resource = wl_resource_create(client,
&xdg_activation_token_v1_interface, version, id);
@@ -371,19 +381,12 @@ struct wlr_xdg_activation_v1 *wlr_xdg_activation_v1_create(
struct wlr_xdg_activation_token_v1 *wlr_xdg_activation_token_v1_create(
struct wlr_xdg_activation_v1 *activation) {
- struct wlr_xdg_activation_token_v1 *token = calloc(1, sizeof(*token));
+ struct wlr_xdg_activation_token_v1 *token = activation_token_create(activation);
+
if (token == NULL) {
return NULL;
}
- wl_list_init(&token->link);
- // Currently no way to set seat/surface
- wl_list_init(&token->seat_destroy.link);
- wl_list_init(&token->surface_destroy.link);
- wl_signal_init(&token->events.destroy);
-
- token->activation = activation;
-
if (!token_init(token)) {
wlr_xdg_activation_token_v1_destroy(token);
return NULL;
@@ -412,15 +415,10 @@ struct wlr_xdg_activation_token_v1 *wlr_xdg_activation_v1_add_token(
struct wlr_xdg_activation_v1 *activation, const char *token_str) {
assert(token_str);
- struct wlr_xdg_activation_token_v1 *token = calloc(1, sizeof(*token));
+ struct wlr_xdg_activation_token_v1 *token = activation_token_create(activation);
if (token == NULL) {
return NULL;
}
- wl_list_init(&token->link);
- wl_list_init(&token->seat_destroy.link);
- wl_list_init(&token->surface_destroy.link);
-
- token->activation = activation;
token->token = strdup(token_str);
wl_list_insert(&activation->tokens, &token->link);