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.
This commit is contained in:
Chun-wei Fan
2021-02-02 17:30:55 +08:00
parent 652b892fc1
commit 39e136e9b7
2 changed files with 33 additions and 24 deletions

View File

@@ -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);
API_CALL (GetClientRect, (GDK_SURFACE_HWND (window), &rect));
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;
ScreenToClient (GDK_SURFACE_HWND (parent), &pt);
pt.x = rect.right;
pt.y = rect.bottom;
ClientToScreen (GDK_SURFACE_HWND (window), &pt);
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;
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.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;
}

View File

@@ -342,6 +342,7 @@ struct _GdkWin32Surface
struct {
int configured_width;
int configured_height;
RECT configured_rect;
} next_layout;
#ifdef GDK_WIN32_ENABLE_EGL