[gtk/wip.win32.fixes] Gdk/Win32: Fix resizing surfaces



commit f370fa88c47e2ef5a1c75f33f48f42454c6a6e58
Author: Chun-wei Fan <fanchunwei src gnome org>
Date:   Tue Feb 2 17:30:55 2021 +0800

    Gdk/Win32: Fix resizing surfaces
    
    This attempts to fix the counter-intuitive resizing of surfaces in GTK4 where
    the surface grows or shrinks at the right and/or bottom edge when the window
    resized from the top and/or left edge(s).
    
    This is not yet perfect as the window stutters upon resizing from the top
    and/or left edges, but at least makes resizing more intuitive.

 gdk/win32/gdksurface-win32.c | 58 +++++++++++++++++++++++++-------------------
 gdk/win32/gdksurface-win32.h |  1 +
 2 files changed, 34 insertions(+), 25 deletions(-)
---
diff --git a/gdk/win32/gdksurface-win32.c b/gdk/win32/gdksurface-win32.c
index b9ec79e9ed..c690fed206 100644
--- a/gdk/win32/gdksurface-win32.c
+++ b/gdk/win32/gdksurface-win32.c
@@ -1633,42 +1633,48 @@ gdk_win32_surface_get_geometry (GdkSurface *window,
       RECT rect;
       GdkWin32Surface *impl = GDK_WIN32_SURFACE (window);
 
-      API_CALL (GetClientRect, (GDK_SURFACE_HWND (window), &rect));
-
-         POINT pt;
+      if (GDK_IS_TOPLEVEL (window) && impl->drag_move_resize_context.native_move_resize_pending)
+         rect = impl->next_layout.configured_rect;
+      else
+        {
+          POINT pt;
           GdkSurface *parent;
-         
+
           if (GDK_IS_TOPLEVEL (window))
             parent = NULL;
           else if (GDK_IS_POPUP (window))
             parent = gdk_popup_get_parent (GDK_POPUP (window));
           else
             parent = NULL;
-         
 
-         pt.x = rect.left;
-         pt.y = rect.top;
-         ClientToScreen (GDK_SURFACE_HWND (window), &pt);
-          if (parent)
-           ScreenToClient (GDK_SURFACE_HWND (parent), &pt);
-         rect.left = pt.x;
-         rect.top = pt.y;
+          API_CALL (GetClientRect, (GDK_SURFACE_HWND (window), &rect));
 
-         pt.x = rect.right;
-         pt.y = rect.bottom;
-         ClientToScreen (GDK_SURFACE_HWND (window), &pt);
+          pt.x = rect.left;
+          pt.y = rect.top;
+             ClientToScreen (GDK_SURFACE_HWND (window), &pt);
           if (parent)
-           ScreenToClient (GDK_SURFACE_HWND (parent), &pt);
-         rect.right = pt.x;
-         rect.bottom = pt.y;
+            ScreenToClient (GDK_SURFACE_HWND (parent), &pt);
 
-         if (parent == NULL)
-           {
-             rect.left += _gdk_offset_x * impl->surface_scale;
-             rect.top += _gdk_offset_y * impl->surface_scale;
-             rect.right += _gdk_offset_x * impl->surface_scale;
-             rect.bottom += _gdk_offset_y * impl->surface_scale;
-           }
+          rect.left = pt.x;
+          rect.top = pt.y;
+
+          pt.x = rect.right;
+          pt.y = rect.bottom;
+          ClientToScreen (GDK_SURFACE_HWND (window), &pt);
+          if (parent)
+            ScreenToClient (GDK_SURFACE_HWND (parent), &pt);
+
+          rect.right = pt.x;
+          rect.bottom = pt.y;
+
+             if (parent == NULL)
+               {
+                 rect.left += _gdk_offset_x * impl->surface_scale;
+                 rect.top += _gdk_offset_y * impl->surface_scale;
+                 rect.right += _gdk_offset_x * impl->surface_scale;
+                 rect.bottom += _gdk_offset_y * impl->surface_scale;
+               }
+        }
 
       if (x)
        *x = rect.left / impl->surface_scale;
@@ -3947,6 +3953,8 @@ gdk_win32_surface_do_move_resize_drag (GdkSurface *window,
 
           impl->unscaled_width = new_rect.right - new_rect.left;
           impl->unscaled_height = new_rect.bottom - new_rect.top;
+
+          impl->next_layout.configured_rect = new_rect;
           impl->next_layout.configured_width = (impl->unscaled_width + scale - 1) / scale;
           impl->next_layout.configured_height = (impl->unscaled_height + scale - 1) / scale;
         }
diff --git a/gdk/win32/gdksurface-win32.h b/gdk/win32/gdksurface-win32.h
index 7c937cd0fc..6be358338b 100644
--- a/gdk/win32/gdksurface-win32.h
+++ b/gdk/win32/gdksurface-win32.h
@@ -342,6 +342,7 @@ struct _GdkWin32Surface
   struct {
     int configured_width;
     int configured_height;
+    RECT configured_rect;
   } next_layout;
 
 #ifdef GDK_WIN32_ENABLE_EGL


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