summaryrefslogtreecommitdiff
path: root/gdk/x11
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/x11
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/x11')
-rw-r--r--gdk/x11/gdkwindow-x11.c11
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);