From 3326fba524ab5b81e1b997be2fd4405c00a767eb 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 1b160d8bcc..8d88631af2 100644 --- a/gdk/win32/gdkevents-win32.c +++ b/gdk/win32/gdkevents-win32.c @@ -1939,22 +1939,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.