[gtk/fix-aerosnap-4] GDK-Win32: Fix AeroSnap indicator and positioning




commit 6a5949f6279f1ac07528005b4390db5ddcc91e6b
Author: Chun-wei Fan <fanchunwei src gnome org>
Date:   Tue Jul 6 17:15:39 2021 +0800

    GDK-Win32: Fix AeroSnap indicator and positioning
    
    Ensure that we take the DPI scaling into account so that surfaces will
    be placed at their correct positions upon an AeroSnap operation on HiDPI
    displays.
    
    Also, use the X coordinate of the surface as-is during snap up so that
    we do not inadvertently move the surface to the very left.  Also fix the
    AeroSnap indicator drawing for snap up so that it is drawn at the
    correct places.
    
    Since we are updating these functions, make the old GdkWindow-era
    variable names to match better the names we use nowadays.

 gdk/win32/gdksurface-win32.c | 48 +++++++++++++++++++-------------------------
 1 file changed, 21 insertions(+), 27 deletions(-)
---
diff --git a/gdk/win32/gdksurface-win32.c b/gdk/win32/gdksurface-win32.c
index 4c1f7c1a3f..fcfab1dd23 100644
--- a/gdk/win32/gdksurface-win32.c
+++ b/gdk/win32/gdksurface-win32.c
@@ -2288,95 +2288,87 @@ stash_window (GdkSurface          *window,
 }
 
 static void
-snap_up (GdkSurface *window)
+snap_up (GdkSurface *surface)
 {
   SHORT maxysize;
   int x, y;
   int width, height;
   GdkWin32Surface *impl;
 
-  impl = GDK_WIN32_SURFACE (window);
+  impl = GDK_WIN32_SURFACE (surface);
 
   impl->snap_state = GDK_WIN32_AEROSNAP_STATE_FULLUP;
 
-  stash_window (window, impl);
+  stash_window (surface, impl);
 
   maxysize = GetSystemMetrics (SM_CYVIRTUALSCREEN) / impl->surface_scale;
   x = y = 0;
-  width = gdk_surface_get_width (window);
+  width = gdk_surface_get_width (surface);
 
   y = 0;
   height = maxysize;
 
-  x = x - impl->shadow.left;
-  y = y - impl->shadow.top;
+  x = surface->x - impl->shadow.left / impl->surface_scale;
+  y = y - impl->shadow.top / impl->surface_scale;
   width += impl->shadow_x;
   height += impl->shadow_y;
 
-  /* XXX: FIXME, AeroSnap snap_up() not really working well,
-   *
-   *    * The snap_up() puts the window at the top left corner.
-   *    * Without the following call, the height maximizes but we see a spew of
-   *      "GdkToplevelSize: geometry size (x,y) exceeds bounds" warnings
-   */
-  compute_toplevel_size (window, TRUE, &width, &height);
-
-  gdk_win32_surface_move_resize (window, x, y, width, height);
+  gdk_win32_surface_move_resize (surface, x, y, width, height);
 }
 
 static void
-snap_left (GdkSurface  *window,
+snap_left (GdkSurface *surface,
            GdkMonitor *monitor,
            GdkMonitor *snap_monitor)
 {
   GdkRectangle rect;
   GdkWin32Surface *impl;
 
-  impl = GDK_WIN32_SURFACE (window);
+  impl = GDK_WIN32_SURFACE (surface);
 
   impl->snap_state = GDK_WIN32_AEROSNAP_STATE_HALFLEFT;
 
   gdk_win32_monitor_get_workarea (snap_monitor, &rect);
 
-  stash_window (window, impl);
+  stash_window (surface, impl);
 
   rect.width = rect.width / 2;
 
-  rect.x = rect.x - impl->shadow.left;
-  rect.y = rect.y - impl->shadow.top;
+  rect.x = rect.x - impl->shadow.left / impl->surface_scale;
+  rect.y = rect.y - impl->shadow.top / impl->surface_scale;
   rect.width = rect.width + impl->shadow_x;
   rect.height = rect.height + impl->shadow_y;
 
-  gdk_win32_surface_move_resize (window,
+  gdk_win32_surface_move_resize (surface,
                                  rect.x, rect.y,
                                  rect.width, rect.height);
 }
 
 static void
-snap_right (GdkSurface  *window,
+snap_right (GdkSurface *surface,
             GdkMonitor *monitor,
             GdkMonitor *snap_monitor)
 {
   GdkRectangle rect;
   GdkWin32Surface *impl;
 
-  impl = GDK_WIN32_SURFACE (window);
+  impl = GDK_WIN32_SURFACE (surface);
 
   impl->snap_state = GDK_WIN32_AEROSNAP_STATE_HALFRIGHT;
 
   gdk_win32_monitor_get_workarea (snap_monitor, &rect);
 
-  stash_window (window, impl);
+  stash_window (surface, impl);
 
   rect.width = rect.width / 2;
   rect.x += rect.width;
 
-  rect.x = rect.x - impl->shadow.left;
-  rect.y = rect.y - impl->shadow.top;
+  rect.x = rect.x - impl->shadow.left / impl->surface_scale;
+  rect.y = rect.y - impl->shadow.top / impl->surface_scale;
   rect.width = rect.width + impl->shadow_x;
   rect.height = rect.height + impl->shadow_y;
 
-  gdk_win32_surface_move_resize (window,
+  gdk_win32_surface_move_resize (surface,
                                  rect.x, rect.y,
                                  rect.width, rect.height);
 }
@@ -3007,6 +2999,7 @@ update_fullup_indicator (GdkSurface                   *window,
   to.height = gdk_surface_get_height (window);
 
   to.y = 0;
+  to.x = window->x;
   to.height = maxysize;
   from = context->indicator_target;
 
@@ -3159,6 +3152,7 @@ start_indicator (GdkSurface                   *window,
       end_size.height = workarea.height;
       break;
     case GDK_WIN32_AEROSNAP_STATE_FULLUP:
+      start_size.x = end_size.x = window->x;
       end_size.y = 0;
       end_size.height = maxysize;
       break;


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