From 82d9570ed4fba0f8e61b968fb9d2abd88a4807b1 Mon Sep 17 00:00:00 2001 From: Chun-wei Fan Date: Thu, 29 Jul 2021 18:35:08 +0800 Subject: [PATCH] GDK-Win32: Make surface ready for updates Make the toplevel surface respond to size computations unless it is just being created, or maximized, made fullscreen or underwent 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 | 49 +++++++++++++++++++++++++++++++++--- gdk/win32/gdksurface-win32.h | 1 + 2 files changed, 47 insertions(+), 3 deletions(-) diff --git a/gdk/win32/gdksurface-win32.c b/gdk/win32/gdksurface-win32.c index 6cfe38f679..4a5aa254f1 100644 --- a/gdk/win32/gdksurface-win32.c +++ b/gdk/win32/gdksurface-win32.c @@ -652,6 +652,7 @@ _gdk_win32_display_create_surface (GdkDisplay *display, g_object_unref (frame_clock); impl->hdc = GetDC (impl->handle); + impl->inhibit_configure = TRUE; return surface; } @@ -1077,7 +1078,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 @@ -2522,6 +2524,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 @@ -3417,6 +3425,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); @@ -3465,6 +3474,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 || @@ -3479,6 +3489,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); @@ -3645,6 +3656,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); @@ -4084,6 +4098,8 @@ gdk_win32_surface_minimize (GdkSurface *window) static void gdk_win32_surface_maximize (GdkSurface *window) { + GdkWin32Surface *impl; + g_return_if_fail (GDK_IS_SURFACE (window)); if (GDK_SURFACE_DESTROYED (window)) @@ -4093,6 +4109,10 @@ gdk_win32_surface_maximize (GdkSurface *window) GDK_SURFACE_HWND (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); else @@ -4104,6 +4124,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)) @@ -4121,6 +4143,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 @@ -4545,6 +4575,9 @@ _gdk_win32_surface_request_layout (GdkSurface *surface) &surface->x, &surface->y, NULL, NULL); } + + if (!impl->inhibit_configure) + impl->force_recompute_size = TRUE; } } @@ -4559,8 +4592,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 be3fe4a74a..08bd0a20b7 100644 --- a/gdk/win32/gdksurface-win32.h +++ b/gdk/win32/gdksurface-win32.h @@ -337,6 +337,7 @@ struct _GdkWin32Surface int configured_height; RECT configured_rect; } next_layout; + gboolean force_recompute_size; #ifdef HAVE_EGL guint egl_force_redraw_all : 1;