macos: restore key window after hiding popup
authorChristian Hergert <christian@hergert.me>
Thu, 17 Feb 2022 02:26:59 +0000 (18:26 -0800)
committerChristian Hergert <christian@hergert.me>
Tue, 22 Feb 2022 20:01:29 +0000 (12:01 -0800)
This fixes the focus returning to the parent window after the popup has
been hidden in the form of being a "Key Window" in macOS.

gdk/macos/gdkmacossurface.c

index cc7bbd9b9b572bf549c7a5b51d878b56ee7ad136..5404d1e3b878902c73eab2ad140d96b6b1e09f5b 100644 (file)
@@ -133,6 +133,7 @@ gdk_macos_surface_hide (GdkSurface *surface)
   GdkMacosSurface *self = (GdkMacosSurface *)surface;
   GdkSeat *seat;
   gboolean was_mapped;
+  gboolean was_key;
 
   g_assert (GDK_IS_MACOS_SURFACE (self));
 
@@ -141,6 +142,7 @@ gdk_macos_surface_hide (GdkSurface *surface)
   _gdk_macos_display_remove_frame_callback (GDK_MACOS_DISPLAY (surface->display), self);
 
   was_mapped = GDK_SURFACE_IS_MAPPED (GDK_SURFACE (self));
+  was_key = [self->window isKeyWindow];
 
   seat = gdk_display_get_default_seat (surface->display);
   gdk_seat_ungrab (seat);
@@ -151,6 +153,17 @@ gdk_macos_surface_hide (GdkSurface *surface)
 
   g_clear_object (&self->buffer);
 
+  if (was_key)
+    {
+      /* Return key input to the parent window if necessary */
+      if (surface->parent != NULL && GDK_SURFACE_IS_MAPPED (surface->parent))
+        {
+          GdkMacosWindow *parentWindow = GDK_MACOS_SURFACE (surface->parent)->window;
+
+          [parentWindow showAndMakeKey:YES];
+        }
+    }
+
   if (was_mapped)
     gdk_surface_freeze_updates (GDK_SURFACE (self));
 }