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 5a94c15540
commit f5fe714c65
2 changed files with 43 additions and 3 deletions

View File

@@ -654,6 +654,7 @@ _gdk_win32_display_create_surface (GdkDisplay *display,
g_object_unref (frame_clock);
impl->hdc = GetDC (impl->handle);
impl->inhibit_configure = TRUE;
return surface;
}
@@ -1095,7 +1096,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
@@ -2552,6 +2554,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
@@ -3447,6 +3455,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);
@@ -3495,6 +3504,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 ||
@@ -3509,6 +3519,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);
@@ -3679,6 +3690,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);
@@ -4136,6 +4150,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);
@@ -4148,6 +4164,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))
@@ -4165,6 +4183,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
@@ -4589,6 +4615,9 @@ _gdk_win32_surface_request_layout (GdkSurface *surface)
&surface->x, &surface->y,
NULL, NULL);
}
if (!impl->inhibit_configure)
impl->force_recompute_size = TRUE;
}
}
@@ -4603,8 +4632,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

@@ -338,6 +338,7 @@ struct _GdkWin32Surface
int configured_height;
RECT configured_rect;
} next_layout;
gboolean force_recompute_size;
#ifdef GDK_WIN32_ENABLE_EGL
EGLSurface egl_surface;