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/x11 | |
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/x11')
-rw-r--r-- | gdk/x11/gdkwindow-x11.c | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index 257dba7ef6..f98290b6a2 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -3215,7 +3215,8 @@ GdkWindow* _gdk_windowing_window_at_pointer (GdkDisplay *display, gint *win_x, gint *win_y, - GdkModifierType *mask) + GdkModifierType *mask, + gboolean get_toplevel) { GdkWindow *window; GdkScreen *screen; @@ -3251,6 +3252,10 @@ _gdk_windowing_window_at_pointer (GdkDisplay *display, while (xwindow) { xwindow_last = xwindow; + if (get_toplevel && + (window = gdk_window_lookup_for_display (display, xwindow)) != NULL && + GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN) + break; XQueryPointer (xdisplay, xwindow, &root, &xwindow, &rootx, &rooty, &winx, &winy, &xmask); } @@ -3310,6 +3315,10 @@ _gdk_windowing_window_at_pointer (GdkDisplay *display, while (xwindow) { xwindow_last = xwindow; + if (get_toplevel && + (window = gdk_window_lookup_for_display (display, xwindow)) != NULL && + GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN) + break; gdk_error_trap_push (); XQueryPointer (xdisplay, xwindow, &root, &xwindow, &rootx, &rooty, &winx, &winy, &xmask); |