From 56d133f9080281ad9dbdda2af0f57f3fe3a0775c Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Wed, 9 Feb 2011 12:20:56 +0000 Subject: [PATCH] backend: Move event translators to the base class In the future, we want event translators to be the way to handle events in backends. For this reason, they should be a part of the base abstract ClutterBackend class, and not an X11-only concept. --- clutter/clutter-backend-private.h | 7 ++++ clutter/clutter-backend.c | 65 +++++++++++++++++++++++++++++++ clutter/egl/clutter-backend-egl.c | 2 +- clutter/glx/clutter-backend-glx.c | 2 +- clutter/x11/clutter-backend-x11.c | 62 +++++++++-------------------- clutter/x11/clutter-backend-x11.h | 11 ------ clutter/x11/clutter-keymap-x11.c | 7 +--- clutter/x11/clutter-stage-x11.c | 5 ++- 8 files changed, 96 insertions(+), 65 deletions(-) diff --git a/clutter/clutter-backend-private.h b/clutter/clutter-backend-private.h index 8d95acf65..cc88903f7 100644 --- a/clutter/clutter-backend-private.h +++ b/clutter/clutter-backend-private.h @@ -23,6 +23,7 @@ #define __CLUTTER_BACKEND_PRIVATE_H__ #include +#include "clutter-event-translator.h" #define CLUTTER_BACKEND_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), CLUTTER_TYPE_BACKEND, ClutterBackendClass)) #define CLUTTER_IS_BACKEND_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), CLUTTER_TYPE_BACKEND)) @@ -122,6 +123,12 @@ gboolean _clutter_backend_translate_event (ClutterBackend *backend, gpointer native, ClutterEvent *event); +void _clutter_backend_add_event_translator (ClutterBackend *backend, + ClutterEventTranslator *translator); +void _clutter_backend_remove_event_translator (ClutterBackend *backend, + ClutterEventTranslator *translator); + + G_END_DECLS #endif /* __CLUTTER_BACKEND_PRIVATE_H__ */ diff --git a/clutter/clutter-backend.c b/clutter/clutter-backend.c index 0c61b08c6..c51e03ecd 100644 --- a/clutter/clutter-backend.c +++ b/clutter/clutter-backend.c @@ -68,6 +68,8 @@ struct _ClutterBackendPrivate gfloat units_per_em; gint32 units_serial; + + GList *event_translators; }; enum @@ -84,6 +86,7 @@ static guint backend_signals[LAST_SIGNAL] = { 0, }; static void clutter_backend_dispose (GObject *gobject) { + ClutterBackendPrivate *priv = CLUTTER_BACKEND (gobject)->priv; ClutterMainContext *clutter_context; clutter_context = _clutter_context_get_default (); @@ -97,6 +100,12 @@ clutter_backend_dispose (GObject *gobject) clutter_context->events_queue = NULL; } + if (priv->event_translators != NULL) + { + g_list_free (priv->event_translators); + priv->event_translators = NULL; + } + G_OBJECT_CLASS (clutter_backend_parent_class)->dispose (gobject); } @@ -220,6 +229,35 @@ clutter_backend_real_redraw (ClutterBackend *backend, _clutter_stage_window_redraw (impl); } +static gboolean +clutter_backend_real_translate_event (ClutterBackend *backend, + gpointer native, + ClutterEvent *event) +{ + ClutterBackendPrivate *priv = backend->priv; + GList *l; + + for (l = priv->event_translators; + l != NULL; + l = l->next) + { + ClutterEventTranslator *translator = l->data; + ClutterTranslateReturn retval; + + retval = _clutter_event_translator_translate_event (translator, + native, + event); + + if (retval == CLUTTER_TRANSLATE_QUEUE) + return TRUE; + + if (retval == CLUTTER_TRANSLATE_REMOVE) + return FALSE; + } + + return FALSE; +} + static void clutter_backend_class_init (ClutterBackendClass *klass) { @@ -259,6 +297,7 @@ clutter_backend_class_init (ClutterBackendClass *klass) klass->resolution_changed = clutter_backend_real_resolution_changed; klass->font_changed = clutter_backend_real_font_changed; + klass->translate_event = clutter_backend_real_translate_event; klass->redraw = clutter_backend_real_redraw; } @@ -907,3 +946,29 @@ _clutter_backend_translate_event (ClutterBackend *backend, native, event); } + +void +_clutter_backend_add_event_translator (ClutterBackend *backend, + ClutterEventTranslator *translator) +{ + ClutterBackendPrivate *priv = backend->priv; + + if (g_list_find (priv->event_translators, translator) != NULL) + return; + + priv->event_translators = + g_list_prepend (priv->event_translators, translator); +} + +void +_clutter_backend_remove_event_translator (ClutterBackend *backend, + ClutterEventTranslator *translator) +{ + ClutterBackendPrivate *priv = backend->priv; + + if (g_list_find (priv->event_translators, translator) == NULL) + return; + + priv->event_translators = + g_list_remove (priv->event_translators, translator); +} diff --git a/clutter/egl/clutter-backend-egl.c b/clutter/egl/clutter-backend-egl.c index cb5b28ce0..4c4a85d1b 100644 --- a/clutter/egl/clutter-backend-egl.c +++ b/clutter/egl/clutter-backend-egl.c @@ -755,7 +755,7 @@ clutter_backend_egl_create_stage (ClutterBackend *backend, stage_x11->backend = backend_x11; translator = CLUTTER_EVENT_TRANSLATOR (stage_x11); - _clutter_backend_x11_add_event_translator (backend_x11, translator); + _clutter_backend_add_event_translator (backend, translator); CLUTTER_NOTE (MISC, "EGLX stage created (display:%p, screen:%d, root:%u)", backend_x11->xdpy, diff --git a/clutter/glx/clutter-backend-glx.c b/clutter/glx/clutter-backend-glx.c index 232a9e5e3..df1b7f755 100644 --- a/clutter/glx/clutter-backend-glx.c +++ b/clutter/glx/clutter-backend-glx.c @@ -793,7 +793,7 @@ clutter_backend_glx_create_stage (ClutterBackend *backend, stage_x11->backend = backend_x11; translator = CLUTTER_EVENT_TRANSLATOR (stage_x11); - _clutter_backend_x11_add_event_translator (backend_x11, translator); + _clutter_backend_add_event_translator (backend, translator); CLUTTER_NOTE (BACKEND, "GLX stage created[%p] (dpy:%p, screen:%d, root:%u, wrap:%p)", diff --git a/clutter/x11/clutter-backend-x11.c b/clutter/x11/clutter-backend-x11.c index 96b379ae7..d48320e29 100644 --- a/clutter/x11/clutter-backend-x11.c +++ b/clutter/x11/clutter-backend-x11.c @@ -228,6 +228,7 @@ clutter_backend_x11_create_device_manager (ClutterBackendX11 *backend_x11) if (G_UNLIKELY (backend_x11->device_manager == NULL)) { ClutterEventTranslator *translator; + ClutterBackend *backend; #if defined(HAVE_XINPUT) || defined(HAVE_XINPUT_2) if (clutter_enable_xinput) @@ -278,8 +279,9 @@ clutter_backend_x11_create_device_manager (ClutterBackendX11 *backend_x11) NULL); } + backend = CLUTTER_BACKEND (backend_x11); translator = CLUTTER_EVENT_TRANSLATOR (backend_x11->device_manager); - _clutter_backend_x11_add_event_translator (backend_x11, translator); + _clutter_backend_add_event_translator (backend, translator); } } @@ -288,10 +290,17 @@ clutter_backend_x11_create_keymap (ClutterBackendX11 *backend_x11) { if (backend_x11->keymap == NULL) { + ClutterEventTranslator *translator; + ClutterBackend *backend; + backend_x11->keymap = g_object_new (CLUTTER_TYPE_KEYMAP_X11, "backend", backend_x11, NULL); + + backend = CLUTTER_BACKEND (backend_x11); + translator = CLUTTER_EVENT_TRANSLATOR (backend_x11->keymap); + _clutter_backend_add_event_translator (backend, translator); } } @@ -652,10 +661,11 @@ clutter_backend_x11_translate_event (ClutterBackend *backend, ClutterEvent *event) { ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (backend); + ClutterBackendClass *parent_class; XEvent *xevent = native; - GList *l; - if (backend_x11->event_filters) + /* X11 filter functions have a higher priority */ + if (backend_x11->event_filters != NULL) { GSList *node = backend_x11->event_filters; @@ -687,25 +697,11 @@ clutter_backend_x11_translate_event (ClutterBackend *backend, */ update_last_event_time (backend_x11, xevent); - for (l = backend_x11->event_translators; - l != NULL; - l = l->next) - { - ClutterEventTranslator *translator = l->data; - ClutterTranslateReturn retval; - - retval = _clutter_event_translator_translate_event (translator, - native, - event); - - if (retval == CLUTTER_TRANSLATE_QUEUE) - return TRUE; - - if (retval == CLUTTER_TRANSLATE_REMOVE) - return FALSE; - } - - return FALSE; + /* chain up to the parent implementation, which will handle + * event translators + */ + parent_class = CLUTTER_BACKEND_CLASS (clutter_backend_x11_parent_class); + return parent_class->translate_event (backend, native, event); } static void @@ -1194,28 +1190,6 @@ clutter_x11_get_visual_info (void) return _clutter_backend_x11_get_visual_info (backend_x11); } -void -_clutter_backend_x11_add_event_translator (ClutterBackendX11 *backend_x11, - ClutterEventTranslator *translator) -{ - if (g_list_find (backend_x11->event_translators, translator) != NULL) - return; - - backend_x11->event_translators = - g_list_prepend (backend_x11->event_translators, translator); -} - -void -_clutter_backend_x11_remove_event_translator (ClutterBackendX11 *backend_x11, - ClutterEventTranslator *translator) -{ - if (g_list_find (backend_x11->event_translators, translator) == NULL) - return; - - backend_x11->event_translators = - g_list_remove (backend_x11->event_translators, translator); -} - gboolean _clutter_x11_input_device_translate_screen_coord (ClutterInputDevice *device, gint stage_root_x, diff --git a/clutter/x11/clutter-backend-x11.h b/clutter/x11/clutter-backend-x11.h index 9cfad8fda..0c4a5d8cc 100644 --- a/clutter/x11/clutter-backend-x11.h +++ b/clutter/x11/clutter-backend-x11.h @@ -30,7 +30,6 @@ #include "clutter-x11.h" #include "clutter-backend-private.h" -#include "clutter-event-translator.h" #include "clutter-keymap-x11.h" #include "xsettings/xsettings-client.h" @@ -109,8 +108,6 @@ struct _ClutterBackendX11 gboolean use_xkb; gboolean have_xkb_autorepeat; guint keymap_serial; - - GList *event_translators; }; struct _ClutterBackendX11Class @@ -146,14 +143,6 @@ _clutter_event_x11_copy (ClutterEventX11 *event_x11); void _clutter_event_x11_free (ClutterEventX11 *event_x11); -void -_clutter_backend_x11_add_event_translator (ClutterBackendX11 *backend_x11, - ClutterEventTranslator *translator); - -void -_clutter_backend_x11_remove_event_translator (ClutterBackendX11 *backend_x11, - ClutterEventTranslator *translator); - gboolean _clutter_x11_input_device_translate_screen_coord (ClutterInputDevice *device, gint stage_root_x, diff --git a/clutter/x11/clutter-keymap-x11.c b/clutter/x11/clutter-keymap-x11.c index 9cfef5a6c..4c0378cfb 100644 --- a/clutter/x11/clutter-keymap-x11.c +++ b/clutter/x11/clutter-keymap-x11.c @@ -250,10 +250,6 @@ clutter_keymap_x11_constructed (GObject *gobject) XkbAllStateComponentsMask, XkbGroupLockMask | XkbModifierLockMask); - /* add ourselves as an event translator for XKB events */ - t = CLUTTER_EVENT_TRANSLATOR (keymap_x11); - _clutter_backend_x11_add_event_translator (backend_x11, t); - /* enable XKB autorepeat */ XkbSetDetectableAutoRepeat (backend_x11->xdpy, True, @@ -298,11 +294,10 @@ clutter_keymap_x11_finalize (GObject *gobject) ClutterEventTranslator *translator; keymap = CLUTTER_KEYMAP_X11 (gobject); - backend = CLUTTER_BACKEND_X11 (keymap->backend); translator = CLUTTER_EVENT_TRANSLATOR (keymap); #ifdef HAVE_XKB - _clutter_backend_x11_remove_event_translator (backend, translator); + _clutter_backend_remove_event_translator (keymap->backend, translator); if (keymap->xkb_desc != NULL) XkbFreeKeyboard (keymap->xkb_desc, XkbAllComponentsMask, True); diff --git a/clutter/x11/clutter-stage-x11.c b/clutter/x11/clutter-stage-x11.c index 0f20864d2..a601b365a 100644 --- a/clutter/x11/clutter-stage-x11.c +++ b/clutter/x11/clutter-stage-x11.c @@ -707,9 +707,10 @@ static void clutter_stage_x11_dispose (GObject *gobject) { ClutterEventTranslator *translator = CLUTTER_EVENT_TRANSLATOR (gobject); - ClutterBackendX11 *backend_x11 = CLUTTER_STAGE_X11 (gobject)->backend; + ClutterBackendX11 *backend = CLUTTER_STAGE_X11 (gobject)->backend; - _clutter_backend_x11_remove_event_translator (backend_x11, translator); + _clutter_backend_remove_event_translator (CLUTTER_BACKEND (backend), + translator); G_OBJECT_CLASS (clutter_stage_x11_parent_class)->dispose (gobject); }