diff --git a/clutter/x11/clutter-backend-x11.c b/clutter/x11/clutter-backend-x11.c index d8f026f05..08d9da934 100644 --- a/clutter/x11/clutter-backend-x11.c +++ b/clutter/x11/clutter-backend-x11.c @@ -236,18 +236,22 @@ default_device: d = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_X11, "id", 0, "device-type", CLUTTER_POINTER_DEVICE, + "is-core", TRUE, NULL); d->is_default = TRUE; - CLUTTER_NOTE (BACKEND, "Added default pointer device %d", d->id); + CLUTTER_NOTE (BACKEND, "Added core pointer device %d", d->id); _clutter_device_manager_add_device (manager, d); + backend->core_pointer = d; d = g_object_new (CLUTTER_TYPE_INPUT_DEVICE_X11, "id", 1, "device-type", CLUTTER_KEYBOARD_DEVICE, + "is-core", TRUE, NULL); d->is_default = TRUE; - CLUTTER_NOTE (BACKEND, "Added default keyboard device %d", d->id); + CLUTTER_NOTE (BACKEND, "Added core keyboard device %d", d->id); _clutter_device_manager_add_device (manager, d); + backend->core_keyboard = d; } } diff --git a/clutter/x11/clutter-backend-x11.h b/clutter/x11/clutter-backend-x11.h index 95cd4c3fa..807dd3648 100644 --- a/clutter/x11/clutter-backend-x11.h +++ b/clutter/x11/clutter-backend-x11.h @@ -80,6 +80,9 @@ struct _ClutterBackendX11 gboolean have_xinput; Time last_event_time; + + ClutterInputDevice *core_pointer; + ClutterInputDevice *core_keyboard; }; struct _ClutterBackendX11Class diff --git a/clutter/x11/clutter-event-x11.c b/clutter/x11/clutter-event-x11.c index 549fef008..87a21f5dc 100644 --- a/clutter/x11/clutter-event-x11.c +++ b/clutter/x11/clutter-event-x11.c @@ -183,7 +183,6 @@ _clutter_backend_x11_events_init (ClutterBackend *backend) g_source_add_poll (source, &event_source->event_poll_fd); g_source_set_can_recurse (source, TRUE); g_source_attach (source, NULL); - } void @@ -622,10 +621,9 @@ event_translate (ClutterBackend *backend, case KeyPress: event->key.type = event->type = CLUTTER_KEY_PRESS; - translate_key_event (backend, event, xevent); + event->key.device = backend_x11->core_keyboard; - /* default key device if no XInput support is defined */ - event->key.device = clutter_device_manager_get_device (manager, 1); + translate_key_event (backend, event, xevent); set_user_time (backend_x11, &xwindow, xevent->xkey.time); break; @@ -658,10 +656,9 @@ event_translate (ClutterBackend *backend, } event->key.type = event->type = CLUTTER_KEY_RELEASE; - translate_key_event (backend, event, xevent); + event->key.device = backend_x11->core_keyboard; - /* default key device if no XInput support is defined */ - event->key.device = clutter_device_manager_get_device (manager, 1); + translate_key_event (backend, event, xevent); break; default: @@ -675,7 +672,7 @@ event_translate (ClutterBackend *backend, { if (!clutter_x11_has_xinput ()) { - device = clutter_device_manager_get_device (manager, 0); + device = backend_x11->core_pointer; /* Regular X event */ switch (xevent->type) diff --git a/clutter/x11/clutter-input-device-x11.c b/clutter/x11/clutter-input-device-x11.c index e0edfd1e9..2be771de3 100644 --- a/clutter/x11/clutter-input-device-x11.c +++ b/clutter/x11/clutter-input-device-x11.c @@ -22,20 +22,83 @@ struct _ClutterInputDeviceX11 XEventClass xevent_list[5]; /* MAX 5 event types */ int num_events; #endif + + guint is_core : 1; +}; + +enum +{ + PROP_0, + + PROP_IS_CORE }; G_DEFINE_TYPE (ClutterInputDeviceX11, clutter_input_device_x11, CLUTTER_TYPE_INPUT_DEVICE); +static void +clutter_input_device_x11_set_property (GObject *gobject, + guint prop_id, + const GValue *value, + GParamSpec *pspec) +{ + ClutterInputDeviceX11 *self = CLUTTER_INPUT_DEVICE_X11 (gobject); + + switch (prop_id) + { + case PROP_IS_CORE: + self->is_core = g_value_get_boolean (value); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + +static void +clutter_input_device_x11_get_property (GObject *gobject, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + ClutterInputDeviceX11 *self = CLUTTER_INPUT_DEVICE_X11 (gobject); + + switch (prop_id) + { + case PROP_IS_CORE: + g_value_set_boolean (value, self->is_core); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec); + break; + } +} + static void clutter_input_device_x11_class_init (ClutterInputDeviceX11Class *klass) { + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GParamSpec *pspec; + + gobject_class->set_property = clutter_input_device_x11_set_property; + gobject_class->get_property = clutter_input_device_x11_get_property; + + pspec = g_param_spec_boolean ("is-core", + "Is Core", + "Whether the device is a core one", + FALSE, + CLUTTER_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY); + g_object_class_install_property (gobject_class, PROP_IS_CORE, pspec); } static void clutter_input_device_x11_init (ClutterInputDeviceX11 *self) { + self->is_core = FALSE; } gint