summaryrefslogtreecommitdiff
path: root/gdk/quartz
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2009-09-28 15:21:54 +0200
committerAlexander Larsson <alexl@redhat.com>2009-09-28 15:21:54 +0200
commit5ebb32d1ffa23241d562fb4d5be02bc6f156b515 (patch)
tree7e55ae158bcbb35019c5f6e999f2ef20c8600f8e /gdk/quartz
parentfe188a18f324f4545af857436a6060e676a1287d (diff)
downloadgtk+-5ebb32d1ffa23241d562fb4d5be02bc6f156b515.tar.gz
Extend _gdk_windowing_window_at_pointer to be able to get toplevels only
This has two advantages: 1) In many backends, this is faster as we can terminate the window hierarchy traversal earlier 2) When used in gdkdisplay.c::get_current_toplevel() to get the current toplevel that has the pointer we now correctly return a toplevel with the pointer in it where the pointer is inside some foreign subwindow of a toplevel window. The second advantage fixes some bugs in client side event generation when the pointer is inside such a foreign child window.
Diffstat (limited to 'gdk/quartz')
-rw-r--r--gdk/quartz/gdkwindow-quartz.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c
index ac22d5f313..4764498340 100644
--- a/gdk/quartz/gdkwindow-quartz.c
+++ b/gdk/quartz/gdkwindow-quartz.c
@@ -1938,7 +1938,8 @@ GdkWindow *
_gdk_windowing_window_at_pointer (GdkDisplay *display,
gint *win_x,
gint *win_y,
- GdkModifierType *mask)
+ GdkModifierType *mask,
+ gboolean get_toplevel)
{
GdkWindow *found_window;
gint x, y;
@@ -1976,6 +1977,26 @@ _gdk_windowing_window_at_pointer (GdkDisplay *display,
if (mask)
*mask = tmp_mask;
+ if (get_toplevel)
+ {
+ GdkWindowObject *w = (GdkWindowObject *)found_window;
+ /* Requested toplevel, find it. */
+ /* TODO: This can be implemented more efficient by never
+ recursing into children in the first place */
+ if (w)
+ {
+ /* Convert to toplevel */
+ while (w->parent != NULL &&
+ w->parent->window_type != GDK_WINDOW_ROOT)
+ {
+ *win_x += w->x;
+ *win_y += w->y;
+ w = w->parent;
+ }
+ found_window = (GdkWindow *)w;
+ }
+ }
+
return found_window;
}