diff options
author | Christian Hergert <christian@hergert.me> | 2022-03-11 18:07:34 -0800 |
---|---|---|
committer | Christian Hergert <christian@hergert.me> | 2022-03-11 18:07:34 -0800 |
commit | bd0c68f641c1d7dad7edcdd8af463afd1131c980 (patch) | |
tree | 65063849fcf0ccb680f9f0fef6c0c627aed954a1 | |
parent | c3a7d79154e590fb0435888cef45b90c42d6e202 (diff) | |
download | gtk+-bd0c68f641c1d7dad7edcdd8af463afd1131c980.tar.gz |
macos: dont steal key window from NSPanel
Or we risk making it really difficult to use native file choosers.
-rw-r--r-- | gdk/macos/gdkmacosdisplay-private.h | 5 | ||||
-rw-r--r-- | gdk/macos/gdkmacosdisplay.c | 9 |
2 files changed, 14 insertions, 0 deletions
diff --git a/gdk/macos/gdkmacosdisplay-private.h b/gdk/macos/gdkmacosdisplay-private.h index 1edff58d04..83ae435e49 100644 --- a/gdk/macos/gdkmacosdisplay-private.h +++ b/gdk/macos/gdkmacosdisplay-private.h @@ -87,6 +87,11 @@ struct _GdkMacosDisplay /* A GSource to select a new main/key window */ guint select_key_in_idle; + + /* Note if we have a key window that is not a GdkMacosWindow + * such as a NSPanel used for native dialogs. + */ + guint key_window_is_foregin : 1; }; struct _GdkMacosDisplayClass diff --git a/gdk/macos/gdkmacosdisplay.c b/gdk/macos/gdkmacosdisplay.c index 6c51ef901e..d85a744563 100644 --- a/gdk/macos/gdkmacosdisplay.c +++ b/gdk/macos/gdkmacosdisplay.c @@ -422,6 +422,10 @@ select_key_in_idle_cb (gpointer data) self->select_key_in_idle = 0; + /* Don't steal focus from NSPanel, etc */ + if (self->key_window_is_foregin) + return G_SOURCE_REMOVE; + if (self->keyboard_surface == NULL) { const GList *surfaces = _gdk_macos_display_get_surfaces (self); @@ -960,11 +964,16 @@ _gdk_macos_display_get_surfaces (GdkMacosDisplay *self) NSArray *array = [NSApp orderedWindows]; GQueue sorted = G_QUEUE_INIT; + self->key_window_is_foregin = FALSE; + for (id obj in array) { NSWindow *nswindow = (NSWindow *)obj; GdkMacosSurface *surface; + if ([nswindow isKeyWindow]) + self->key_window_is_foregin = !GDK_IS_MACOS_WINDOW (nswindow); + if (!GDK_IS_MACOS_WINDOW (nswindow)) continue; |