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.
This commit is contained in:
Chun-wei Fan 2021-07-29 18:35:08 +08:00
parent 2611a996ff
commit 82d9570ed4
2 changed files with 47 additions and 3 deletions

View File

@ -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);
}

View File

@ -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;