[gtk+/gtk-3-22] GDK W32: Correctly report window position in HiDPI mode



commit 8dfce0eacbc8f8ae7360bf99ee5c7232eb5f7d45
Author: Руслан Ижбулатов <lrn1986 gmail com>
Date:   Fri Sep 29 12:50:03 2017 +0000

    GDK W32: Correctly report window position in HiDPI mode
    
    Window position returned by get_frame_extents() should be scaled.
    
    Also take this opportunity to apply the same rounding that X11 backend
    applies.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=788053

 gdk/win32/gdkwindow-win32.c |   25 +++++++++++++++++--------
 1 files changed, 17 insertions(+), 8 deletions(-)
---
diff --git a/gdk/win32/gdkwindow-win32.c b/gdk/win32/gdkwindow-win32.c
index 9a33287..82ece43 100644
--- a/gdk/win32/gdkwindow-win32.c
+++ b/gdk/win32/gdkwindow-win32.c
@@ -2389,16 +2389,25 @@ gdk_win32_window_get_frame_extents (GdkWindow    *window,
   hwnd = GDK_WINDOW_HWND (window);
   API_CALL (GetWindowRect, (hwnd, &r));
 
-  rect->x = r.left + _gdk_offset_x;
-  rect->y = r.top + _gdk_offset_y;
-  rect->width = (r.right - r.left) / impl->window_scale;
-  rect->height = (r.bottom - r.top) / impl->window_scale;
+  /* Initialize to real, unscaled size */
+  rect->x = r.left + _gdk_offset_x * impl->window_scale;
+  rect->y = r.top + _gdk_offset_y * impl->window_scale;
+  rect->width = (r.right - r.left);
+  rect->height = (r.bottom - r.top);
+
+  /* Extend width and height to ensure that they cover the real size when de-scaled,
+   * and replace everyting with scaled values
+   */
+  rect->width = (rect->width + rect->x % impl->window_scale + impl->window_scale - 1) / impl->window_scale;
+  rect->height = (rect->height + rect->y % impl->window_scale + impl->window_scale - 1) / impl->window_scale;
+  rect->x = r.left / impl->window_scale + _gdk_offset_x;
+  rect->y = r.top / impl->window_scale + _gdk_offset_y;
 
   GDK_NOTE (MISC, g_print ("gdk_window_get_frame_extents: %p: %ldx%ld@%+ld%+ld\n",
-                          GDK_WINDOW_HWND (window),
-                          (r.right - r.left) / impl->window_scale,
-         (r.bottom - r.top) / impl->window_scale,
-                          r.left, r.top));
+                           GDK_WINDOW_HWND (window),
+                           rect->width,
+                           rect->height,
+                           rect->x, rect->y));
 }
 
 static gboolean


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