[gtk/master.win32: 114/114] gdksurface-win32.c: Fix display of CSD windows




commit 52ba70d549fab82f6910be4e9f72b62567b06d32
Author: Chun-wei Fan <fanchunwei src gnome org>
Date:   Tue Sep 15 15:37:32 2020 +0800

    gdksurface-win32.c: Fix display of CSD windows
    
    Since the changes to GDK to use surface subtypes, CSD windows were
    broken because we did not set the window styles properly.  Fix this by
    first acquiring whether decorations are used by the GtkWindow, and based
    on that result we set the decorations that we want to use accordingly
    and so apply them.
    
    Thanks to Matt Jakeman for investigating into the issue and providing
    pointers to a proposed fix.
    
    Fixes issue #3157, besides the part where window sizes are not correct
    since that is likely caused a separate issue.

 gdk/win32/gdksurface-win32.c | 20 +++++++++-----------
 gdk/win32/gdksurface-win32.h |  4 ++--
 2 files changed, 11 insertions(+), 13 deletions(-)
---
diff --git a/gdk/win32/gdksurface-win32.c b/gdk/win32/gdksurface-win32.c
index 05bd6a8974..69b71baf13 100644
--- a/gdk/win32/gdksurface-win32.c
+++ b/gdk/win32/gdksurface-win32.c
@@ -193,8 +193,6 @@ gdk_surface_win32_finalize (GObject *object)
       surface->hicon_small = NULL;
     }
 
-  g_free (surface->decorations);
-
   if (surface->cache_surface)
     {
       cairo_surface_destroy (surface->cache_surface);
@@ -1381,9 +1379,11 @@ get_effective_window_decorations (GdkSurface       *window,
   *decoration = 0;
 
   if (!GDK_IS_TOPLEVEL (window))
-    {
-      return FALSE;
-    }
+    return FALSE;
+
+  /* we want to apply the "no decorations", if decorations are disabled */
+  if (!GDK_WIN32_SURFACE (window)->decorate_all)
+    return TRUE;
 
   if ((impl->hint_flags & GDK_HINT_MIN_SIZE) &&
       (impl->hint_flags & GDK_HINT_MAX_SIZE) &&
@@ -1779,8 +1779,7 @@ _gdk_win32_surface_lacks_wm_decorations (GdkSurface *window)
    * even though GdkWMDecoration docs indicate that 0 does NOT mean
    * "no decorations".
    */
-  if (impl->decorations &&
-      *impl->decorations == 0)
+  if (!impl->decorate_all)
     return TRUE;
 
   if (GDK_SURFACE_HWND (window) == 0)
@@ -1880,6 +1879,7 @@ _gdk_win32_surface_update_style_bits (GdkSurface *window)
   if (get_effective_window_decorations (window, &decorations))
     {
       all = (decorations & GDK_DECOR_ALL);
+
       /* Keep this in sync with the test in _gdk_win32_surface_lacks_wm_decorations() */
       update_single_bit (&new_style, all, decorations & GDK_DECOR_BORDER, WS_BORDER);
       update_single_bit (&new_style, all, decorations & GDK_DECOR_RESIZEH, WS_THICKFRAME);
@@ -4829,6 +4829,7 @@ gdk_win32_toplevel_set_property (GObject      *object,
       break;
 
     case LAST_PROP + GDK_TOPLEVEL_PROP_DECORATED:
+      GDK_WIN32_SURFACE (surface)->decorate_all = g_value_get_boolean (value);
       _gdk_win32_surface_update_style_bits (surface);
       g_object_notify_by_pspec (G_OBJECT (surface), pspec);
       break;
@@ -4882,10 +4883,7 @@ gdk_win32_toplevel_get_property (GObject    *object,
       break;
 
     case LAST_PROP + GDK_TOPLEVEL_PROP_DECORATED:
-      {
-        GdkWMDecoration decorations = GDK_DECOR_ALL;
-        g_value_set_boolean (value, get_effective_window_decorations (surface, &decorations));
-      }
+      g_value_set_boolean (value, GDK_WIN32_SURFACE (surface)->decorate_all);
       break;
 
     case LAST_PROP + GDK_TOPLEVEL_PROP_DELETABLE:
diff --git a/gdk/win32/gdksurface-win32.h b/gdk/win32/gdksurface-win32.h
index 603401f856..5f45eb7662 100644
--- a/gdk/win32/gdksurface-win32.h
+++ b/gdk/win32/gdksurface-win32.h
@@ -337,8 +337,8 @@ struct _GdkWin32Surface
   /* Also remember the same position, but in absolute form. */
   GdkRectangle *snap_stash_int;
 
-  /* Decorations set by gdk_surface_set_decorations() or NULL if unset */
-  GdkWMDecoration* decorations;
+  /* Enable all decorations? */
+  gboolean decorate_all;
 
   /* No. of windows to force layered windows off */
   guint suppress_layered;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]