[gtk/gtk-3-24] [GdkQuartz] Set the toplevel for the pointer if it's NULL.



commit 5c039a1aa0b682c5edf63af4b5228538e1b74b98
Author: John Ralls <jralls ceridwen us>
Date:   Mon Mar 18 12:57:53 2019 -0700

    [GdkQuartz] Set the toplevel for the pointer if it's NULL.
    
    Gdk sometimes misses crossing events on popups, so the cached toplevel
    may be NULL. If it is, find the toplevel under the pointer and set it.
    
    Fixes https://gitlab.gnome.org/GNOME/gtk/issues/623

 gdk/quartz/gdkevents-quartz.c | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)
---
diff --git a/gdk/quartz/gdkevents-quartz.c b/gdk/quartz/gdkevents-quartz.c
index 83c1232b83..efb6961fa7 100644
--- a/gdk/quartz/gdkevents-quartz.c
+++ b/gdk/quartz/gdkevents-quartz.c
@@ -608,11 +608,16 @@ find_toplevel_under_pointer (GdkDisplay *display,
 
   info = _gdk_display_get_pointer_info (display, gdk_seat_get_pointer (seat));
   toplevel = info->toplevel_under_pointer;
-  if (toplevel && WINDOW_IS_TOPLEVEL (toplevel))
-    get_window_point_from_screen_point (toplevel, screen_point, x, y);
-
+  if (!(toplevel && WINDOW_IS_TOPLEVEL (toplevel)))
+    {
+      gint gdk_x = 0, gdk_y = 0;
+      _gdk_quartz_window_nspoint_to_gdk_xy (screen_point, &gdk_x, &gdk_y);
+      toplevel = _gdk_quartz_window_find_child (_gdk_root, gdk_x, gdk_y, TRUE);
+      info->toplevel_under_pointer = g_object_ref (toplevel);
+    }
   if (toplevel)
     {
+      get_window_point_from_screen_point (toplevel, screen_point, x, y);
       /* If the coordinates are out of window bounds, this toplevel is not
        * under the pointer and we thus return NULL. This can occur when
        * toplevel under pointer has not yet been updated due to a very recent


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