gdk/x11: Make XInput2 a mandatory runtime dependency for x11

Besides requiring it at build time, require that the server the client
is running against exposes the XInput2 protocol. We no longer fallback
on a device manager for core events.
This commit is contained in:
Carlos Garnacho
2019-05-15 00:04:13 +02:00
parent c4446d36de
commit 33642e2255
2 changed files with 41 additions and 98 deletions

View File

@@ -63,11 +63,7 @@ _gdk_x11_device_manager_new (GdkDisplay *display)
}
}
GDK_DISPLAY_NOTE (display, INPUT, g_message ("Creating core device manager"));
return g_object_new (GDK_TYPE_X11_DEVICE_MANAGER_CORE,
"display", display,
NULL);
g_error ("XInput2 support not found on display");
}
/**
@@ -84,26 +80,10 @@ GdkDevice *
gdk_x11_device_manager_lookup (GdkX11DeviceManagerCore *device_manager,
gint device_id)
{
GdkDevice *device = NULL;
g_return_val_if_fail (GDK_IS_X11_DEVICE_MANAGER_XI2 (device_manager), NULL);
g_return_val_if_fail (GDK_IS_X11_DEVICE_MANAGER_CORE (device_manager), NULL);
if (GDK_IS_X11_DEVICE_MANAGER_XI2 (device_manager))
device = _gdk_x11_device_manager_xi2_lookup (GDK_X11_DEVICE_MANAGER_XI2 (device_manager),
device_id);
else if (GDK_IS_X11_DEVICE_MANAGER_CORE (device_manager))
{
/* It is a core/xi1 device manager, we only map
* IDs 2 and 3, matching XI2's Virtual Core Pointer
* and Keyboard.
*/
if (device_id == VIRTUAL_CORE_POINTER_ID)
device = GDK_X11_DEVICE_MANAGER_CORE (device_manager)->core_pointer;
else if (device_id == VIRTUAL_CORE_KEYBOARD_ID)
device = GDK_X11_DEVICE_MANAGER_CORE (device_manager)->core_keyboard;
}
return device;
return _gdk_x11_device_manager_xi2_lookup (GDK_X11_DEVICE_MANAGER_XI2 (device_manager),
device_id);
}
/**
@@ -117,19 +97,7 @@ gdk_x11_device_manager_lookup (GdkX11DeviceManagerCore *device_manager,
gint
gdk_x11_device_get_id (GdkDevice *device)
{
gint device_id = 0;
g_return_val_if_fail (GDK_IS_DEVICE (device), 0);
if (GDK_IS_X11_DEVICE_XI2 (device))
device_id = _gdk_x11_device_xi2_get_id (GDK_X11_DEVICE_XI2 (device));
else if (GDK_IS_X11_DEVICE_CORE (device))
{
if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
device_id = VIRTUAL_CORE_KEYBOARD_ID;
else
device_id = VIRTUAL_CORE_POINTER_ID;
}
return device_id;
return _gdk_x11_device_xi2_get_id (GDK_X11_DEVICE_XI2 (device));
}

View File

@@ -1925,7 +1925,6 @@ static gboolean
drag_grab (GdkDrag *drag)
{
GdkX11Drag *x11_drag = GDK_X11_DRAG (drag);
GdkDevice *device = gdk_drag_get_device (drag);
GdkSeatCapabilities capabilities;
GdkDisplay *display;
Window root;
@@ -1940,10 +1939,7 @@ drag_grab (GdkDrag *drag)
root = GDK_DISPLAY_XROOTWIN (display);
seat = gdk_device_get_seat (gdk_drag_get_device (drag));
if (GDK_IS_X11_DEVICE_XI2 (device))
capabilities = GDK_SEAT_CAPABILITY_ALL_POINTING;
else
capabilities = GDK_SEAT_CAPABILITY_ALL;
capabilities = GDK_SEAT_CAPABILITY_ALL_POINTING;
cursor = gdk_drag_get_cursor (drag, x11_drag->current_action);
g_set_object (&x11_drag->cursor, cursor);
@@ -1959,50 +1955,38 @@ drag_grab (GdkDrag *drag)
for (i = 0; i < G_N_ELEMENTS (grab_keys); ++i)
{
gint deviceid = gdk_x11_device_get_id (gdk_seat_get_keyboard (seat));
unsigned char mask[XIMaskLen(XI_LASTEVENT)];
XIGrabModifiers mods;
XIEventMask evmask;
gint num_mods;
keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (display),
grab_keys[i].keysym);
if (keycode == NoSymbol)
continue;
if (GDK_IS_X11_DEVICE_XI2 (device))
{
gint deviceid = gdk_x11_device_get_id (gdk_seat_get_keyboard (seat));
unsigned char mask[XIMaskLen(XI_LASTEVENT)];
XIGrabModifiers mods;
XIEventMask evmask;
gint num_mods;
memset (mask, 0, sizeof (mask));
XISetMask (mask, XI_KeyPress);
XISetMask (mask, XI_KeyRelease);
memset (mask, 0, sizeof (mask));
XISetMask (mask, XI_KeyPress);
XISetMask (mask, XI_KeyRelease);
evmask.deviceid = deviceid;
evmask.mask_len = sizeof (mask);
evmask.mask = mask;
evmask.deviceid = deviceid;
evmask.mask_len = sizeof (mask);
evmask.mask = mask;
num_mods = 1;
mods.modifiers = grab_keys[i].modifiers;
num_mods = 1;
mods.modifiers = grab_keys[i].modifiers;
XIGrabKeycode (GDK_DISPLAY_XDISPLAY (display),
deviceid,
keycode,
root,
GrabModeAsync,
GrabModeAsync,
False,
&evmask,
num_mods,
&mods);
}
else
{
XGrabKey (GDK_DISPLAY_XDISPLAY (display),
keycode, grab_keys[i].modifiers,
root,
FALSE,
GrabModeAsync,
GrabModeAsync);
}
XIGrabKeycode (GDK_DISPLAY_XDISPLAY (display),
deviceid,
keycode,
root,
GrabModeAsync,
GrabModeAsync,
False,
&evmask,
num_mods,
&mods);
}
gdk_x11_display_error_trap_pop_ignored (display);
@@ -2031,32 +2015,23 @@ drag_ungrab (GdkDrag *drag)
for (i = 0; i < G_N_ELEMENTS (grab_keys); ++i)
{
XIGrabModifiers mods;
gint num_mods;
keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (display),
grab_keys[i].keysym);
if (keycode == NoSymbol)
continue;
if (GDK_IS_X11_DEVICE_XI2 (keyboard))
{
XIGrabModifiers mods;
gint num_mods;
num_mods = 1;
mods.modifiers = grab_keys[i].modifiers;
num_mods = 1;
mods.modifiers = grab_keys[i].modifiers;
XIUngrabKeycode (GDK_DISPLAY_XDISPLAY (display),
gdk_x11_device_get_id (keyboard),
keycode,
root,
num_mods,
&mods);
}
else
{
XUngrabKey (GDK_DISPLAY_XDISPLAY (display),
keycode, grab_keys[i].modifiers,
root);
}
XIUngrabKeycode (GDK_DISPLAY_XDISPLAY (display),
gdk_x11_device_get_id (keyboard),
keycode,
root,
num_mods,
&mods);
}
}