[gtk/fix-3728-3799: 793/794] GDK-Win32: Make surface ready for updates




commit 02ea9f7d95702e5ff0effd07a52a04978faea633
Author: Chun-wei Fan <fanchunwei src gnome org>
Date:   Thu Jul 29 18:35:08 2021 +0800

    GDK-Win32: Make surface ready for updates
    
    Make the toplevel surface respond to size computations unless it is just being
    created, or maximized, made fullscreen or underwent an AeroSnap operation.
    
    This will ensure that the surface size is properly computed in time, so that
    surfaces can be resized as needed.
    
    This will fix issues 3728 and 3799.

 gdk/win32/gdksurface-win32.c | 49 +++++++++++++++++++++++++++++++++++++++++---
 gdk/win32/gdksurface-win32.h |  1 +
 2 files changed, 47 insertions(+), 3 deletions(-)
---
diff --git a/gdk/win32/gdksurface-win32.c b/gdk/win32/gdksurface-win32.c
index c26ac5e9f3..898824467a 100644
--- a/gdk/win32/gdksurface-win32.c
+++ b/gdk/win32/gdksurface-win32.c
@@ -660,6 +660,7 @@ _gdk_win32_display_create_surface (GdkDisplay     *display,
 
   g_object_unref (frame_clock);
   impl->hdc = GetDC (impl->handle);
+  impl->inhibit_configure = TRUE;
 
   return surface;
 }
@@ -1101,7 +1102,8 @@ gdk_win32_surface_resize (GdkSurface *window,
                            SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOZORDER));
   window->resize_count += 1;
 
-  gdk_surface_request_layout (window);
+  if (!GDK_WIN32_SURFACE (window)->force_recompute_size)
+    gdk_surface_request_layout (window);
 }
 
 static void
@@ -2543,6 +2545,12 @@ apply_snap (GdkSurface             *window,
       snap_up (window);
       break;
     }
+
+  if (snap != GDK_WIN32_AEROSNAP_STATE_UNDETERMINED)
+    {
+      GDK_WIN32_SURFACE (window)->inhibit_configure = TRUE;
+      GDK_WIN32_SURFACE (window)->force_recompute_size = FALSE;
+    }
 }
 
 /* Registers a dumb window class. This window
@@ -3436,6 +3444,7 @@ setup_drag_move_resize_context (GdkSurface                   *window,
   GdkWin32Surface *impl = GDK_WIN32_SURFACE (window);
   gboolean maximized = gdk_toplevel_get_state (GDK_TOPLEVEL (window)) & GDK_TOPLEVEL_STATE_MAXIMIZED;
   int root_x, root_y;
+  gboolean restore_configure = FALSE;
 
   gdk_win32_surface_get_root_coords (window, x, y, &root_x, &root_y);
 
@@ -3484,6 +3493,7 @@ setup_drag_move_resize_context (GdkSurface                   *window,
        impl->snap_state == GDK_WIN32_AEROSNAP_STATE_FULLUP))
     {
       discard_snapinfo (window);
+      restore_configure = TRUE;
     }
   else if (maximized ||
            (impl->snap_state == GDK_WIN32_AEROSNAP_STATE_HALFRIGHT ||
@@ -3498,6 +3508,7 @@ setup_drag_move_resize_context (GdkSurface                   *window,
       gboolean left_half;
       GdkDisplay *display;
 
+      restore_configure = TRUE;
       display = gdk_surface_get_display (window);
       monitor = gdk_display_get_monitor_at_surface (display, window);
       gdk_surface_get_geometry (window, &wx, &wy, &wwidth, &wheight);
@@ -3668,6 +3679,9 @@ setup_drag_move_resize_context (GdkSurface                   *window,
         }
     }
 
+  if (restore_configure)
+    impl->inhibit_configure = FALSE;
+
   _gdk_win32_get_window_rect (window, &rect);
 
   cursor_name = get_cursor_name_from_op (op, edge);
@@ -4113,6 +4127,8 @@ gdk_win32_surface_minimize (GdkSurface *window)
 static void
 gdk_win32_surface_maximize (GdkSurface *window)
 {
+  GdkWin32Surface *impl;
+
   g_return_if_fail (GDK_IS_SURFACE (window));
 
   if (GDK_SURFACE_DESTROYED (window))
@@ -4122,6 +4138,10 @@ gdk_win32_surface_maximize (GdkSurface *window)
                           GDK_SURFACE_HWND (window),
                           _gdk_win32_surface_state_to_string (window->state)));
 
+  impl = GDK_WIN32_SURFACE (window);
+  impl->inhibit_configure = TRUE;
+  impl->force_recompute_size = FALSE;
+
   if (GDK_SURFACE_IS_MAPPED (window))
     GtkShowWindow (window, SW_MAXIMIZE);
   else
@@ -4133,6 +4153,8 @@ gdk_win32_surface_maximize (GdkSurface *window)
 static void
 gdk_win32_surface_unmaximize (GdkSurface *window)
 {
+  GdkWin32Surface *impl;
+
   g_return_if_fail (GDK_IS_SURFACE (window));
 
   if (GDK_SURFACE_DESTROYED (window))
@@ -4150,6 +4172,14 @@ gdk_win32_surface_unmaximize (GdkSurface *window)
     gdk_synthesize_surface_state (window,
                                 GDK_TOPLEVEL_STATE_MAXIMIZED,
                                 0);
+
+  impl = GDK_WIN32_SURFACE (window);
+
+  if (impl->inhibit_configure)
+    {
+      impl->inhibit_configure = FALSE;
+      impl->force_recompute_size = TRUE;
+    }
 }
 
 static void
@@ -4574,6 +4604,9 @@ _gdk_win32_surface_request_layout (GdkSurface *surface)
                                          &surface->x, &surface->y,
                                           NULL, NULL);
         }
+
+      if (!impl->inhibit_configure)
+        impl->force_recompute_size = TRUE;
     }
 }
 
@@ -4588,8 +4621,18 @@ _gdk_win32_surface_compute_size (GdkSurface *surface)
 
   if (!impl->drag_move_resize_context.native_move_resize_pending)
     {
-      surface->width = impl->next_layout.configured_width;
-      surface->height = impl->next_layout.configured_height;
+      if (GDK_IS_TOPLEVEL (surface) && impl->force_recompute_size)
+        {
+          surface->width = width;
+          surface->height = height;
+          gdk_win32_surface_resize (surface, width, height);
+          impl->force_recompute_size = FALSE;
+        }
+      else
+        {
+          surface->width = impl->next_layout.configured_width;
+          surface->height = impl->next_layout.configured_height;
+        }
 
       _gdk_surface_update_size (surface);
     }
diff --git a/gdk/win32/gdksurface-win32.h b/gdk/win32/gdksurface-win32.h
index 293e58d4fc..53a2fbcefd 100644
--- a/gdk/win32/gdksurface-win32.h
+++ b/gdk/win32/gdksurface-win32.h
@@ -337,6 +337,7 @@ struct _GdkWin32Surface
     int configured_height;
     RECT configured_rect;
   } next_layout;
+  gboolean force_recompute_size;
 
 #ifdef GDK_WIN32_ENABLE_EGL
   EGLSurface egl_surface;


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