From 14a1ac0dfb920cbe5f747b886e9c0fa1393c2768 Mon Sep 17 00:00:00 2001 From: deepend-tildeclub Date: Thu, 12 Mar 2026 18:51:07 -0600 Subject: [PATCH 1/3] fix: keep tray hide/restore label synced to real window state --- src/fe-gtk/plugin-tray.c | 64 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 60 insertions(+), 4 deletions(-) diff --git a/src/fe-gtk/plugin-tray.c b/src/fe-gtk/plugin-tray.c index e42aa201..d928a447 100644 --- a/src/fe-gtk/plugin-tray.c +++ b/src/fe-gtk/plugin-tray.c @@ -122,6 +122,9 @@ static void tray_init (void); static void tray_set_icon_state (TrayIcon icon, TrayIconState state); static void tray_menu_restore_cb (GtkWidget *item, gpointer userdata); static void tray_menu_notify_cb (GObject *tray, GParamSpec *pspec, gpointer user_data); +static void tray_update_toggle_item_label (void); +static gboolean tray_window_state_cb (GtkWidget *widget, GdkEventWindowState *event, gpointer userdata); +static void tray_window_visibility_cb (GtkWidget *widget, gpointer userdata); #if HAVE_APPINDICATOR_BACKEND static void tray_menu_show_cb (GtkWidget *menu, gpointer userdata) G_GNUC_UNUSED; #endif @@ -165,6 +168,7 @@ static int tray_pub_count = 0; static int tray_hilight_count = 0; static int tray_file_count = 0; static int tray_restore_timer = 0; +static GtkWidget *tray_toggle_item = NULL; #if HAVE_APPINDICATOR_BACKEND static TrayCustomIcon @@ -890,6 +894,8 @@ tray_toggle_visibility (gboolean force_hide) gtk_window_present (win); } + tray_update_toggle_item_label (); + return TRUE; } @@ -1083,10 +1089,8 @@ tray_menu_populate (GtkWidget *menu) /* ph may have an invalid context now */ zoitechat_set_context (ph, zoitechat_find_context (ph, NULL, NULL)); - if (tray_get_window_status () == WS_HIDDEN) - tray_make_item (menu, _("_Restore Window"), tray_menu_restore_cb, NULL); - else - tray_make_item (menu, _("_Hide Window"), tray_menu_restore_cb, NULL); + tray_toggle_item = tray_make_item (menu, _("_Hide Window"), tray_menu_restore_cb, NULL); + tray_update_toggle_item_label (); tray_make_item (menu, NULL, tray_menu_quit_cb, NULL); #ifndef WIN32 /* submenus are buggy on win32 */ @@ -1128,6 +1132,45 @@ tray_menu_clear (GtkWidget *menu) for (iter = children; iter; iter = iter->next) gtk_widget_destroy (GTK_WIDGET (iter->data)); g_list_free (children); + tray_toggle_item = NULL; +} + +static void +tray_update_toggle_item_label (void) +{ + const char *label; + + if (!tray_toggle_item) + return; + + if (tray_get_window_status () == WS_HIDDEN) + label = _("_Restore Window"); + else + label = _("_Hide Window"); + + gtk_menu_item_set_label (GTK_MENU_ITEM (tray_toggle_item), label); + gtk_menu_item_set_use_underline (GTK_MENU_ITEM (tray_toggle_item), TRUE); +} + +static gboolean +tray_window_state_cb (GtkWidget *widget, GdkEventWindowState *event, gpointer userdata) +{ + (void)widget; + (void)event; + (void)userdata; + + tray_update_toggle_item_label (); + + return FALSE; +} + +static void +tray_window_visibility_cb (GtkWidget *widget, gpointer userdata) +{ + (void)widget; + (void)userdata; + + tray_update_toggle_item_label (); } static void G_GNUC_UNUSED @@ -1381,6 +1424,19 @@ tray_plugin_init (zoitechat_plugin *plugin_handle, char **plugin_name, zoitechat_hook_print (ph, "Focus Window", -1, tray_focus_cb, NULL); GtkWindow *window = GTK_WINDOW(zoitechat_get_info (ph, "gtkwin_ptr")); + GtkWidget *window_widget; + + if (window) + { + window_widget = GTK_WIDGET (window); + g_signal_connect (G_OBJECT (window_widget), "window-state-event", + G_CALLBACK (tray_window_state_cb), NULL); + g_signal_connect (G_OBJECT (window_widget), "show", + G_CALLBACK (tray_window_visibility_cb), NULL); + g_signal_connect (G_OBJECT (window_widget), "hide", + G_CALLBACK (tray_window_visibility_cb), NULL); + } + if (prefs.hex_gui_tray && gtkutil_tray_icon_supported (window)) tray_init (); From 44431d2c103b427bdd0d9906952dbd2b5bb6391b Mon Sep 17 00:00:00 2001 From: deepend-tildeclub Date: Thu, 12 Mar 2026 19:13:26 -0600 Subject: [PATCH 2/3] fix: unnest tray cb guards so Windows callbacks actually get defined --- src/fe-gtk/plugin-tray.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/fe-gtk/plugin-tray.c b/src/fe-gtk/plugin-tray.c index d928a447..b5472c17 100644 --- a/src/fe-gtk/plugin-tray.c +++ b/src/fe-gtk/plugin-tray.c @@ -1152,6 +1152,19 @@ tray_update_toggle_item_label (void) gtk_menu_item_set_use_underline (GTK_MENU_ITEM (tray_toggle_item), TRUE); } +#if !defined(WIN32) +static void G_GNUC_UNUSED +tray_menu_show_cb (GtkWidget *menu, gpointer userdata) +{ + (void)userdata; + + tray_menu_clear (menu); + tray_menu_populate (menu); +} +#endif + +#endif + static gboolean tray_window_state_cb (GtkWidget *widget, GdkEventWindowState *event, gpointer userdata) { @@ -1173,16 +1186,6 @@ tray_window_visibility_cb (GtkWidget *widget, gpointer userdata) tray_update_toggle_item_label (); } -static void G_GNUC_UNUSED -tray_menu_show_cb (GtkWidget *menu, gpointer userdata) -{ - (void)userdata; - - tray_menu_clear (menu); - tray_menu_populate (menu); -} -#endif - #if !HAVE_APPINDICATOR_BACKEND static void tray_menu_cb (GtkWidget *widget, guint button, guint time, gpointer userdata) From 4cebe2ac8b5d043876677b654007ce3a934dfb33 Mon Sep 17 00:00:00 2001 From: deepend-tildeclub Date: Thu, 12 Mar 2026 19:34:17 -0600 Subject: [PATCH 3/3] fix: expose shared tray label updater on Windows; keep non-win tray bits guarded --- src/fe-gtk/plugin-tray.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/fe-gtk/plugin-tray.c b/src/fe-gtk/plugin-tray.c index b5472c17..dbc0653d 100644 --- a/src/fe-gtk/plugin-tray.c +++ b/src/fe-gtk/plugin-tray.c @@ -1134,6 +1134,7 @@ tray_menu_clear (GtkWidget *menu) g_list_free (children); tray_toggle_item = NULL; } +#endif static void tray_update_toggle_item_label (void) @@ -1163,8 +1164,6 @@ tray_menu_show_cb (GtkWidget *menu, gpointer userdata) } #endif -#endif - static gboolean tray_window_state_cb (GtkWidget *widget, GdkEventWindowState *event, gpointer userdata) {