macos: avoid size/origin changes when possible
authorChristian Hergert <christian@hergert.me>
Mon, 28 Feb 2022 21:09:57 +0000 (13:09 -0800)
committerChristian Hergert <christian@hergert.me>
Mon, 28 Feb 2022 21:09:57 +0000 (13:09 -0800)
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.

gdk/macos/gdkmacossurface.c

index 4cd99948003aa656eca1c6a8fcdcc87ba589dca6..cb900a73289aa969ecd4a5e7e2103473a33e3ef6 100644 (file)
@@ -963,13 +963,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);
@@ -990,7 +994,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];
 }