From 6a7d2012a5078c4efffefa2649075476bd0db046 Mon Sep 17 00:00:00 2001 From: deepend-tildeclub Date: Sat, 14 Mar 2026 16:44:15 -0600 Subject: [PATCH] fix: guard stale gui sessions; block re-entrant menu toggle sync crash --- src/fe-gtk/menu.c | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/fe-gtk/menu.c b/src/fe-gtk/menu.c index b4f41a4d..211ab79e 100644 --- a/src/fe-gtk/menu.c +++ b/src/fe-gtk/menu.c @@ -926,6 +926,11 @@ menu_setting_foreach (void (*callback) (session *), int id, guint state) while (list) { sess = list->data; + if (!sess || !sess->gui) + { + list = list->next; + continue; + } if (!sess->gui->is_tab || !maindone) { @@ -937,7 +942,18 @@ menu_setting_foreach (void (*callback) (session *), int id, guint state) if (menu_item != NULL) { - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), state); + guint toggled_signal = g_signal_lookup ("toggled", G_OBJECT_TYPE (menu_item)); + + if (toggled_signal != 0) + { + g_signal_handlers_block_matched (menu_item, G_SIGNAL_MATCH_ID, toggled_signal, 0, NULL, NULL, NULL); + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), state); + g_signal_handlers_unblock_matched (menu_item, G_SIGNAL_MATCH_ID, toggled_signal, 0, NULL, NULL, NULL); + } + else + { + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (menu_item), state); + } } } if (callback) @@ -2170,6 +2186,11 @@ menu_foreach_gui (menu_entry *me, void (*callback) (GtkWidget *, menu_entry *, c while (list) { sess = list->data; + if (!sess || !sess->gui) + { + list = list->next; + continue; + } /* do it only once for tab sessions, since they share a GUI */ if (!sess->gui->is_tab || !tabdone) {