[gtk/fix-3728-3799: 5/5] GDK-Win32: Make surface ready for updates
- From: Chun-wei Fan <fanchunwei src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/fix-3728-3799: 5/5] GDK-Win32: Make surface ready for updates
- Date: Fri, 30 Jul 2021 04:04:36 +0000 (UTC)
commit ce20fa7f8938724b5f3642c47027230336c91c32
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 just maximized, made fullscreen or just undergoes 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 | 52 +++++++++++++++++++++++++++++++++++++++++---
gdk/win32/gdksurface-win32.h | 1 +
2 files changed, 50 insertions(+), 3 deletions(-)
---
diff --git a/gdk/win32/gdksurface-win32.c b/gdk/win32/gdksurface-win32.c
index 4c1f7c1a3f..d1d7c1ee29 100644
--- a/gdk/win32/gdksurface-win32.c
+++ b/gdk/win32/gdksurface-win32.c
@@ -656,6 +656,7 @@ _gdk_win32_display_create_surface (GdkDisplay *display,
g_object_unref (frame_clock);
impl->hdc = GetDC (impl->handle);
+ impl->inhibit_configure = TRUE;
return surface;
}
@@ -1097,7 +1098,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);
@@ -4125,6 +4139,8 @@ gdk_win32_surface_maximize (GdkSurface *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);
@@ -4137,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))
@@ -4154,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
@@ -4578,6 +4604,16 @@ _gdk_win32_surface_request_layout (GdkSurface *surface)
&surface->x, &surface->y,
NULL, NULL);
}
+
+ if (!impl->inhibit_configure)
+ impl->force_recompute_size = TRUE;
+ else
+ {
+ if (surface->state & GDK_TOPLEVEL_STATE_FULLSCREEN ||
+ surface->state & GDK_TOPLEVEL_STATE_MAXIMIZED ||
+ impl->snap_state != GDK_WIN32_AEROSNAP_STATE_UNDETERMINED)
+ impl->inhibit_configure = FALSE;
+ }
}
}
@@ -4592,8 +4628,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 6ac1d6a059..d6c5a9bb1f 100644
--- a/gdk/win32/gdksurface-win32.h
+++ b/gdk/win32/gdksurface-win32.h
@@ -342,6 +342,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]