[gtk/gtk-3-24: 1/2] macOS: fix #2436 raise transient window on focus



commit e278f3890540ad59eaccf32fd90fe49416e1f7f2
Author: Thomas Holder <thomas thomas-holder de>
Date:   Sat Mar 7 14:47:32 2020 +0100

    macOS: fix #2436 raise transient window on focus

 gdk/quartz/gdkwindow-quartz.c | 29 ++++++++++++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)
---
diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c
index 655d0a5535..6f72793a82 100644
--- a/gdk/quartz/gdkwindow-quartz.c
+++ b/gdk/quartz/gdkwindow-quartz.c
@@ -743,15 +743,38 @@ _gdk_quartz_window_find_child (GdkWindow *window,
   return NULL;
 }
 
+/* Raises a transient window.
+ */
+static void
+raise_transient (GdkWindowImplQuartz *impl)
+{
+  /* In quartz the transient-for behavior is implemented by
+   * attaching the transient-for GdkNSWindows to the parent's
+   * GdkNSWindow. Stacking is managed by Quartz and the order
+   * is that of the parent's childWindows array. The only way
+   * to change that order is to remove the child from the
+   * parent and then add it back in.
+   */
+  GdkWindowImplQuartz *parent_impl =
+        GDK_WINDOW_IMPL_QUARTZ (impl->transient_for->impl);
+  [parent_impl->toplevel removeChildWindow:impl->toplevel];
+  [parent_impl->toplevel addChildWindow:impl->toplevel
+                         ordered:NSWindowAbove];
+}
 
 void
 _gdk_quartz_window_did_become_main (GdkWindow *window)
 {
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
+
   main_window_stack = g_slist_remove (main_window_stack, window);
 
   if (window->window_type != GDK_WINDOW_TEMP)
     main_window_stack = g_slist_prepend (main_window_stack, window);
 
+  if (impl->transient_for)
+    raise_transient (impl);
+
   clear_toplevel_order ();
 }
 
@@ -1510,7 +1533,11 @@ gdk_window_quartz_raise (GdkWindow *window)
       GdkWindowImplQuartz *impl;
 
       impl = GDK_WINDOW_IMPL_QUARTZ (window->impl);
-      [impl->toplevel orderFront:impl->toplevel];
+
+      if (impl->transient_for)
+        raise_transient (impl);
+      else
+        [impl->toplevel orderFront:impl->toplevel];
 
       clear_toplevel_order ();
     }


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