From dd03d839ab56c3e5d7c607a8d76e58e0b75edb85 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Guido=20G=C3=BCnther?= <agx@sigxcpu.org>
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 02ba9e07f..c54364ccc 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