display: Use XInput2 to grab the pointer
As calling XIGrabDevice multiple times will change it, just drop the XChangeActivePointerGrab path and just go down the XIGrabPointer path always. https://bugzilla.gnome.org/show_bug.cgi?id=688779
This commit is contained in:
parent
c90765370d
commit
c1b8e0ac8f
@ -385,7 +385,6 @@ Cursor meta_display_create_x_cursor (MetaDisplay *display,
|
|||||||
void meta_display_set_grab_op_cursor (MetaDisplay *display,
|
void meta_display_set_grab_op_cursor (MetaDisplay *display,
|
||||||
MetaScreen *screen,
|
MetaScreen *screen,
|
||||||
MetaGrabOp op,
|
MetaGrabOp op,
|
||||||
gboolean change_pointer,
|
|
||||||
Window grab_xwindow,
|
Window grab_xwindow,
|
||||||
guint32 timestamp);
|
guint32 timestamp);
|
||||||
|
|
||||||
|
@ -3678,66 +3678,43 @@ void
|
|||||||
meta_display_set_grab_op_cursor (MetaDisplay *display,
|
meta_display_set_grab_op_cursor (MetaDisplay *display,
|
||||||
MetaScreen *screen,
|
MetaScreen *screen,
|
||||||
MetaGrabOp op,
|
MetaGrabOp op,
|
||||||
gboolean change_pointer,
|
|
||||||
Window grab_xwindow,
|
Window grab_xwindow,
|
||||||
guint32 timestamp)
|
guint32 timestamp)
|
||||||
{
|
{
|
||||||
Cursor cursor;
|
Cursor cursor = xcursor_for_op (display, op);
|
||||||
|
unsigned char mask_bits[XIMaskLen (XI_LASTEVENT)] = { 0 };
|
||||||
|
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
|
||||||
|
|
||||||
cursor = xcursor_for_op (display, op);
|
XISetMask (mask.mask, XI_ButtonPress);
|
||||||
|
XISetMask (mask.mask, XI_ButtonRelease);
|
||||||
|
XISetMask (mask.mask, XI_Enter);
|
||||||
|
XISetMask (mask.mask, XI_Leave);
|
||||||
|
XISetMask (mask.mask, XI_Motion);
|
||||||
|
|
||||||
#define GRAB_MASK (PointerMotionMask | \
|
|
||||||
ButtonPressMask | ButtonReleaseMask | \
|
|
||||||
EnterWindowMask | LeaveWindowMask)
|
|
||||||
|
|
||||||
if (change_pointer)
|
|
||||||
{
|
|
||||||
meta_error_trap_push_with_return (display);
|
|
||||||
XChangeActivePointerGrab (display->xdisplay,
|
|
||||||
GRAB_MASK,
|
|
||||||
cursor,
|
|
||||||
timestamp);
|
|
||||||
|
|
||||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
|
||||||
"Changed pointer with XChangeActivePointerGrab()\n");
|
|
||||||
|
|
||||||
if (meta_error_trap_pop_with_return (display) != Success)
|
|
||||||
{
|
|
||||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
|
||||||
"Error trapped from XChangeActivePointerGrab()\n");
|
|
||||||
if (display->grab_have_pointer)
|
|
||||||
display->grab_have_pointer = FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
g_assert (screen != NULL);
|
g_assert (screen != NULL);
|
||||||
|
|
||||||
meta_error_trap_push (display);
|
meta_error_trap_push (display);
|
||||||
if (XGrabPointer (display->xdisplay,
|
if (XIGrabDevice (display->xdisplay,
|
||||||
|
META_VIRTUAL_CORE_POINTER_ID,
|
||||||
grab_xwindow,
|
grab_xwindow,
|
||||||
False,
|
timestamp,
|
||||||
GRAB_MASK,
|
|
||||||
GrabModeAsync, GrabModeAsync,
|
|
||||||
screen->xroot,
|
|
||||||
cursor,
|
cursor,
|
||||||
timestamp) == GrabSuccess)
|
GrabModeAsync, GrabModeAsync,
|
||||||
|
False, /* owner_events */
|
||||||
|
&mask) == Success)
|
||||||
{
|
{
|
||||||
display->grab_have_pointer = TRUE;
|
display->grab_have_pointer = TRUE;
|
||||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||||
"XGrabPointer() returned GrabSuccess time %u\n",
|
"XIGrabDevice() returned GrabSuccess time %u\n",
|
||||||
timestamp);
|
timestamp);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||||
"XGrabPointer() failed time %u\n",
|
"XIGrabDevice() failed time %u\n",
|
||||||
timestamp);
|
timestamp);
|
||||||
}
|
}
|
||||||
meta_error_trap_pop (display);
|
meta_error_trap_pop (display);
|
||||||
}
|
|
||||||
|
|
||||||
#undef GRAB_MASK
|
|
||||||
|
|
||||||
if (cursor != None)
|
if (cursor != None)
|
||||||
XFreeCursor (display->xdisplay, cursor);
|
XFreeCursor (display->xdisplay, cursor);
|
||||||
@ -3812,13 +3789,12 @@ meta_display_begin_grab_op (MetaDisplay *display,
|
|||||||
if (pointer_already_grabbed)
|
if (pointer_already_grabbed)
|
||||||
display->grab_have_pointer = TRUE;
|
display->grab_have_pointer = TRUE;
|
||||||
|
|
||||||
meta_display_set_grab_op_cursor (display, screen, op, FALSE, grab_xwindow,
|
meta_display_set_grab_op_cursor (display, screen, op, grab_xwindow, timestamp);
|
||||||
timestamp);
|
|
||||||
|
|
||||||
if (!display->grab_have_pointer && !grab_op_is_keyboard (op))
|
if (!display->grab_have_pointer && !grab_op_is_keyboard (op))
|
||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||||
"XGrabPointer() failed\n");
|
"XIGrabDevice() failed\n");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3837,7 +3813,7 @@ meta_display_begin_grab_op (MetaDisplay *display,
|
|||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||||
"grabbing all keys failed, ungrabbing pointer\n");
|
"grabbing all keys failed, ungrabbing pointer\n");
|
||||||
XUngrabPointer (display->xdisplay, timestamp);
|
XIUngrabDevice (display->xdisplay, META_VIRTUAL_CORE_POINTER_ID, timestamp);
|
||||||
display->grab_have_pointer = FALSE;
|
display->grab_have_pointer = FALSE;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@ -4037,7 +4013,7 @@ meta_display_end_grab_op (MetaDisplay *display,
|
|||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||||
"Ungrabbing pointer with timestamp %u\n", timestamp);
|
"Ungrabbing pointer with timestamp %u\n", timestamp);
|
||||||
XUngrabPointer (display->xdisplay, timestamp);
|
XIUngrabDevice (display->xdisplay, META_VIRTUAL_CORE_POINTER_ID, timestamp);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (display->grab_have_keyboard)
|
if (display->grab_have_keyboard)
|
||||||
|
@ -9867,9 +9867,8 @@ meta_window_update_keyboard_resize (MetaWindow *window,
|
|||||||
if (update_cursor)
|
if (update_cursor)
|
||||||
{
|
{
|
||||||
meta_display_set_grab_op_cursor (window->display,
|
meta_display_set_grab_op_cursor (window->display,
|
||||||
NULL,
|
window->screen,
|
||||||
window->display->grab_op,
|
window->display->grab_op,
|
||||||
TRUE,
|
|
||||||
window->display->grab_xwindow,
|
window->display->grab_xwindow,
|
||||||
window->display->grab_timestamp);
|
window->display->grab_timestamp);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user