diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index 7ee0048b9e..cb9d72a9ae 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -539,16 +539,15 @@ gdk_window_real_window_get_pointer (GdkDisplay *display, GdkModifierType *mask) { GdkWindowObject *private; - GdkWindow *pointer_window; gint tmpx, tmpy; GdkModifierType tmp_mask; + gboolean normal_child; private = (GdkWindowObject *) window; - _gdk_windowing_window_get_pointer (display, - window, - &tmpx, &tmpy, - mask); + normal_child = GDK_WINDOW_IMPL_GET_IFACE (private->impl)->get_pointer (window, + &tmpx, &tmpy, + &tmp_mask); /* We got the coords on the impl, conver to the window */ tmpx -= private->abs_x; tmpy -= private->abs_y; @@ -557,8 +556,12 @@ gdk_window_real_window_get_pointer (GdkDisplay *display, *x = tmpx; if (y) *y = tmpy; + if (mask) + *mask = tmp_mask; - return _gdk_window_find_child_at (window, x, y); + if (normal_child) + return _gdk_window_find_child_at (window, tmpx, tmpy); + return NULL; } /** @@ -853,9 +856,8 @@ synthesize_crossing_events (GdkDisplay *display, src_toplevel == dest_toplevel) { /* Same toplevels */ - _gdk_windowing_window_get_pointer (display, - dest_toplevel, - &x, &y, &state); + gdk_window_get_pointer (dest_toplevel, + &x, &y, &state); _gdk_syntesize_crossing_events (display, src_window, dest_window, @@ -867,9 +869,8 @@ synthesize_crossing_events (GdkDisplay *display, } else if (dest_toplevel == NULL) { - _gdk_windowing_window_get_pointer (display, - src_toplevel, - &x, &y, &state); + gdk_window_get_pointer (src_toplevel, + &x, &y, &state); _gdk_syntesize_crossing_events (display, src_window, NULL, @@ -882,9 +883,8 @@ synthesize_crossing_events (GdkDisplay *display, else { /* Different toplevels */ - _gdk_windowing_window_get_pointer (display, - src_toplevel, - &x, &y, &state); + gdk_window_get_pointer (src_toplevel, + &x, &y, &state); _gdk_syntesize_crossing_events (display, src_window, NULL, @@ -893,9 +893,8 @@ synthesize_crossing_events (GdkDisplay *display, time, NULL, serial); - _gdk_windowing_window_get_pointer (display, - dest_toplevel, - &x, &y, &state); + gdk_window_get_pointer (dest_toplevel, + &x, &y, &state); _gdk_syntesize_crossing_events (display, NULL, dest_window, diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index f1124a3a7f..f8b5990a71 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -448,11 +448,6 @@ void _gdk_windowing_get_pointer (GdkDisplay *display, gint *x, gint *y, GdkModifierType *mask); -GdkWindow* _gdk_windowing_window_get_pointer (GdkDisplay *display, - GdkWindow *window, - gint *x, - gint *y, - GdkModifierType *mask); GdkWindow* _gdk_windowing_window_at_pointer (GdkDisplay *display, gint *win_x, gint *win_y, diff --git a/gdk/gdkoffscreenwindow.c b/gdk/gdkoffscreenwindow.c index efdfcd93f3..c68f72a1c2 100644 --- a/gdk/gdkoffscreenwindow.c +++ b/gdk/gdkoffscreenwindow.c @@ -698,6 +698,21 @@ gdk_offscreen_window_get_origin (GdkWindow *window, return TRUE; } +static gboolean +gdk_offscreen_window_get_pointer (GdkWindow *window, + gint *x, + gint *y, + GdkModifierType *mask) +{ + *x = 0; + *y = 0; + *mask = 0; + + /* TODO: Implement this by signal emission */ + + return TRUE; +} + /** * gdk_window_get_offscreen_pixmap: * @window: a #GdkWindow @@ -1079,6 +1094,7 @@ gdk_offscreen_window_impl_iface_init (GdkWindowImplIface *iface) iface->queue_antiexpose = gdk_offscreen_window_queue_antiexpose; iface->queue_translation = gdk_offscreen_window_queue_translation; iface->get_origin = gdk_offscreen_window_get_origin; + iface->get_pointer = gdk_offscreen_window_get_pointer; iface->destroy = gdk_offscreen_window_destroy; } diff --git a/gdk/gdkwindowimpl.h b/gdk/gdkwindowimpl.h index 1bedb35899..7babfea9c1 100644 --- a/gdk/gdkwindowimpl.h +++ b/gdk/gdkwindowimpl.h @@ -86,6 +86,10 @@ struct _GdkWindowImplIface gint (* get_deskrelative_origin) (GdkWindow *window, gint *x, gint *y); + gboolean (* get_pointer) (GdkWindow *window, + gint *x, + gint *y, + GdkModifierType *mask); void (* shape_combine_region) (GdkWindow *window, const GdkRegion *shape_region, diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index 6bbc1b1099..95138439ed 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -3087,14 +3087,14 @@ _gdk_windowing_get_pointer (GdkDisplay *display, *mask = xmask; } -GdkWindow* -_gdk_windowing_window_get_pointer (GdkDisplay *display, - GdkWindow *window, - gint *x, - gint *y, - GdkModifierType *mask) +static gboolean +gdk_window_x11_get_pointer (GdkWindow *window, + gint *x, + gint *y, + GdkModifierType *mask) { - GdkWindow *return_val; + GdkDisplay *display = GDK_WINDOW_DISPLAY (window); + gboolean return_val; Window root; Window child; int rootx, rooty; @@ -3102,37 +3102,38 @@ _gdk_windowing_window_get_pointer (GdkDisplay *display, int winy = 0; unsigned int xmask = 0; - g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL); + g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), FALSE); + - return_val = NULL; - if (!GDK_WINDOW_DESTROYED (window)) + return_val = TRUE; + if (!GDK_WINDOW_DESTROYED (window)) { - if (G_LIKELY (GDK_DISPLAY_X11 (display)->trusted_client)) + if (G_LIKELY (GDK_DISPLAY_X11 (display)->trusted_client)) { if (XQueryPointer (GDK_WINDOW_XDISPLAY (window), GDK_WINDOW_XID (window), &root, &child, &rootx, &rooty, &winx, &winy, &xmask)) { if (child) - return_val = gdk_window_lookup_for_display (GDK_WINDOW_DISPLAY (window), child); + return_val = gdk_window_lookup_for_display (GDK_WINDOW_DISPLAY (window), child) != NULL; } - } - else + } + else { GdkScreen *screen; int originx, originy; - _gdk_windowing_get_pointer (gdk_drawable_get_display (window), &screen, + _gdk_windowing_get_pointer (gdk_drawable_get_display (window), &screen, &rootx, &rooty, &xmask); gdk_window_get_origin (window, &originx, &originy); winx = rootx - originx; winy = rooty - originy; } } - + *x = winx; *y = winy; *mask = xmask; - + return return_val; } @@ -5575,6 +5576,7 @@ gdk_window_impl_iface_init (GdkWindowImplIface *iface) iface->set_cursor = gdk_window_x11_set_cursor; iface->get_geometry = gdk_window_x11_get_geometry; iface->get_origin = gdk_window_x11_get_origin; + iface->get_pointer = gdk_window_x11_get_pointer; iface->get_deskrelative_origin = gdk_window_x11_get_deskrelative_origin; iface->shape_combine_region = gdk_window_x11_shape_combine_region; iface->input_shape_combine_region = gdk_window_x11_input_shape_combine_region;