Project

General

Profile

Bug #2442 » 0002-Avoid-replacing-the-event-controllers-as-this-can-be.patch

Andrew McGuinness, 11/03/2026 10:51 AM

View differences:

client/gui-gtk-4.0/citydlg.c
} else {
for (i = m; i < n; i++) {
GtkWidget *cmd, *pix;
GtkGesture *gesture;
struct unit_node node;
cmd = gtk_button_new();
......
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);
}
......
pnode = unit_node_vector_get(nodes, i);
if (pnode) {
GtkWidget *cmd, *pix;
GtkGesture *gesture;
GtkEventController *controller;
cmd = pnode->cmd;
pix = pnode->pix;
......
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);
......
} else {
for (i = m; i < n; i++) {
GtkWidget *cmd, *pix;
GtkGesture *gesture;
struct unit_node node;
cmd = gtk_button_new();
......
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);
}
......
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-2/3)