From dd03d839ab56c3e5d7c607a8d76e58e0b75edb85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guido=20G=C3=BCnther?= Date: Fri, 25 Mar 2022 18:48:58 +0100 Subject: [PATCH] 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") --- types/wlr_xdg_activation_v1.c | 42 +++++++++++++++++------------------ 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/types/wlr_xdg_activation_v1.c b/types/wlr_xdg_activation_v1.c index 02ba9e07f2..c54364ccca 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); -- GitLab