[gtk/wip/chergert/for-main] macos: dont steal key window from NSPanel



commit bd0c68f641c1d7dad7edcdd8af463afd1131c980
Author: Christian Hergert <christian hergert me>
Date:   Fri Mar 11 18:07:34 2022 -0800

    macos: dont steal key window from NSPanel
    
    Or we risk making it really difficult to use native file choosers.

 gdk/macos/gdkmacosdisplay-private.h | 5 +++++
 gdk/macos/gdkmacosdisplay.c         | 9 +++++++++
 2 files changed, 14 insertions(+)
---
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;
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]