From e1240b42edb89da49a89b58f05bfd443ef5e1505 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A0=D1=83=D1=81=D0=BB=D0=B0=D0=BD=20=D0=98=D0=B6=D0=B1?= =?UTF-8?q?=D1=83=D0=BB=D0=B0=D1=82=D0=BE=D0=B2?= Date: Sun, 25 Dec 2016 17:48:20 +0000 Subject: [PATCH] GDK W32: Change WM_SYSMENU style switch logic Instead of checking for window state and giving it extra styles that fit, just give it all styles that it is missing. It turned out that otherwise it is impossible to, for example, restore a maximized window via sysmenu. Also, be more flexible towards GDK/WM window state mismatches and consider the window minimized/maximized if *either* GDK or WM thinks so. https://bugzilla.gnome.org/show_bug.cgi?id=776485 --- gdk/win32/gdkevents-win32.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c index e35c384762..a84774e066 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -1977,22 +1977,28 @@ handle_wm_sysmenu (GdkWindow *window, MSG *msg, gint *ret_valp) style = GetWindowLongPtr (msg->hwnd, GWL_STYLE); - maximized = IsZoomed (msg->hwnd); - minimized = IsIconic (msg->hwnd); + maximized = IsZoomed (msg->hwnd) || (style & WS_MAXIMIZE); + minimized = IsIconic (msg->hwnd) || (style & WS_MINIMIZE); additional_styles = 0; if (!(style & WS_SYSMENU)) additional_styles |= WS_SYSMENU; - if (!maximized && !(style & WS_MAXIMIZEBOX)) + if (!(style & WS_MAXIMIZEBOX)) additional_styles |= WS_MAXIMIZEBOX; - if (!minimized && !(style & WS_MINIMIZEBOX)) + if (!(style & WS_MINIMIZEBOX)) additional_styles |= WS_MINIMIZEBOX; - if (!minimized && !maximized && !(style & WS_SIZEBOX)) + if (!(style & WS_SIZEBOX)) additional_styles |= WS_SIZEBOX; + if (!(style & WS_DLGFRAME)) + additional_styles |= WS_DLGFRAME; + + if (!(style & WS_BORDER)) + additional_styles |= WS_BORDER; + if (additional_styles == 0) /* The caller will eventually pass this to DefWindowProc (), * only without the style dance, which isn't needed, as it turns out.