macos: avoid size/origin changes when possible

If _gdk_macos_surface_move_resize() was called with various -1 parameters
we really want to avoid changing anything even if we think we know what
the value might be. Otherwise, we risk messing up in-flight operations that
we have not yet been notified of yet.

This improves the chances we place windows in an appropriate location as
they don't et screwed up before window-manager placement.
This commit is contained in:
Christian Hergert 2022-02-28 13:09:57 -08:00 committed by Christian Hergert
parent 17b40ca148
commit c7a6d1e8bf

View File

@ -937,13 +937,17 @@ _gdk_macos_surface_move_resize (GdkMacosSurface *self,
GdkDisplay *display;
NSRect content_rect;
NSRect frame_rect;
gboolean ignore_move;
gboolean ignore_size;
g_return_if_fail (GDK_IS_MACOS_SURFACE (self));
if ((x == -1 || (x == self->root_x)) &&
(y == -1 || (y == self->root_y)) &&
(width == -1 || (width == surface->width)) &&
(height == -1 || (height == surface->height)))
ignore_move = (x == -1 || (x == self->root_x)) &&
(y == -1 || (y == self->root_y));
ignore_size = (width == -1 || (width == surface->width)) &&
(height == -1 || (height == surface->height));
if (ignore_move && ignore_size)
return;
display = gdk_surface_get_display (surface);
@ -964,7 +968,14 @@ _gdk_macos_surface_move_resize (GdkMacosSurface *self,
x, y + height,
&x, &y);
content_rect = NSMakeRect (x, y, width, height);
content_rect = [self->window contentRectForFrameRect:[self->window frame]];
if (!ignore_move)
content_rect.origin = NSMakePoint (x, y);
if (!ignore_size)
content_rect.size = NSMakeSize (width, height);
frame_rect = [self->window frameRectForContentRect:content_rect];
[self->window setFrame:frame_rect display:YES];
}