XIButtonState button_state = { 0 };
XIModifierState mod_state;
XIGroupState group_state;
+ Bool retval;
display = gdk_device_get_display (device);
screen = gdk_display_get_default_screen (display);
+ gdk_x11_display_error_trap_push (display);
+
/* This function really only works if the mouse pointer is held still
* during its operation. If it moves from one leaf window to another
* than we'll end up with inaccurate values for win_x, win_y
/* Free previous button mask, if any */
g_free (button_state.mask);
- gdk_x11_display_error_trap_push (display);
- XIQueryPointer (xdisplay,
- device_xi2->device_id,
- xwindow,
- &root, &child,
- &xroot_x, &xroot_y,
- &xwin_x, &xwin_y,
- &button_state,
- &mod_state,
- &group_state);
- if (gdk_x11_display_error_trap_pop (display))
+ retval = XIQueryPointer (xdisplay,
+ device_xi2->device_id,
+ xwindow,
+ &root, &child,
+ &xroot_x, &xroot_y,
+ &xwin_x, &xwin_y,
+ &button_state,
+ &mod_state,
+ &group_state);
+ if (!retval)
continue;
+
if (child != None)
{
pointer_window = child;
last = xwindow;
free (button_state.mask);
- gdk_x11_display_error_trap_push (display);
- XIQueryPointer (xdisplay,
- device_xi2->device_id,
- xwindow,
- &root, &xwindow,
- &xroot_x, &xroot_y,
- &xwin_x, &xwin_y,
- &button_state,
- &mod_state,
- &group_state);
- if (gdk_x11_display_error_trap_pop (display))
+ retval = XIQueryPointer (xdisplay,
+ device_xi2->device_id,
+ xwindow,
+ &root, &xwindow,
+ &xroot_x, &xroot_y,
+ &xwin_x, &xwin_y,
+ &button_state,
+ &mod_state,
+ &group_state);
+ if (!retval)
break;
if (get_toplevel && last != root &&
gdk_x11_display_ungrab (display);
- window = gdk_x11_window_lookup_for_display (display, last);
- impl = NULL;
- if (window)
- impl = GDK_WINDOW_IMPL_X11 (window->impl);
+ if (gdk_x11_display_error_trap_pop (display) == 0)
+ {
+ window = gdk_x11_window_lookup_for_display (display, last);
+ impl = NULL;
+ if (window)
+ impl = GDK_WINDOW_IMPL_X11 (window->impl);
+
+ if (mask)
+ *mask = _gdk_x11_device_xi2_translate_state (&mod_state, &button_state, &group_state);
+
+ free (button_state.mask);
+ }
+ else
+ {
+ window = NULL;
+
+ if (mask)
+ *mask = 0;
+ }
if (win_x)
*win_x = (window) ? (xwin_x / impl->window_scale) : -1;
if (win_y)
*win_y = (window) ? (xwin_y / impl->window_scale) : -1;
- if (mask)
- *mask = _gdk_x11_device_xi2_translate_state (&mod_state, &button_state, &group_state);
-
- free (button_state.mask);
return window;
}