Handle Win32 WM_SYSCOMMAND minimize/restore workaround

This commit is contained in:
2026-04-01 23:45:51 -06:00
parent 51e9ac15df
commit 7c8c33db47

View File

@@ -4431,7 +4431,7 @@ mg_create_topwindow (session *sess)
#ifdef G_OS_WIN32 #ifdef G_OS_WIN32
parent_win = gtk_widget_get_window (win); parent_win = gtk_widget_get_window (win);
gdk_window_add_filter (parent_win, mg_win32_filter, NULL); gdk_window_add_filter (parent_win, mg_win32_filter, win);
#endif #endif
} }
@@ -4464,6 +4464,8 @@ static GdkFilterReturn
mg_win32_filter (GdkXEvent *xevent, GdkEvent *event, gpointer data) mg_win32_filter (GdkXEvent *xevent, GdkEvent *event, gpointer data)
{ {
MSG *msg = (MSG*)xevent; MSG *msg = (MSG*)xevent;
GtkWidget *win = GTK_IS_WIDGET (data) ? GTK_WIDGET (data) : NULL;
static gboolean handling_syscommand = FALSE;
if (!msg) if (!msg)
return GDK_FILTER_CONTINUE; return GDK_FILTER_CONTINUE;
@@ -4480,6 +4482,30 @@ mg_win32_filter (GdkXEvent *xevent, GdkEvent *event, gpointer data)
return GDK_FILTER_CONTINUE; return GDK_FILTER_CONTINUE;
} }
if (msg->message == WM_SYSCOMMAND && win && !handling_syscommand)
{
const UINT command = ((UINT) msg->wParam) & 0xFFF0u;
if (command == SC_MINIMIZE || command == SC_RESTORE)
{
handling_syscommand = TRUE;
if (command == SC_MINIMIZE)
{
ShowWindow (msg->hwnd, SW_MINIMIZE);
}
else
{
ShowWindow (msg->hwnd, SW_RESTORE);
ShowWindow (msg->hwnd, SW_SHOW);
SetForegroundWindow (msg->hwnd);
}
handling_syscommand = FALSE;
return GDK_FILTER_REMOVE;
}
}
if (msg->message == WM_COPYDATA) if (msg->message == WM_COPYDATA)
{ {
COPYDATASTRUCT *copy_data = (COPYDATASTRUCT *)msg->lParam; COPYDATASTRUCT *copy_data = (COPYDATASTRUCT *)msg->lParam;
@@ -4609,7 +4635,7 @@ mg_create_tabwindow (session *sess)
#ifdef G_OS_WIN32 #ifdef G_OS_WIN32
parent_win = gtk_widget_get_window (win); parent_win = gtk_widget_get_window (win);
gdk_window_add_filter (parent_win, mg_win32_filter, NULL); gdk_window_add_filter (parent_win, mg_win32_filter, win);
#endif #endif
} }