From 364e52f7d9825fc5d65c7f11730f8f8183086a2b Mon Sep 17 00:00:00 2001 From: deepend-tildeclub Date: Sat, 21 Mar 2026 03:28:38 -0600 Subject: [PATCH] Fix Win tray hidden-state toggle logic --- src/fe-gtk/maingui.c | 33 ++++++++++++++++++++++++++++++--- src/fe-gtk/plugin-tray.c | 29 ++++++++++++++++++++++------- 2 files changed, 52 insertions(+), 10 deletions(-) diff --git a/src/fe-gtk/maingui.c b/src/fe-gtk/maingui.c index 7b35c5d5..e20a9b81 100644 --- a/src/fe-gtk/maingui.c +++ b/src/fe-gtk/maingui.c @@ -4375,10 +4375,37 @@ mg_win32_filter (GdkXEvent *xevent, GdkEvent *event, gpointer data) { if (strcmp (command, "__WIN32_TASKBAR_TOGGLE__") == 0) { - if (gtk_widget_get_visible (current_sess->gui->window)) - fe_ctrl_gui (current_sess, FE_GUI_ICONIFY, 0); + GtkWidget *widget = current_sess->gui->window; + GdkWindow *gdk_window = NULL; + gboolean hidden = TRUE; + + if (widget) + { + hidden = !gtk_widget_get_visible (widget); + gdk_window = gtk_widget_get_window (widget); + if (!hidden && gdk_window && + (gdk_window_get_state (gdk_window) & GDK_WINDOW_STATE_ICONIFIED)) + hidden = TRUE; + } + + if (hidden) + { + if (widget) + { + gtk_widget_show (widget); + gtk_window_deiconify (GTK_WINDOW (widget)); + gtk_window_present (GTK_WINDOW (widget)); + } + else + fe_ctrl_gui (current_sess, FE_GUI_SHOW, 0); + } else - fe_ctrl_gui (current_sess, FE_GUI_SHOW, 0); + { + if (widget) + gtk_window_iconify (GTK_WINDOW (widget)); + else + fe_ctrl_gui (current_sess, FE_GUI_ICONIFY, 0); + } } else { diff --git a/src/fe-gtk/plugin-tray.c b/src/fe-gtk/plugin-tray.c index 2ba4bae8..c5071c49 100644 --- a/src/fe-gtk/plugin-tray.c +++ b/src/fe-gtk/plugin-tray.c @@ -582,23 +582,33 @@ tray_backend_cleanup (void) tray_backend_active = FALSE; } +static gboolean +tray_window_is_hidden (GtkWidget *widget) +{ + GdkWindow *gdk_win; + + if (!widget || !gtk_widget_get_visible (widget)) + return TRUE; + + gdk_win = gtk_widget_get_window (widget); + if (gdk_win && (gdk_window_get_state (gdk_win) & GDK_WINDOW_STATE_ICONIFIED)) + return TRUE; + + return FALSE; +} + static WinStatus tray_get_window_status (void) { GtkWindow *win; GtkWidget *widget; - GdkWindow *gdk_win; const char *st; win = GTK_WINDOW (zoitechat_get_info (ph, "gtkwin_ptr")); if (win) { widget = GTK_WIDGET (win); - if (!gtk_widget_get_visible (widget)) - return WS_HIDDEN; - - gdk_win = gtk_widget_get_window (widget); - if (gdk_win && (gdk_window_get_state (gdk_win) & GDK_WINDOW_STATE_ICONIFIED)) + if (tray_window_is_hidden (widget)) return WS_HIDDEN; } @@ -853,6 +863,8 @@ tray_toggle_visibility (gboolean force_hide) static int maximized; static int fullscreen; GtkWindow *win; + GtkWidget *widget; + gboolean hidden; if (!tray_backend_active) return FALSE; @@ -868,7 +880,10 @@ tray_toggle_visibility (gboolean force_hide) if (!win) return FALSE; - if (force_hide || gtk_widget_get_visible (GTK_WIDGET (win))) + widget = GTK_WIDGET (win); + hidden = tray_window_is_hidden (widget); + + if (force_hide || !hidden) { if (prefs.hex_gui_tray_away) zoitechat_command (ph, "ALLSERV AWAY");