diff options
author | Alexander Larsson <alexl@redhat.com> | 2009-09-28 15:21:54 +0200 |
---|---|---|
committer | Alexander Larsson <alexl@redhat.com> | 2009-09-28 15:21:54 +0200 |
commit | 5ebb32d1ffa23241d562fb4d5be02bc6f156b515 (patch) | |
tree | 7e55ae158bcbb35019c5f6e999f2ef20c8600f8e /gdk/quartz | |
parent | fe188a18f324f4545af857436a6060e676a1287d (diff) | |
download | gtk+-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.c | 23 |
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; } |