XfwmDevices * xfwm_devices_new (GdkDisplay *display) { XfwmDevices *devices; #ifdef HAVE_XI2 GdkSeat *seat; GdkDevice *pointer_device; GdkDevice *keyboard_device; gint firstevent, firsterror; #endif devices = g_new0 (XfwmDevices, 1); devices->xi2_available = FALSE; devices->xi2_opcode = 0; devices->pointer.keyboard = FALSE; devices->pointer.xi2_device = None; devices->keyboard.keyboard = TRUE; devices->keyboard.xi2_device = None; #ifdef HAVE_XI2 seat = gdk_display_get_default_seat (display); pointer_device = gdk_seat_get_pointer (seat); keyboard_device = gdk_seat_get_keyboard (seat); if (GDK_IS_X11_DEVICE_XI2 (pointer_device) || GDK_IS_X11_DEVICE_XI2 (keyboard_device)) { /* GDK uses XI2, let's use it too */ /* Obtain XI2 opcode */ if (XQueryExtension (gdk_x11_display_get_xdisplay (display), "XInputExtension", &devices->xi2_opcode, &firstevent, &firsterror)) { devices->xi2_available = TRUE; devices->pointer.xi2_device = gdk_x11_device_get_id (pointer_device); devices->keyboard.xi2_device = gdk_x11_device_get_id (keyboard_device); } } #endif return devices; }
/** * gdk_x11_device_get_id: * @device: (type GdkX11DeviceCore): a #GdkDevice * * Returns the device ID as seen by XInput2. * * > If gdk_disable_multidevice() has been called, this function * > will respectively return 2/3 for the core pointer and keyboard, * > (matching the IDs for the Virtual Core Pointer and Keyboard in * > XInput 2), but calling this function on any slave devices (i.e. * > those managed via XInput 1.x), will return 0. * * Returns: the XInput2 device ID. * * Since: 3.2 **/ gint gdk_x11_device_get_id (GdkDevice *device) { gint device_id = 0; g_return_val_if_fail (GDK_IS_DEVICE (device), 0); #ifdef XINPUT_2 if (GDK_IS_X11_DEVICE_XI2 (device)) device_id = _gdk_x11_device_xi2_get_id (GDK_X11_DEVICE_XI2 (device)); else #endif /* XINPUT_2 */ 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; }