x11: Store core devices on the X11 Backend singleton
Instead of overloading the device id of 0 and 1 we should treat the core devices as special, and have a pointer inside the X11 backend singleton structure, for fast access.
This commit is contained in:
parent
8a579838d5
commit
79ad2b6a72
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -80,6 +80,9 @@ struct _ClutterBackendX11
|
||||
gboolean have_xinput;
|
||||
|
||||
Time last_event_time;
|
||||
|
||||
ClutterInputDevice *core_pointer;
|
||||
ClutterInputDevice *core_keyboard;
|
||||
};
|
||||
|
||||
struct _ClutterBackendX11Class
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user