From 5fcfdcb2726637285c256f2b6b8ad75cc619d3a6 Mon Sep 17 00:00:00 2001
From: "Jasper St. Pierre" <jstpierre@mecheye.net>
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" <jstpierre@mecheye.net>
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 <X11/extensions/Xcomposite.h>
#endif
-#if HAVE_XINPUT
-#include <X11/extensions/XInput.h>
-#endif
-
#if HAVE_XINPUT_2
#include <X11/extensions/XInput2.h>
#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 <X11/extensions/XInput.h>
-
-/* 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 <X11/extensions/XInput.h>
-#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" <jstpierre@mecheye.net>
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" <jstpierre@mecheye.net>
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