GDK W32: Change WM_SYSMENU style switch logic
authorРуслан Ижбулатов <lrn1986@gmail.com>
Sun, 25 Dec 2016 17:48:20 +0000 (17:48 +0000)
committerРуслан Ижбулатов <lrn1986@gmail.com>
Mon, 9 Jan 2017 14:17:32 +0000 (14:17 +0000)
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

index 1b160d8bccc09f0a00d95f1ce67aff479d9e1116..8d88631af2366d9d8cfcf7e1d49593520cebe798 100644 (file)
@@ -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.