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:
Emmanuele Bassi 2010-01-15 11:21:52 +00:00
parent 8a579838d5
commit 79ad2b6a72
4 changed files with 77 additions and 10 deletions

View File

@ -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;
}
}

View File

@ -80,6 +80,9 @@ struct _ClutterBackendX11
gboolean have_xinput;
Time last_event_time;
ClutterInputDevice *core_pointer;
ClutterInputDevice *core_keyboard;
};
struct _ClutterBackendX11Class

View File

@ -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)

View File

@ -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