From 631420dde2c3cf75b44eb017ff7c9c008f880546 Mon Sep 17 00:00:00 2001
From: andrew <andrew@arobeia.co.uk>
Date: Mon, 2 Nov 2026 17:45:52 +0000
Subject: [PATCH 2/2] Avoid replacing the event controllers, as this can be
 called from one of them

---
 client/gui-gtk-4.0/citydlg.c | 94 ++++++++++++++++--------------------
 1 file changed, 42 insertions(+), 52 deletions(-)

diff --git a/client/gui-gtk-4.0/citydlg.c b/client/gui-gtk-4.0/citydlg.c
index c20860e9d8..d747df45b3 100644
--- a/client/gui-gtk-4.0/citydlg.c
+++ b/client/gui-gtk-4.0/citydlg.c
@@ -2310,6 +2310,7 @@ static void city_dialog_update_supported_units(struct city_dialog *pdialog)
   } else {
     for (i = m; i < n; i++) {
       GtkWidget *cmd, *pix;
+      GtkGesture *gesture;
       struct unit_node node;
 
       cmd = gtk_button_new();
@@ -2326,9 +2327,18 @@ static void city_dialog_update_supported_units(struct city_dialog *pdialog)
       gtk_box_append(GTK_BOX(pdialog->overview.supported_unit_table),
                      cmd);
 
-      node.left = NULL;
-      node.middle = NULL;
-      node.right = NULL;
+      /* Set up the event controllers for the three mouse buttons */
+      node.left = GTK_EVENT_CONTROLLER(gtk_gesture_click_new());
+      gesture = gtk_gesture_click_new();
+      gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 2);
+      node.middle = GTK_EVENT_CONTROLLER(gesture);
+      gesture = gtk_gesture_click_new();
+      gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 3);
+      node.right = GTK_EVENT_CONTROLLER(gesture);
+
+      gtk_widget_add_controller(cmd, node.left);
+      gtk_widget_add_controller(cmd, node.middle);
+      gtk_widget_add_controller(cmd, node.right);
 
       unit_node_vector_append(nodes, node);
     }
@@ -2342,8 +2352,6 @@ static void city_dialog_update_supported_units(struct city_dialog *pdialog)
     pnode = unit_node_vector_get(nodes, i);
     if (pnode) {
       GtkWidget *cmd, *pix;
-      GtkGesture *gesture;
-      GtkEventController *controller;
 
       cmd = pnode->cmd;
       pix = pnode->pix;
@@ -2351,36 +2359,23 @@ static void city_dialog_update_supported_units(struct city_dialog *pdialog)
       put_unit_picture_city_overlays(punit, GTK_PICTURE(pix), pnode->height,
                                      punit->upkeep, happy_cost);
 
-      if (pnode->left != NULL) {
-        gtk_widget_remove_controller(cmd, pnode->left);
-        gtk_widget_remove_controller(cmd, pnode->middle);
-        gtk_widget_remove_controller(cmd, pnode->right);
-      }
+      gtk_event_controller_reset(pnode->left);
+      gtk_event_controller_reset(pnode->middle);
+      gtk_event_controller_reset(pnode->right);
 
       gtk_widget_set_tooltip_text(cmd, unit_description(punit));
 
-      controller = GTK_EVENT_CONTROLLER(gtk_gesture_click_new());
-      g_signal_connect(controller, "pressed",
+      g_signal_connect(pnode->left, "pressed",
                        G_CALLBACK(supported_unit_callback),
                        GINT_TO_POINTER(punit->id));
-      gtk_widget_add_controller(cmd, controller);
-      pnode->left = controller;
-      gesture = gtk_gesture_click_new();
-      gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 2);
-      controller = GTK_EVENT_CONTROLLER(gesture);
-      g_signal_connect(controller, "released",
+
+      g_signal_connect(pnode->middle, "released",
                        G_CALLBACK(middle_supported_unit_release),
                        GINT_TO_POINTER(punit->id));
-      gtk_widget_add_controller(cmd, controller);
-      pnode->middle = controller;
-      gesture = gtk_gesture_click_new();
-      gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 3);
-      controller = GTK_EVENT_CONTROLLER(gesture);
-      g_signal_connect(controller, "released",
+
+      g_signal_connect(pnode->right, "released",
                        G_CALLBACK(right_unit_release),
                        GINT_TO_POINTER(punit->id));
-      gtk_widget_add_controller(cmd, controller);
-      pnode->right = controller;
 
       if (city_owner(pdialog->pcity) != client.conn.playing) {
         gtk_widget_set_sensitive(cmd, FALSE);
@@ -2434,6 +2429,7 @@ static void city_dialog_update_present_units(struct city_dialog *pdialog)
   } else {
     for (i = m; i < n; i++) {
       GtkWidget *cmd, *pix;
+      GtkGesture *gesture;
       struct unit_node node;
 
       cmd = gtk_button_new();
@@ -2450,9 +2446,18 @@ static void city_dialog_update_present_units(struct city_dialog *pdialog)
       gtk_box_append(GTK_BOX(pdialog->overview.present_unit_table),
                      cmd);
 
-      node.left = NULL;
-      node.middle = NULL;
-      node.right = NULL;
+      /* Set up the event controllers for the three mouse buttons */
+      node.left = GTK_EVENT_CONTROLLER(gtk_gesture_click_new());
+      gesture = gtk_gesture_click_new();
+      gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 2);
+      node.middle = GTK_EVENT_CONTROLLER(gesture);
+      gesture = gtk_gesture_click_new();
+      gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 3);
+      node.right = GTK_EVENT_CONTROLLER(gesture);
+
+      gtk_widget_add_controller(cmd, node.left);
+      gtk_widget_add_controller(cmd, node.middle);
+      gtk_widget_add_controller(cmd, node.right);
 
       unit_node_vector_append(nodes, node);
     }
@@ -2465,44 +2470,29 @@ static void city_dialog_update_present_units(struct city_dialog *pdialog)
     pnode = unit_node_vector_get(nodes, i);
     if (pnode) {
       GtkWidget *cmd, *pix;
-      GtkEventController *controller;
-      GtkGesture *gesture;
 
       cmd = pnode->cmd;
       pix = pnode->pix;
 
       put_unit_picture(punit, GTK_PICTURE(pix), pnode->height);
 
-      if (pnode->left != NULL) {
-        gtk_widget_remove_controller(cmd, pnode->left);
-        gtk_widget_remove_controller(cmd, pnode->middle);
-        gtk_widget_remove_controller(cmd, pnode->right);
-      }
+      gtk_event_controller_reset(pnode->left);
+      gtk_event_controller_reset(pnode->middle);
+      gtk_event_controller_reset(pnode->right);
 
       gtk_widget_set_tooltip_text(cmd, unit_description(punit));
 
-      controller = GTK_EVENT_CONTROLLER(gtk_gesture_click_new());
-      g_signal_connect(controller, "pressed",
+      g_signal_connect(pnode->left, "pressed",
                        G_CALLBACK(present_unit_callback),
                        GINT_TO_POINTER(punit->id));
-      gtk_widget_add_controller(cmd, controller);
-      pnode->left = controller;
-      gesture = gtk_gesture_click_new();
-      gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 2);
-      controller = GTK_EVENT_CONTROLLER(gesture);
-      g_signal_connect(controller, "released",
+
+      g_signal_connect(pnode->middle, "released",
                        G_CALLBACK(middle_present_unit_release),
                        GINT_TO_POINTER(punit->id));
-      gtk_widget_add_controller(cmd, controller);
-      pnode->middle = controller;
-      gesture = gtk_gesture_click_new();
-      gtk_gesture_single_set_button(GTK_GESTURE_SINGLE(gesture), 3);
-      controller = GTK_EVENT_CONTROLLER(gesture);
-      g_signal_connect(controller, "released",
+
+      g_signal_connect(pnode->right, "released",
                        G_CALLBACK(right_unit_release),
                        GINT_TO_POINTER(punit->id));
-      gtk_widget_add_controller(cmd, controller);
-      pnode->right = controller;
 
       if (city_owner(pdialog->pcity) != client.conn.playing) {
         gtk_widget_set_sensitive(cmd, FALSE);
-- 
2.47.3

