From 5fcfdcb2726637285c256f2b6b8ad75cc619d3a6 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Wed, 10 Jul 2013 16:26:01 -0400 Subject: [PATCH 1/4] backend-x11: Remove bad branch prediction This will only get once, at in Clutter initialization time. https://bugzilla.gnome.org/show_bug.cgi?id=703969 --- clutter/x11/clutter-backend-x11.c | 105 ++++++++++++++++++-------------------- 1 file changed, 51 insertions(+), 54 deletions(-) diff --git a/clutter/x11/clutter-backend-x11.c b/clutter/x11/clutter-backend-x11.c index b7cfcc4..9bbfba8 100644 --- a/clutter/x11/clutter-backend-x11.c +++ b/clutter/x11/clutter-backend-x11.c @@ -222,71 +222,68 @@ clutter_backend_x11_xsettings_notify (const char *name, static void clutter_backend_x11_create_device_manager (ClutterBackendX11 *backend_x11) { - if (G_UNLIKELY (backend_x11->device_manager == NULL)) - { - ClutterEventTranslator *translator; - ClutterBackend *backend; + ClutterEventTranslator *translator; + ClutterBackend *backend; #if defined(HAVE_XINPUT) || defined(HAVE_XINPUT_2) - if (clutter_enable_xinput) + if (clutter_enable_xinput) + { + int event_base, first_event, first_error; + + if (XQueryExtension (backend_x11->xdpy, "XInputExtension", + &event_base, + &first_event, + &first_error)) { - int event_base, first_event, first_error; +#ifdef HAVE_XINPUT_2 + int major = 2; + int minor = 3; - if (XQueryExtension (backend_x11->xdpy, "XInputExtension", - &event_base, - &first_event, - &first_error)) + if (XIQueryVersion (backend_x11->xdpy, &major, &minor) != BadRequest) { -#ifdef HAVE_XINPUT_2 - int major = 2; - int minor = 3; - - if (XIQueryVersion (backend_x11->xdpy, &major, &minor) != BadRequest) - { - CLUTTER_NOTE (BACKEND, "Creating XI2 device manager"); - backend_x11->has_xinput = TRUE; - backend_x11->device_manager = - g_object_new (CLUTTER_TYPE_DEVICE_MANAGER_XI2, - "backend", backend_x11, - "opcode", event_base, - NULL); - - backend_x11->xi_minor = minor; - } - else + CLUTTER_NOTE (BACKEND, "Creating XI2 device manager"); + backend_x11->has_xinput = TRUE; + backend_x11->device_manager = + g_object_new (CLUTTER_TYPE_DEVICE_MANAGER_XI2, + "backend", backend_x11, + "opcode", event_base, + NULL); + + backend_x11->xi_minor = minor; + } + else #endif /* HAVE_XINPUT_2 */ - { - CLUTTER_NOTE (BACKEND, "Creating Core+XI device manager"); - backend_x11->has_xinput = TRUE; - backend_x11->device_manager = - g_object_new (CLUTTER_TYPE_DEVICE_MANAGER_X11, - "backend", backend_x11, - "event-base", first_event, - NULL); - - backend_x11->xi_minor = -1; - } + { + CLUTTER_NOTE (BACKEND, "Creating Core+XI device manager"); + backend_x11->has_xinput = TRUE; + backend_x11->device_manager = + g_object_new (CLUTTER_TYPE_DEVICE_MANAGER_X11, + "backend", backend_x11, + "event-base", first_event, + NULL); + + backend_x11->xi_minor = -1; } } - else + } + else #endif /* HAVE_XINPUT || HAVE_XINPUT_2 */ - { - CLUTTER_NOTE (BACKEND, "Creating Core device manager"); - backend_x11->has_xinput = FALSE; - backend_x11->device_manager = - g_object_new (CLUTTER_TYPE_DEVICE_MANAGER_X11, - "backend", backend_x11, - NULL); - - backend_x11->xi_minor = -1; - } - - backend = CLUTTER_BACKEND (backend_x11); - backend->device_manager = backend_x11->device_manager; + { + CLUTTER_NOTE (BACKEND, "Creating Core device manager"); + backend_x11->has_xinput = FALSE; + backend_x11->device_manager = + g_object_new (CLUTTER_TYPE_DEVICE_MANAGER_X11, + "backend", backend_x11, + NULL); - translator = CLUTTER_EVENT_TRANSLATOR (backend_x11->device_manager); - _clutter_backend_add_event_translator (backend, translator); + backend_x11->xi_minor = -1; } + + backend = CLUTTER_BACKEND (backend_x11); + backend->device_manager = backend_x11->device_manager; + + translator = CLUTTER_EVENT_TRANSLATOR (backend_x11->device_manager); + _clutter_backend_add_event_translator (backend, translator); } static void -- 1.8.4.2 From 3239941d36ae9db92424309f9cdeb3d7f064aa97 Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Wed, 10 Jul 2013 16:31:57 -0400 Subject: [PATCH 2/4] x11: Remove support for XInput 1 Now we either use core X11 or XInput 2. https://bugzilla.gnome.org/show_bug.cgi?id=703969 Conflicts: clutter/config.h.win32.in --- clutter/config.h.win32.in | 3 - clutter/x11/clutter-backend-x11.c | 31 +-- clutter/x11/clutter-device-manager-core-x11.c | 230 ---------------- clutter/x11/clutter-input-device-core-x11.c | 373 -------------------------- clutter/x11/clutter-input-device-core-x11.h | 5 - configure.ac | 6 - 6 files changed, 7 insertions(+), 641 deletions(-) diff --git a/clutter/config.h.win32.in b/clutter/config.h.win32.in index 6040516..e351026 100644 --- a/clutter/config.h.win32.in +++ b/clutter/config.h.win32.in @@ -127,9 +127,6 @@ /* Define to 1 if X Generic Extensions is available */ /* #undef HAVE_XGE */ -/* Define to 1 if XInput is available */ -/* #undef HAVE_XINPUT */ - /* Define to 1 if XI2 is available */ /* #undef HAVE_XINPUT_2 */ diff --git a/clutter/x11/clutter-backend-x11.c b/clutter/x11/clutter-backend-x11.c index 9bbfba8..435370c 100644 --- a/clutter/x11/clutter-backend-x11.c +++ b/clutter/x11/clutter-backend-x11.c @@ -50,10 +50,6 @@ #include #endif -#if HAVE_XINPUT -#include -#endif - #if HAVE_XINPUT_2 #include #endif @@ -225,7 +221,7 @@ clutter_backend_x11_create_device_manager (ClutterBackendX11 *backend_x11) ClutterEventTranslator *translator; ClutterBackend *backend; -#if defined(HAVE_XINPUT) || defined(HAVE_XINPUT_2) +#ifdef HAVE_XINPUT_2 if (clutter_enable_xinput) { int event_base, first_event, first_error; @@ -235,7 +231,6 @@ clutter_backend_x11_create_device_manager (ClutterBackendX11 *backend_x11) &first_event, &first_error)) { -#ifdef HAVE_XINPUT_2 int major = 2; int minor = 3; @@ -251,23 +246,11 @@ clutter_backend_x11_create_device_manager (ClutterBackendX11 *backend_x11) backend_x11->xi_minor = minor; } - else -#endif /* HAVE_XINPUT_2 */ - { - CLUTTER_NOTE (BACKEND, "Creating Core+XI device manager"); - backend_x11->has_xinput = TRUE; - backend_x11->device_manager = - g_object_new (CLUTTER_TYPE_DEVICE_MANAGER_X11, - "backend", backend_x11, - "event-base", first_event, - NULL); - - backend_x11->xi_minor = -1; - } } } - else -#endif /* HAVE_XINPUT || HAVE_XINPUT_2 */ + + if (backend_x11->device_manager == NULL) +#endif /* HAVE_XINPUT_2 */ { CLUTTER_NOTE (BACKEND, "Creating Core device manager"); backend_x11->has_xinput = FALSE; @@ -514,14 +497,14 @@ static const GOptionEntry entries[] = G_OPTION_ARG_NONE, &clutter_synchronise, N_("Make X calls synchronous"), NULL }, -#if defined(HAVE_XINPUT) || defined(HAVE_XINPUT_2) +#ifdef HAVE_XINPUT_2 { "disable-xinput", 0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE, &clutter_enable_xinput, N_("Disable XInput support"), NULL }, -#endif /* HAVE_XINPUT */ +#endif /* HAVE_XINPUT_2 */ { NULL } }; @@ -1188,7 +1171,7 @@ clutter_x11_get_input_devices (void) gboolean clutter_x11_has_xinput (void) { -#if defined(HAVE_XINPUT) || defined(HAVE_XINPUT_2) +#ifdef HAVE_XINPUT_2 ClutterBackend *backend = clutter_get_default_backend (); if (backend == NULL) diff --git a/clutter/x11/clutter-device-manager-core-x11.c b/clutter/x11/clutter-device-manager-core-x11.c index f470189..6a3606d 100644 --- a/clutter/x11/clutter-device-manager-core-x11.c +++ b/clutter/x11/clutter-device-manager-core-x11.c @@ -37,17 +37,6 @@ #include "clutter-stage-private.h" #include "clutter-private.h" -#ifdef HAVE_XINPUT -#include - -/* old versions of XI.h don't define these */ -#ifndef IsXExtensionKeyboard -#define IsXExtensionKeyboard 3 -#define IsXExtensionPointer 4 -#endif - -#endif /* HAVE_XINPUT */ - enum { PROP_0, @@ -69,146 +58,6 @@ G_DEFINE_TYPE_WITH_CODE (ClutterDeviceManagerX11, G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_EVENT_TRANSLATOR, clutter_event_translator_iface_init)); -#ifdef HAVE_XINPUT -static void -translate_class_info (ClutterInputDevice *device, - XDeviceInfo *info) -{ - XAnyClassPtr any_class; - gint i; - - any_class = info->inputclassinfo; - - for (i = 0; i < info->num_classes; i++) - { - switch (any_class->class) - { - case ButtonClass: - break; - - case KeyClass: - { - XKeyInfo *xk_info = (XKeyInfo *) any_class; - ClutterInputDeviceX11 *device_x11; - guint n_keys; - - device_x11 = CLUTTER_INPUT_DEVICE_X11 (device); - - n_keys = xk_info->max_keycode - xk_info->min_keycode + 1; - - _clutter_input_device_set_n_keys (device, n_keys); - _clutter_input_device_x11_set_keycodes (device_x11, - xk_info->min_keycode, - xk_info->max_keycode); - } - break; - - case ValuatorClass: - { - XValuatorInfo *xv_info = (XValuatorInfo *) any_class; - gint j; - - for (j = 0; j < xv_info->num_axes; j++) - { - ClutterInputAxis axis; - - switch (j) - { - case 0: - axis = CLUTTER_INPUT_AXIS_X; - break; - - case 1: - axis = CLUTTER_INPUT_AXIS_Y; - break; - - case 2: - axis = CLUTTER_INPUT_AXIS_PRESSURE; - break; - - case 3: - axis = CLUTTER_INPUT_AXIS_XTILT; - break; - - case 4: - axis = CLUTTER_INPUT_AXIS_YTILT; - break; - - case 5: - axis = CLUTTER_INPUT_AXIS_WHEEL; - break; - - default: - axis = CLUTTER_INPUT_AXIS_IGNORE; - break; - } - - _clutter_input_device_add_axis (device, axis, - xv_info->axes[j].min_value, - xv_info->axes[j].max_value, - xv_info->axes[j].resolution); - } - } - break; - } - - any_class = (XAnyClassPtr) (((char *) any_class) + any_class->length); - } -} - -static ClutterInputDevice * -create_device (ClutterDeviceManagerX11 *manager_x11, - ClutterBackendX11 *backend_x11, - XDeviceInfo *info) -{ - ClutterInputDeviceType source; - ClutterInputDevice *retval; - - if (info->use != IsXExtensionPointer && - info->use != IsXExtensionKeyboard) - return NULL; - - if (info->use == IsXExtensionKeyboard) - source = CLUTTER_KEYBOARD_DEVICE; - else - { - gchar *name; - - name = g_ascii_strdown (info->name, -1); - - if (strstr (name, "eraser") != NULL) - source = CLUTTER_ERASER_DEVICE; - else if (strstr (name, "cursor") != NULL) - source = CLUTTER_CURSOR_DEVICE; - else if (strstr (name, "wacom") != NULL || strstr (name, "pen") != NULL) - source = CLUTTER_PEN_DEVICE; - else - source = CLUTTER_POINTER_DEVICE; - - g_free (name); - } - - retval = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_X11, - "name", info->name, - "id", info->id, - "has-cursor", FALSE, - "device-manager", manager_x11, - "device-type", source, - "device-mode", CLUTTER_INPUT_MODE_FLOATING, - "backend", backend_x11, - "enabled", FALSE, - NULL); - translate_class_info (retval, info); - - CLUTTER_NOTE (BACKEND, - "XI Device '%s' (id: %d) created", - info->name, - (int) info->id); - - return retval; -} -#endif /* HAVE_XINPUT */ - static inline void translate_key_event (ClutterBackendX11 *backend_x11, ClutterDeviceManagerX11 *manager_x11, @@ -275,20 +124,6 @@ out: return; } -#ifdef HAVE_XINPUT -static ClutterInputDevice * -get_device_from_event (ClutterDeviceManagerX11 *manager_x11, - XEvent *xevent) -{ - guint32 device_id; - - device_id = ((XDeviceButtonEvent *) xevent)->deviceid; - - return g_hash_table_lookup (manager_x11->devices_by_id, - GINT_TO_POINTER (device_id)); -} -#endif /* HAVE_XINPUT */ - static ClutterTranslateReturn clutter_device_manager_x11_translate_event (ClutterEventTranslator *translator, gpointer native, @@ -300,9 +135,6 @@ clutter_device_manager_x11_translate_event (ClutterEventTranslator *translator, ClutterTranslateReturn res; ClutterStage *stage; XEvent *xevent; -#ifdef HAVE_XINPUT - ClutterInputDevice *device; -#endif manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (translator); backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ()); @@ -322,23 +154,6 @@ clutter_device_manager_x11_translate_event (ClutterEventTranslator *translator, res = CLUTTER_TRANSLATE_CONTINUE; -#ifdef HAVE_XINPUT - device = get_device_from_event (manager_x11, xevent); - if (device != NULL) - { - ClutterInputDeviceX11 *device_x11; - gboolean retval; - - device_x11 = CLUTTER_INPUT_DEVICE_X11 (device); - retval = _clutter_input_device_x11_translate_xi_event (device_x11, - stage_x11, - xevent, - event); - if (retval) - return CLUTTER_TRANSLATE_QUEUE; - } -#endif /* HAVE_XINPUT */ - switch (xevent->type) { case KeyPress: @@ -537,57 +352,12 @@ clutter_device_manager_x11_constructed (GObject *gobject) { ClutterDeviceManagerX11 *manager_x11; ClutterBackendX11 *backend_x11; -#ifdef HAVE_XINPUT - ClutterDeviceManager *manager; - XDeviceInfo *x_devices = NULL; - int i, n_devices; -#endif /* HAVE_XINPUT */ manager_x11 = CLUTTER_DEVICE_MANAGER_X11 (gobject); g_object_get (gobject, "backend", &backend_x11, NULL); g_assert (backend_x11 != NULL); -#ifdef HAVE_XINPUT - manager = CLUTTER_DEVICE_MANAGER (gobject); - x_devices = XListInputDevices (backend_x11->xdpy, &n_devices); - if (n_devices == 0) - { - CLUTTER_NOTE (BACKEND, "No XInput devices found"); - goto default_device; - } - - for (i = 0; i < n_devices; i++) - { - XDeviceInfo *info = x_devices + i; - ClutterInputDevice *device; - - CLUTTER_NOTE (BACKEND, - "Considering device %li with type %d, %d of %d", - info->id, - info->use, - i, n_devices); - - device = create_device (manager_x11, backend_x11, info); - if (device != NULL) - _clutter_device_manager_add_device (manager, device); - } - - XFreeDeviceList (x_devices); - -default_device: -#endif /* HAVE_XINPUT */ - - /* fallback code in case: - * - * - we do not have XInput support compiled in - * - we do not have the XInput extension - * - * we register two default devices, one for the pointer - * and one for the keyboard. this block must also be - * executed for the XInput support because XI does not - * cover core devices - */ manager_x11->core_pointer = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_X11, "name", "Core Pointer", diff --git a/clutter/x11/clutter-input-device-core-x11.c b/clutter/x11/clutter-input-device-core-x11.c index 6c78a30..0835c17 100644 --- a/clutter/x11/clutter-input-device-core-x11.c +++ b/clutter/x11/clutter-input-device-core-x11.c @@ -33,12 +33,6 @@ #include "clutter-backend-x11.h" #include "clutter-stage-x11.h" -#ifdef HAVE_XINPUT -#include -#endif - -#define MAX_DEVICE_CLASSES 13 - typedef struct _ClutterInputDeviceClass ClutterInputDeviceX11Class; /* a specific X11 input device */ @@ -46,22 +40,6 @@ struct _ClutterInputDeviceX11 { ClutterInputDevice device; -#ifdef HAVE_XINPUT - XDevice *xdevice; - - XEventClass event_classes[MAX_DEVICE_CLASSES]; - int num_classes; - - int button_press_type; - int button_release_type; - int motion_notify_type; - int state_notify_type; - int key_press_type; - int key_release_type; -#endif /* HAVE_XINPUT */ - - gint *axis_data; - int min_keycode; int max_keycode; }; @@ -72,134 +50,6 @@ G_DEFINE_TYPE (ClutterInputDeviceX11, clutter_input_device_x11, CLUTTER_TYPE_INPUT_DEVICE); -static void -clutter_input_device_x11_select_stage_events (ClutterInputDevice *device, - ClutterStage *stage, - gint event_mask) -{ -#if HAVE_XINPUT - ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (device->backend); - ClutterInputDeviceX11 *device_x11; - ClutterStageX11 *stage_x11; - XEventClass class; - gint i; - - device_x11 = CLUTTER_INPUT_DEVICE_X11 (device); - - stage_x11 = CLUTTER_STAGE_X11 (_clutter_stage_get_window (stage)); - - i = 0; - - if (event_mask & ButtonPressMask) - { - DeviceButtonPress (device_x11->xdevice, - device_x11->button_press_type, - class); - if (class != 0) - device_x11->event_classes[i++] = class; - - DeviceButtonPressGrab (device_x11->xdevice, 0, class); - if (class != 0) - device_x11->event_classes[i++] = class; - } - - if (event_mask & ButtonReleaseMask) - { - DeviceButtonRelease (device_x11->xdevice, - device_x11->button_release_type, - class); - if (class != 0) - device_x11->event_classes[i++] = class; - } - - if (event_mask & PointerMotionMask) - { - DeviceMotionNotify (device_x11->xdevice, - device_x11->motion_notify_type, - class); - if (class != 0) - device_x11->event_classes[i++] = class; - - DeviceStateNotify (device_x11->xdevice, - device_x11->state_notify_type, - class); - if (class != 0) - device_x11->event_classes[i++] = class; - } - - if (event_mask & KeyPressMask) - { - DeviceKeyPress (device_x11->xdevice, - device_x11->key_press_type, - class); - if (class != 0) - device_x11->event_classes[i++] = class; - } - - if (event_mask & KeyReleaseMask) - { - DeviceKeyRelease (device_x11->xdevice, - device_x11->key_release_type, - class); - if (class != 0) - device_x11->event_classes[i++] = class; - } - - device_x11->num_classes = i; - - XSelectExtensionEvent (backend_x11->xdpy, - stage_x11->xwin, - device_x11->event_classes, - device_x11->num_classes); -#endif /* HAVE_XINPUT */ -} - -static void -clutter_input_device_x11_dispose (GObject *gobject) -{ - ClutterInputDeviceX11 *device_x11 = CLUTTER_INPUT_DEVICE_X11 (gobject); - -#ifdef HAVE_XINPUT - if (device_x11->xdevice) - { - ClutterInputDevice *device = CLUTTER_INPUT_DEVICE (gobject); - ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (device->backend); - - XCloseDevice (backend_x11->xdpy, device_x11->xdevice); - device_x11->xdevice = NULL; - } -#endif /* HAVE_XINPUT */ - - g_free (device_x11->axis_data); - - G_OBJECT_CLASS (clutter_input_device_x11_parent_class)->dispose (gobject); -} - -static void -clutter_input_device_x11_constructed (GObject *gobject) -{ -#ifdef HAVE_XINPUT - ClutterInputDeviceX11 *device_x11 = CLUTTER_INPUT_DEVICE_X11 (gobject); - ClutterInputDevice *device = CLUTTER_INPUT_DEVICE (gobject); - ClutterBackendX11 *backend_x11; - - backend_x11 = CLUTTER_BACKEND_X11 (device->backend); - - clutter_x11_trap_x_errors (); - - device_x11->xdevice = XOpenDevice (backend_x11->xdpy, device->id); - - if (clutter_x11_untrap_x_errors ()) - { - g_warning ("Device '%s' cannot be opened", - clutter_input_device_get_device_name (device)); - } -#endif /* HAVE_XINPUT */ - - if (G_OBJECT_CLASS (clutter_input_device_x11_parent_class)->constructed) - G_OBJECT_CLASS (clutter_input_device_x11_parent_class)->constructed (gobject); -} - static gboolean clutter_input_device_x11_keycode_to_evdev (ClutterInputDevice *device, guint hardware_keycode, @@ -220,10 +70,6 @@ clutter_input_device_x11_class_init (ClutterInputDeviceX11Class *klass) GObjectClass *gobject_class = G_OBJECT_CLASS (klass); ClutterInputDeviceClass *device_class = CLUTTER_INPUT_DEVICE_CLASS (klass); - gobject_class->constructed = clutter_input_device_x11_constructed; - gobject_class->dispose = clutter_input_device_x11_dispose; - - device_class->select_stage_events = clutter_input_device_x11_select_stage_events; device_class->keycode_to_evdev = clutter_input_device_x11_keycode_to_evdev; } @@ -252,222 +98,3 @@ _clutter_input_device_x11_get_max_keycode (ClutterInputDeviceX11 *device_x11) { return device_x11->max_keycode; } - -#ifdef HAVE_XINPUT -static void -update_axes (ClutterInputDeviceX11 *device_x11, - guint n_axes, - gint first_axis, - gint *axes_data) -{ - ClutterInputDevice *device = CLUTTER_INPUT_DEVICE (device_x11); - gint i; - - if (device_x11->axis_data == NULL) - { - device_x11->axis_data = - g_new0 (gint, clutter_input_device_get_n_axes (device)); - } - - for (i = 0; i < n_axes; i++) - device_x11->axis_data[first_axis + i] = axes_data[i]; -} - -static gdouble * -translate_axes (ClutterInputDeviceX11 *device_x11, - ClutterStageX11 *stage_x11, - gfloat *event_x, - gfloat *event_y) -{ - ClutterInputDevice *device = CLUTTER_INPUT_DEVICE (device_x11); - gint root_x, root_y; - gint n_axes, i; - gdouble x, y; - gdouble *retval; - - if (!_clutter_stage_x11_get_root_coords (stage_x11, &root_x, &root_y)) - return NULL; - - x = y = 0.0f; - n_axes = clutter_input_device_get_n_axes (device); - - retval = g_new0 (gdouble, n_axes); - - for (i = 0; i < n_axes; i++) - { - ClutterInputAxis axis; - - axis = clutter_input_device_get_axis (device, i); - switch (axis) - { - case CLUTTER_INPUT_AXIS_X: - case CLUTTER_INPUT_AXIS_Y: - _clutter_x11_input_device_translate_screen_coord (device, - root_x, root_y, - i, - device_x11->axis_data[i], - &retval[i]); - if (axis == CLUTTER_INPUT_AXIS_X) - x = retval[i]; - else if (axis == CLUTTER_INPUT_AXIS_Y) - y = retval[i]; - break; - - default: - _clutter_input_device_translate_axis (device, i, - device_x11->axis_data[i], - &retval[i]); - break; - } - } - - if (event_x) - *event_x = x; - - if (event_y) - *event_y = y; - - return retval; -} - -/* - * translate_state: - * @state: the keyboard state of the core device - * @device_state: the button state of the device - * - * Trivially translates the state and the device state into a - * single bitmask. - */ -static guint -translate_state (guint state, - guint device_state) -{ - return device_state | (state & 0xff); -} -#endif /* HAVE_XINPUT */ - -gboolean -_clutter_input_device_x11_translate_xi_event (ClutterInputDeviceX11 *device_x11, - ClutterStageX11 *stage_x11, - XEvent *xevent, - ClutterEvent *event) -{ -#ifdef HAVE_XINPUT - ClutterInputDevice *device = CLUTTER_INPUT_DEVICE (device_x11); - - if ((xevent->type == device_x11->button_press_type) || - (xevent->type == device_x11->button_release_type)) - { - XDeviceButtonEvent *xdbe = (XDeviceButtonEvent *) xevent; - - event->button.type = event->type = - (xdbe->type == device_x11->button_press_type) ? CLUTTER_BUTTON_PRESS - : CLUTTER_BUTTON_RELEASE; - event->button.device = device; - event->button.time = xdbe->time; - event->button.button = xdbe->button; - event->button.modifier_state = - translate_state (xdbe->state, xdbe->device_state); - - update_axes (device_x11, - xdbe->axes_count, - xdbe->first_axis, - xdbe->axis_data); - - event->button.axes = translate_axes (device_x11, stage_x11, - &event->button.x, - &event->button.y); - - _clutter_stage_x11_set_user_time (stage_x11, event->button.time); - - return TRUE; - } - - if ((xevent->type == device_x11->key_press_type) || - (xevent->type == device_x11->key_release_type)) - { - XDeviceKeyEvent *xdke = (XDeviceKeyEvent *) xevent; - - if (xdke->keycode < device_x11->min_keycode || - xdke->keycode >= device_x11->max_keycode) - { - g_warning ("Invalid device key code received: %d", xdke->keycode); - return FALSE; - } - - clutter_input_device_get_key (device, - xdke->keycode - device_x11->min_keycode, - &event->key.keyval, - &event->key.modifier_state); - if (event->key.keyval == 0) - return FALSE; - - event->key.type = event->type = - (xdke->type == device_x11->key_press_type) ? CLUTTER_KEY_PRESS - : CLUTTER_KEY_RELEASE; - event->key.time = xdke->time; - event->key.modifier_state |= - translate_state (xdke->state, xdke->device_state); - event->key.device = device; - -#if 0 - if ((event->key.keyval >= 0x20) && (event->key.keyval <= 0xff)) - { - event->key.unicode = (gunichar) event->key.keyval; - } -#endif - - _clutter_stage_x11_set_user_time (stage_x11, event->key.time); - - return TRUE; - } - - if (xevent->type == device_x11->motion_notify_type) - { - XDeviceMotionEvent *xdme = (XDeviceMotionEvent *) xevent; - - event->motion.type = event->type = CLUTTER_MOTION; - event->motion.time = xdme->time; - event->motion.modifier_state = - translate_state (xdme->state, xdme->device_state); - event->motion.device = device; - - event->motion.axes = - g_new0 (gdouble, clutter_input_device_get_n_axes (device)); - - update_axes (device_x11, - xdme->axes_count, - xdme->first_axis, - xdme->axis_data); - - event->motion.axes = translate_axes (device_x11, stage_x11, - &event->motion.x, - &event->motion.y); - - return TRUE; - } - - if (xevent->type == device_x11->state_notify_type) - { - XDeviceStateNotifyEvent *xdse = (XDeviceStateNotifyEvent *) xevent; - XInputClass *input_class = (XInputClass *) xdse->data; - gint n_axes = clutter_input_device_get_n_axes (device); - int i; - - for (i = 0; i < xdse->num_classes; i++) - { - if (input_class->class == ValuatorClass) - { - int *axis_data = ((XValuatorState *) input_class)->valuators; - - update_axes (device_x11, n_axes, 0, axis_data); - } - - input_class = - (XInputClass *)(((char *) input_class) + input_class->length); - } - } -#endif /* HAVE_XINPUT */ - - return FALSE; -} diff --git a/clutter/x11/clutter-input-device-core-x11.h b/clutter/x11/clutter-input-device-core-x11.h index af4ed59..ce6b125 100644 --- a/clutter/x11/clutter-input-device-core-x11.h +++ b/clutter/x11/clutter-input-device-core-x11.h @@ -45,11 +45,6 @@ void _clutter_input_device_x11_set_keycodes (ClutterInputDeviceX11 *device_x11, int _clutter_input_device_x11_get_min_keycode (ClutterInputDeviceX11 *device_x11); int _clutter_input_device_x11_get_max_keycode (ClutterInputDeviceX11 *device_x11); -gboolean _clutter_input_device_x11_translate_xi_event (ClutterInputDeviceX11 *device_x11, - ClutterStageX11 *stage_x11, - XEvent *xevent, - ClutterEvent *event); - G_END_DECLS #endif /* __CLUTTER_INPUT_DEVICE_X11_H__ */ diff --git a/configure.ac b/configure.ac index 8dcbf58..47c32d2 100644 --- a/configure.ac +++ b/configure.ac @@ -717,12 +717,6 @@ AS_IF([test "x$SUPPORT_X11" = "x1"], AC_DEFINE([HAVE_XINPUT_2], [1], [Define to 1 if XI2 is available]) - ], - [ - have_xinput2=no - AC_DEFINE([HAVE_XINPUT], - [1], - [Define to 1 if XInput is available]) ]) clutter_save_LIBS="$LIBS" -- 1.8.4.2 From 97584c62c11057944645fb6efab53bdee16ee20e Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Wed, 10 Jul 2013 16:34:48 -0400 Subject: [PATCH 3/4] device-manager: Don't pass the event mask around There's no point in doing this, as we always use a constant event mask. Simply do what everything else does. https://bugzilla.gnome.org/show_bug.cgi?id=703969 --- clutter/clutter-device-manager-private.h | 9 +++------ clutter/clutter-device-manager.c | 5 ++--- clutter/clutter-input-device.c | 6 ++---- clutter/x11/clutter-input-device-xi2.c | 30 ++++++++---------------------- clutter/x11/clutter-stage-x11.c | 26 +++++--------------------- clutter/x11/clutter-stage-x11.h | 2 +- 6 files changed, 21 insertions(+), 57 deletions(-) diff --git a/clutter/clutter-device-manager-private.h b/clutter/clutter-device-manager-private.h index 8bc5330..631a776 100644 --- a/clutter/clutter-device-manager-private.h +++ b/clutter/clutter-device-manager-private.h @@ -138,8 +138,7 @@ struct _ClutterInputDeviceClass GObjectClass parent_class; void (* select_stage_events) (ClutterInputDevice *device, - ClutterStage *stage, - gint event_mask); + ClutterStage *stage); gboolean (* keycode_to_evdev) (ClutterInputDevice *device, guint hardware_keycode, guint *evdev_keycode); @@ -152,8 +151,7 @@ void _clutter_device_manager_remove_device (ClutterDeviceMa ClutterInputDevice *device); void _clutter_device_manager_update_devices (ClutterDeviceManager *device_manager); void _clutter_device_manager_select_stage_events (ClutterDeviceManager *device_manager, - ClutterStage *stage, - gint event_mask); + ClutterStage *stage); ClutterBackend *_clutter_device_manager_get_backend (ClutterDeviceManager *device_manager); /* input device */ @@ -199,8 +197,7 @@ void _clutter_input_device_remove_slave (ClutterInputDev ClutterInputDevice *slave); void _clutter_input_device_select_stage_events (ClutterInputDevice *device, - ClutterStage *stage, - gint event_flags); + ClutterStage *stage); gboolean _clutter_input_device_translate_axis (ClutterInputDevice *device, guint index_, diff --git a/clutter/clutter-device-manager.c b/clutter/clutter-device-manager.c index 2dc67be..c54b3e0 100644 --- a/clutter/clutter-device-manager.c +++ b/clutter/clutter-device-manager.c @@ -308,8 +308,7 @@ clutter_device_manager_get_core_device (ClutterDeviceManager *device_manager, void _clutter_device_manager_select_stage_events (ClutterDeviceManager *device_manager, - ClutterStage *stage, - gint event_flags) + ClutterStage *stage) { ClutterDeviceManagerClass *manager_class; const GSList *devices, *d; @@ -324,7 +323,7 @@ _clutter_device_manager_select_stage_events (ClutterDeviceManager *device_manage ClutterInputDevice *device = d->data; if (device->is_enabled) - _clutter_input_device_select_stage_events (device, stage, event_flags); + _clutter_input_device_select_stage_events (device, stage); } } diff --git a/clutter/clutter-input-device.c b/clutter/clutter-input-device.c index d222177..48cb40a 100644 --- a/clutter/clutter-input-device.c +++ b/clutter/clutter-input-device.c @@ -1624,7 +1624,6 @@ clutter_input_device_get_associated_device (ClutterInputDevice *device) * clutter_input_device_select_stage_events: * @device: a #ClutterInputDevice * @stage: the #ClutterStage to select events on - * @event_mask: platform-specific mask of events * * Selects input device events on @stage. * @@ -1632,14 +1631,13 @@ clutter_input_device_get_associated_device (ClutterInputDevice *device) */ void _clutter_input_device_select_stage_events (ClutterInputDevice *device, - ClutterStage *stage, - gint event_mask) + ClutterStage *stage) { ClutterInputDeviceClass *device_class; device_class = CLUTTER_INPUT_DEVICE_GET_CLASS (device); if (device_class->select_stage_events != NULL) - device_class->select_stage_events (device, stage, event_mask); + device_class->select_stage_events (device, stage); } /** diff --git a/clutter/x11/clutter-input-device-xi2.c b/clutter/x11/clutter-input-device-xi2.c index 5923977..cd65b7b 100644 --- a/clutter/x11/clutter-input-device-xi2.c +++ b/clutter/x11/clutter-input-device-xi2.c @@ -55,8 +55,7 @@ G_DEFINE_TYPE (ClutterInputDeviceXI2, static void clutter_input_device_xi2_select_stage_events (ClutterInputDevice *device, - ClutterStage *stage, - gint event_mask) + ClutterStage *stage) { ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device); ClutterBackendX11 *backend_x11; @@ -71,26 +70,13 @@ clutter_input_device_xi2_select_stage_events (ClutterInputDevice *device, len = XIMaskLen (XI_LASTEVENT); mask = g_new0 (unsigned char, len); - if (event_mask & PointerMotionMask) - XISetMask (mask, XI_Motion); - - if (event_mask & ButtonPressMask) - XISetMask (mask, XI_ButtonPress); - - if (event_mask & ButtonReleaseMask) - XISetMask (mask, XI_ButtonRelease); - - if (event_mask & KeyPressMask) - XISetMask (mask, XI_KeyPress); - - if (event_mask & KeyReleaseMask) - XISetMask (mask, XI_KeyRelease); - - if (event_mask & EnterWindowMask) - XISetMask (mask, XI_Enter); - - if (event_mask & LeaveWindowMask) - XISetMask (mask, XI_Leave); + XISetMask (mask, XI_Motion); + XISetMask (mask, XI_ButtonPress); + XISetMask (mask, XI_ButtonRelease); + XISetMask (mask, XI_KeyPress); + XISetMask (mask, XI_KeyRelease); + XISetMask (mask, XI_Enter); + XISetMask (mask, XI_Leave); #ifdef HAVE_XINPUT_2_2 /* enable touch event support if we're running on XInput 2.2 */ diff --git a/clutter/x11/clutter-stage-x11.c b/clutter/x11/clutter-stage-x11.c index 230172c..08b8e15 100644 --- a/clutter/x11/clutter-stage-x11.c +++ b/clutter/x11/clutter-stage-x11.c @@ -547,14 +547,10 @@ _clutter_stage_x11_events_device_changed (ClutterStageX11 *stage_x11, ClutterDeviceManager *device_manager) { ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_x11); - int event_flags = 0; if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_FLOATING) - event_flags = CLUTTER_STAGE_X11_EVENT_MASK; - - _clutter_device_manager_select_stage_events (device_manager, - stage_cogl->wrapper, - event_flags); + _clutter_device_manager_select_stage_events (device_manager, + stage_cogl->wrapper); } static void @@ -564,12 +560,10 @@ stage_events_device_added (ClutterDeviceManager *device_manager, { ClutterStageWindow *stage_window = user_data; ClutterStageCogl *stage_cogl = CLUTTER_STAGE_COGL (stage_window); - int event_flags = CLUTTER_STAGE_X11_EVENT_MASK; if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_FLOATING) _clutter_device_manager_select_stage_events (device_manager, - stage_cogl->wrapper, - event_flags); + stage_cogl->wrapper); } static gboolean @@ -580,7 +574,6 @@ clutter_stage_x11_realize (ClutterStageWindow *stage_window) ClutterBackend *backend = CLUTTER_BACKEND (stage_cogl->backend); ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (backend); ClutterDeviceManager *device_manager; - int event_flags; gfloat width, height; clutter_actor_get_size (CLUTTER_ACTOR (stage_cogl->wrapper), @@ -623,14 +616,6 @@ clutter_stage_x11_realize (ClutterStageWindow *stage_window) set_wm_title (stage_x11); set_cursor_visible (stage_x11); - - /* the masks for the events we want to select on a stage window; - * KeyPressMask and KeyReleaseMask are necessary even with XI1 - * because key events are broken with that extension, and will - * be fixed by XI2 - */ - event_flags = CLUTTER_STAGE_X11_EVENT_MASK; - /* we unconditionally select input events even with event retrieval * disabled because we need to guarantee that the Clutter internal * state is maintained when calling clutter_x11_handle_event() without @@ -648,7 +633,7 @@ clutter_stage_x11_realize (ClutterStageWindow *stage_window) * for an example of things that break if we do conditional event * selection. */ - XSelectInput (backend_x11->xdpy, stage_x11->xwin, event_flags); + XSelectInput (backend_x11->xdpy, stage_x11->xwin, CLUTTER_STAGE_X11_EVENT_MASK); /* input events also depent on the actual device, so we need to * use the device manager to let every device select them, using @@ -658,8 +643,7 @@ clutter_stage_x11_realize (ClutterStageWindow *stage_window) if (G_UNLIKELY (device_manager != NULL)) { _clutter_device_manager_select_stage_events (device_manager, - stage_cogl->wrapper, - event_flags); + stage_cogl->wrapper); g_signal_connect (device_manager, "device-added", G_CALLBACK (stage_events_device_added), diff --git a/clutter/x11/clutter-stage-x11.h b/clutter/x11/clutter-stage-x11.h index c7a7a1b..8b61056 100644 --- a/clutter/x11/clutter-stage-x11.h +++ b/clutter/x11/clutter-stage-x11.h @@ -86,7 +86,7 @@ struct _ClutterStageX11Class KeyReleaseMask | \ ButtonPressMask | \ ButtonReleaseMask | \ - PointerMotionMask; + PointerMotionMask GType _clutter_stage_x11_get_type (void) G_GNUC_CONST; -- 1.8.4.2 From 95eb3eb5759644d671fab54142f1a43c3cd1c48e Mon Sep 17 00:00:00 2001 From: "Jasper St. Pierre" Date: Wed, 10 Jul 2013 16:53:26 -0400 Subject: [PATCH 4/4] device-manager: Select for events on XIAllMasterDevices This removes a bit of work that we have to do for every device, and makes it easy for mutter to patch out parts of the event mask it doesn't want. https://bugzilla.gnome.org/show_bug.cgi?id=703969 --- clutter/clutter-device-manager-private.h | 5 ---- clutter/clutter-device-manager.c | 12 ++------ clutter/clutter-device-manager.h | 4 ++- clutter/clutter-input-device.c | 20 ------------- clutter/x11/clutter-device-manager-xi2.c | 44 +++++++++++++++++++++++++++++ clutter/x11/clutter-input-device-xi2.c | 48 -------------------------------- 6 files changed, 49 insertions(+), 84 deletions(-) diff --git a/clutter/clutter-device-manager-private.h b/clutter/clutter-device-manager-private.h index 631a776..826b2f6 100644 --- a/clutter/clutter-device-manager-private.h +++ b/clutter/clutter-device-manager-private.h @@ -137,8 +137,6 @@ struct _ClutterInputDeviceClass { GObjectClass parent_class; - void (* select_stage_events) (ClutterInputDevice *device, - ClutterStage *stage); gboolean (* keycode_to_evdev) (ClutterInputDevice *device, guint hardware_keycode, guint *evdev_keycode); @@ -196,9 +194,6 @@ void _clutter_input_device_add_slave (ClutterInputDev void _clutter_input_device_remove_slave (ClutterInputDevice *master, ClutterInputDevice *slave); -void _clutter_input_device_select_stage_events (ClutterInputDevice *device, - ClutterStage *stage); - gboolean _clutter_input_device_translate_axis (ClutterInputDevice *device, guint index_, gdouble value, diff --git a/clutter/clutter-device-manager.c b/clutter/clutter-device-manager.c index c54b3e0..fde30ea 100644 --- a/clutter/clutter-device-manager.c +++ b/clutter/clutter-device-manager.c @@ -311,20 +311,12 @@ _clutter_device_manager_select_stage_events (ClutterDeviceManager *device_manage ClutterStage *stage) { ClutterDeviceManagerClass *manager_class; - const GSList *devices, *d; g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER (device_manager)); manager_class = CLUTTER_DEVICE_MANAGER_GET_CLASS (device_manager); - devices = manager_class->get_devices (device_manager); - - for (d = devices; d != NULL; d = d->next) - { - ClutterInputDevice *device = d->data; - - if (device->is_enabled) - _clutter_input_device_select_stage_events (device, stage); - } + if (manager_class->select_stage_events) + manager_class->select_stage_events (device_manager, stage); } /* diff --git a/clutter/clutter-device-manager.h b/clutter/clutter-device-manager.h index 94cde3d..49b0f94 100644 --- a/clutter/clutter-device-manager.h +++ b/clutter/clutter-device-manager.h @@ -81,9 +81,11 @@ struct _ClutterDeviceManagerClass ClutterInputDevice *device); void (* remove_device) (ClutterDeviceManager *manager, ClutterInputDevice *device); + void (* select_stage_events) (ClutterDeviceManager *manager, + ClutterStage *stage); /* padding */ - gpointer _padding[8]; + gpointer _padding[7]; }; diff --git a/clutter/clutter-input-device.c b/clutter/clutter-input-device.c index 48cb40a..6aed92b 100644 --- a/clutter/clutter-input-device.c +++ b/clutter/clutter-input-device.c @@ -1620,26 +1620,6 @@ clutter_input_device_get_associated_device (ClutterInputDevice *device) return device->associated; } -/*< internal > - * clutter_input_device_select_stage_events: - * @device: a #ClutterInputDevice - * @stage: the #ClutterStage to select events on - * - * Selects input device events on @stage. - * - * The implementation of this function depends on the backend used. - */ -void -_clutter_input_device_select_stage_events (ClutterInputDevice *device, - ClutterStage *stage) -{ - ClutterInputDeviceClass *device_class; - - device_class = CLUTTER_INPUT_DEVICE_GET_CLASS (device); - if (device_class->select_stage_events != NULL) - device_class->select_stage_events (device, stage); -} - /** * clutter_input_device_keycode_to_evdev: * @device: A #ClutterInputDevice diff --git a/clutter/x11/clutter-device-manager-xi2.c b/clutter/x11/clutter-device-manager-xi2.c index 49ee212..e5664d8 100644 --- a/clutter/x11/clutter-device-manager-xi2.c +++ b/clutter/x11/clutter-device-manager-xi2.c @@ -688,6 +688,49 @@ scroll_valuators_changed (ClutterInputDevice *device, return retval; } +static void +clutter_device_manager_xi2_select_stage_events (ClutterDeviceManager *manager, + ClutterStage *stage) +{ + ClutterBackendX11 *backend_x11; + ClutterStageX11 *stage_x11; + XIEventMask xi_event_mask; + unsigned char *mask; + int len; + + backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ()); + stage_x11 = CLUTTER_STAGE_X11 (_clutter_stage_get_window (stage)); + + len = XIMaskLen (XI_LASTEVENT); + mask = g_new0 (unsigned char, len); + + XISetMask (mask, XI_Motion); + XISetMask (mask, XI_ButtonPress); + XISetMask (mask, XI_ButtonRelease); + XISetMask (mask, XI_KeyPress); + XISetMask (mask, XI_KeyRelease); + XISetMask (mask, XI_Enter); + XISetMask (mask, XI_Leave); + +#ifdef HAVE_XINPUT_2_2 + /* enable touch event support if we're running on XInput 2.2 */ + if (backend_x11->xi_minor >= 2) + { + XISetMask (mask, XI_TouchBegin); + XISetMask (mask, XI_TouchUpdate); + XISetMask (mask, XI_TouchEnd); + } +#endif /* HAVE_XINPUT_2_2 */ + + xi_event_mask.deviceid = XIAllMasterDevices; + xi_event_mask.mask = mask; + xi_event_mask.mask_len = len; + + XISelectEvents (backend_x11->xdpy, stage_x11->xwin, &xi_event_mask, 1); + + g_free (mask); +} + static ClutterTranslateReturn clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator, gpointer native, @@ -1483,6 +1526,7 @@ clutter_device_manager_xi2_class_init (ClutterDeviceManagerXI2Class *klass) manager_class->get_devices = clutter_device_manager_xi2_get_devices; manager_class->get_core_device = clutter_device_manager_xi2_get_core_device; manager_class->get_device = clutter_device_manager_xi2_get_device; + manager_class->select_stage_events = clutter_device_manager_xi2_select_stage_events; } static void diff --git a/clutter/x11/clutter-input-device-xi2.c b/clutter/x11/clutter-input-device-xi2.c index cd65b7b..b9e27a5 100644 --- a/clutter/x11/clutter-input-device-xi2.c +++ b/clutter/x11/clutter-input-device-xi2.c @@ -54,53 +54,6 @@ G_DEFINE_TYPE (ClutterInputDeviceXI2, CLUTTER_TYPE_INPUT_DEVICE); static void -clutter_input_device_xi2_select_stage_events (ClutterInputDevice *device, - ClutterStage *stage) -{ - ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (device); - ClutterBackendX11 *backend_x11; - ClutterStageX11 *stage_x11; - XIEventMask xi_event_mask; - unsigned char *mask; - int len; - - backend_x11 = CLUTTER_BACKEND_X11 (device->backend); - stage_x11 = CLUTTER_STAGE_X11 (_clutter_stage_get_window (stage)); - - len = XIMaskLen (XI_LASTEVENT); - mask = g_new0 (unsigned char, len); - - XISetMask (mask, XI_Motion); - XISetMask (mask, XI_ButtonPress); - XISetMask (mask, XI_ButtonRelease); - XISetMask (mask, XI_KeyPress); - XISetMask (mask, XI_KeyRelease); - XISetMask (mask, XI_Enter); - XISetMask (mask, XI_Leave); - -#ifdef HAVE_XINPUT_2_2 - /* enable touch event support if we're running on XInput 2.2 */ - if (backend_x11->xi_minor >= 2) - { - XISetMask (mask, XI_TouchBegin); - XISetMask (mask, XI_TouchUpdate); - XISetMask (mask, XI_TouchEnd); - } -#endif /* HAVE_XINPUT_2_2 */ - - xi_event_mask.deviceid = device_xi2->device_id; - xi_event_mask.mask = mask; - xi_event_mask.mask_len = len; - - CLUTTER_NOTE (BACKEND, "Selecting device id '%d' events", - device_xi2->device_id); - - XISelectEvents (backend_x11->xdpy, stage_x11->xwin, &xi_event_mask, 1); - - g_free (mask); -} - -static void clutter_input_device_xi2_constructed (GObject *gobject) { ClutterInputDeviceXI2 *device_xi2 = CLUTTER_INPUT_DEVICE_XI2 (gobject); @@ -133,7 +86,6 @@ clutter_input_device_xi2_class_init (ClutterInputDeviceXI2Class *klass) gobject_class->constructed = clutter_input_device_xi2_constructed; - device_class->select_stage_events = clutter_input_device_xi2_select_stage_events; device_class->keycode_to_evdev = clutter_input_device_xi2_keycode_to_evdev; } -- 1.8.4.2