clutter: Drop ClutterEventTranslator interface

We don't need that much complexity when we have a fixed set of
translators, and only one of them wants a given event.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/672
This commit is contained in:
Carlos Garnacho 2019-03-26 19:19:45 +01:00 committed by Jonas Ådahl
parent 54101b1948
commit e56df455ae
13 changed files with 97 additions and 285 deletions

View File

@ -27,8 +27,6 @@
#include <clutter/clutter-keymap.h>
#include <clutter/clutter-stage-window.h>
#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))
#define CLUTTER_BACKEND_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), CLUTTER_TYPE_BACKEND, ClutterBackendClass))
@ -58,7 +56,7 @@ struct _ClutterBackend
gfloat units_per_em;
gint32 units_serial;
GList *event_translators;
ClutterStageWindow *stage_window;
ClutterInputMethod *input_method;
@ -140,13 +138,6 @@ gboolean _clutter_backend_translate_event (Clutter
gpointer native,
ClutterEvent *event);
CLUTTER_EXPORT
void _clutter_backend_add_event_translator (ClutterBackend *backend,
ClutterEventTranslator *translator);
void _clutter_backend_remove_event_translator (ClutterBackend *backend,
ClutterEventTranslator *translator);
ClutterFeatureFlags _clutter_backend_get_features (ClutterBackend *backend);
gfloat _clutter_backend_get_units_per_em (ClutterBackend *backend,
@ -160,6 +151,9 @@ void _clutter_backend_reset_cogl_framebuffer (Clutter
void clutter_set_allowed_drivers (const char *drivers);
CLUTTER_EXPORT
ClutterStageWindow * clutter_backend_get_stage_window (ClutterBackend *backend);
G_END_DECLS
#endif /* __CLUTTER_BACKEND_PRIVATE_H__ */

View File

@ -104,10 +104,12 @@ clutter_backend_dispose (GObject *gobject)
/* clear the events still in the queue of the main context */
_clutter_clear_events_queue ();
/* remove all event translators */
g_clear_pointer (&backend->event_translators, g_list_free);
g_clear_pointer (&backend->dummy_onscreen, cogl_object_unref);
if (backend->stage_window)
{
g_object_remove_weak_pointer (G_OBJECT (backend->stage_window),
(gpointer *) &backend->stage_window);
}
G_OBJECT_CLASS (clutter_backend_parent_class)->dispose (gobject);
}
@ -586,34 +588,6 @@ clutter_backend_real_get_keymap (ClutterBackend *backend)
return backend->keymap;
}
static gboolean
clutter_backend_real_translate_event (ClutterBackend *backend,
gpointer native,
ClutterEvent *event)
{
GList *l;
for (l = backend->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)
{
@ -678,7 +652,6 @@ clutter_backend_class_init (ClutterBackendClass *klass)
klass->init_events = clutter_backend_real_init_events;
klass->get_device_manager = clutter_backend_real_get_device_manager;
klass->translate_event = clutter_backend_real_translate_event;
klass->create_context = clutter_backend_real_create_context;
klass->get_features = clutter_backend_real_get_features;
klass->get_keymap = clutter_backend_real_get_keymap;
@ -758,6 +731,10 @@ _clutter_backend_create_stage (ClutterBackend *backend,
g_assert (CLUTTER_IS_STAGE_WINDOW (stage_window));
backend->stage_window = stage_window;
g_object_add_weak_pointer (G_OBJECT (backend->stage_window),
(gpointer *) &backend->stage_window);
return stage_window;
}
@ -1018,28 +995,6 @@ _clutter_backend_translate_event (ClutterBackend *backend,
event);
}
void
_clutter_backend_add_event_translator (ClutterBackend *backend,
ClutterEventTranslator *translator)
{
if (g_list_find (backend->event_translators, translator) != NULL)
return;
backend->event_translators =
g_list_prepend (backend->event_translators, translator);
}
void
_clutter_backend_remove_event_translator (ClutterBackend *backend,
ClutterEventTranslator *translator)
{
if (g_list_find (backend->event_translators, translator) == NULL)
return;
backend->event_translators =
g_list_remove (backend->event_translators, translator);
}
/**
* clutter_backend_get_cogl_context: (skip)
* @backend: a #ClutterBackend
@ -1187,3 +1142,9 @@ clutter_backend_get_keymap (ClutterBackend *backend)
{
return CLUTTER_BACKEND_GET_CLASS (backend)->get_keymap (backend);
}
ClutterStageWindow *
clutter_backend_get_stage_window (ClutterBackend *backend)
{
return backend->stage_window;
}

View File

@ -1,38 +0,0 @@
#include "clutter-build-config.h"
#include "clutter-event-translator.h"
#include "clutter-backend.h"
#include "clutter-private.h"
#define clutter_event_translator_get_type _clutter_event_translator_get_type
typedef ClutterEventTranslatorIface ClutterEventTranslatorInterface;
G_DEFINE_INTERFACE (ClutterEventTranslator, clutter_event_translator, G_TYPE_OBJECT);
static ClutterTranslateReturn
default_translate_event (ClutterEventTranslator *translator,
gpointer native,
ClutterEvent *event)
{
return CLUTTER_TRANSLATE_CONTINUE;
}
static void
clutter_event_translator_default_init (ClutterEventTranslatorIface *iface)
{
iface->translate_event = default_translate_event;
}
ClutterTranslateReturn
_clutter_event_translator_translate_event (ClutterEventTranslator *translator,
gpointer native,
ClutterEvent *translated)
{
ClutterEventTranslatorIface *iface;
iface = CLUTTER_EVENT_TRANSLATOR_GET_IFACE (translator);
return iface->translate_event (translator, native, translated);
}

View File

@ -1,42 +0,0 @@
#ifndef __CLUTTER_EVENT_TRANSLATOR_H__
#define __CLUTTER_EVENT_TRANSLATOR_H__
#include <glib-object.h>
#include <clutter/clutter-event.h>
G_BEGIN_DECLS
#define CLUTTER_TYPE_EVENT_TRANSLATOR (_clutter_event_translator_get_type ())
#define CLUTTER_EVENT_TRANSLATOR(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_EVENT_TRANSLATOR, ClutterEventTranslator))
#define CLUTTER_IS_EVENT_TRANSLATOR(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_EVENT_TRANSLATOR))
#define CLUTTER_EVENT_TRANSLATOR_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), CLUTTER_TYPE_EVENT_TRANSLATOR, ClutterEventTranslatorIface))
typedef struct _ClutterEventTranslator ClutterEventTranslator;
typedef struct _ClutterEventTranslatorIface ClutterEventTranslatorIface;
typedef enum
{
CLUTTER_TRANSLATE_CONTINUE,
CLUTTER_TRANSLATE_REMOVE,
CLUTTER_TRANSLATE_QUEUE
} ClutterTranslateReturn;
struct _ClutterEventTranslatorIface
{
GTypeInterface g_iface;
ClutterTranslateReturn (* translate_event) (ClutterEventTranslator *translator,
gpointer native,
ClutterEvent *translated);
};
CLUTTER_EXPORT
GType _clutter_event_translator_get_type (void) G_GNUC_CONST;
ClutterTranslateReturn _clutter_event_translator_translate_event (ClutterEventTranslator *translator,
gpointer native,
ClutterEvent *translated);
G_END_DECLS
#endif /* __CLUTTER_EVENT_TRANSLATOR_H__ */

View File

@ -191,7 +191,6 @@ clutter_private_headers = [
'clutter-device-manager-private.h',
'clutter-easing.h',
'clutter-effect-private.h',
'clutter-event-translator.h',
'clutter-event-private.h',
'clutter-flatten-effect.h',
'clutter-gesture-action-private.h',
@ -215,7 +214,6 @@ clutter_private_headers = [
clutter_nonintrospected_sources = [
'clutter-easing.c',
'clutter-event-translator.c',
'clutter-id-pool.c',
]

View File

@ -232,7 +232,6 @@ clutter_backend_x11_xsettings_notify (const char *name,
static void
clutter_backend_x11_create_device_manager (ClutterBackendX11 *backend_x11)
{
ClutterEventTranslator *translator;
ClutterBackend *backend;
if (clutter_enable_xinput)
@ -266,9 +265,6 @@ clutter_backend_x11_create_device_manager (ClutterBackendX11 *backend_x11)
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
@ -290,22 +286,15 @@ 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);
g_signal_connect (backend_x11->keymap,
"state-changed",
G_CALLBACK (on_keymap_state_change),
backend->device_manager);
backend_x11->device_manager);
}
}
@ -614,7 +603,8 @@ clutter_backend_x11_translate_event (ClutterBackend *backend,
ClutterEvent *event)
{
ClutterBackendX11 *backend_x11 = CLUTTER_BACKEND_X11 (backend);
ClutterBackendClass *parent_class;
ClutterDeviceManagerXI2 *device_manager_x11;
ClutterStageX11 *stage_x11;
XEvent *xevent = native;
/* X11 filter functions have a higher priority */
@ -650,11 +640,20 @@ clutter_backend_x11_translate_event (ClutterBackend *backend,
*/
update_last_event_time (backend_x11, xevent);
/* 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);
if (clutter_keymap_x11_handle_event (backend_x11->keymap,
native))
return TRUE;
stage_x11 = CLUTTER_STAGE_X11 (clutter_backend_get_stage_window (backend));
if (clutter_stage_x11_translate_event (stage_x11, native, event))
return TRUE;
device_manager_x11 = CLUTTER_DEVICE_MANAGER_XI2 (backend_x11->device_manager);
if (clutter_device_manager_xi2_translate_event (device_manager_x11,
native, event))
return TRUE;
return FALSE;
}
static CoglRenderer *
@ -779,7 +778,6 @@ clutter_backend_x11_create_stage (ClutterBackend *backend,
ClutterStage *wrapper,
GError **error)
{
ClutterEventTranslator *translator;
ClutterStageWindow *stage;
stage = g_object_new (CLUTTER_TYPE_STAGE_X11,
@ -787,10 +785,6 @@ clutter_backend_x11_create_stage (ClutterBackend *backend,
"wrapper", wrapper,
NULL);
/* the X11 stage does event translation */
translator = CLUTTER_EVENT_TRANSLATOR (stage);
_clutter_backend_add_event_translator (backend, translator);
CLUTTER_NOTE (BACKEND, "X11 stage created (display:%p, screen:%d, root:%u)",
CLUTTER_BACKEND_X11 (backend)->xdpy,
CLUTTER_BACKEND_X11 (backend)->xscreen_num,

View File

@ -38,7 +38,6 @@
#include "clutter-debug.h"
#include "clutter-device-manager-private.h"
#include "clutter-event-private.h"
#include "clutter-event-translator.h"
#include "clutter-stage-private.h"
#include "clutter-private.h"
#include "clutter-xkb-a11y-x11.h"
@ -97,7 +96,6 @@ enum
static Atom clutter_input_axis_atoms[N_AXIS_ATOMS] = { 0, };
static void clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface);
static void clutter_event_extender_iface_init (ClutterEventExtenderInterface *iface);
#define clutter_device_manager_xi2_get_type _clutter_device_manager_xi2_get_type
@ -105,8 +103,6 @@ static void clutter_event_extender_iface_init (ClutterEventExtenderInterface *
G_DEFINE_TYPE_WITH_CODE (ClutterDeviceManagerXI2,
clutter_device_manager_xi2,
CLUTTER_TYPE_DEVICE_MANAGER,
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_EVENT_TRANSLATOR,
clutter_event_translator_iface_init)
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_EVENT_EXTENDER,
clutter_event_extender_iface_init))
@ -855,7 +851,7 @@ clutter_device_manager_xi2_select_events (ClutterDeviceManager *manager,
}
static ClutterStage *
get_event_stage (ClutterEventTranslator *translator,
get_event_stage (ClutterDeviceManagerXI2 *manager_xi2,
XIEvent *xi_event)
{
Window xwindow = None;
@ -1324,51 +1320,47 @@ handle_raw_event (ClutterDeviceManagerXI2 *manager_xi2,
}
}
static ClutterTranslateReturn
clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
gpointer native,
gboolean
clutter_device_manager_xi2_translate_event (ClutterDeviceManagerXI2 *manager_xi2,
XEvent *xevent,
ClutterEvent *event)
{
ClutterDeviceManagerXI2 *manager_xi2 = CLUTTER_DEVICE_MANAGER_XI2 (translator);
ClutterTranslateReturn retval = CLUTTER_TRANSLATE_CONTINUE;
gboolean retval = FALSE;
ClutterBackendX11 *backend_x11;
ClutterStageX11 *stage_x11 = NULL;
ClutterStage *stage = NULL;
ClutterInputDevice *device, *source_device;
XGenericEventCookie *cookie;
XIEvent *xi_event;
XEvent *xevent;
backend_x11 = CLUTTER_BACKEND_X11 (clutter_get_default_backend ());
xevent = native;
cookie = &xevent->xcookie;
if (cookie->type != GenericEvent ||
cookie->extension != manager_xi2->opcode)
return CLUTTER_TRANSLATE_CONTINUE;
return FALSE;
xi_event = (XIEvent *) cookie->data;
if (!xi_event)
return CLUTTER_TRANSLATE_REMOVE;
return FALSE;
if (cookie->evtype == XI_RawMotion ||
cookie->evtype == XI_RawButtonPress ||
cookie->evtype == XI_RawButtonRelease)
{
handle_raw_event (manager_xi2, xevent);
return CLUTTER_TRANSLATE_REMOVE;
return FALSE;
}
if (!(xi_event->evtype == XI_HierarchyChanged ||
xi_event->evtype == XI_DeviceChanged ||
xi_event->evtype == XI_PropertyEvent))
{
stage = get_event_stage (translator, xi_event);
stage = get_event_stage (manager_xi2, xi_event);
if (stage == NULL || CLUTTER_ACTOR_IN_DESTRUCTION (stage))
return CLUTTER_TRANSLATE_CONTINUE;
return FALSE;
else
stage_x11 = CLUTTER_STAGE_X11 (_clutter_stage_get_window (stage));
}
@ -1383,7 +1375,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
translate_hierarchy_event (backend_x11, manager_xi2, xev);
}
retval = CLUTTER_TRANSLATE_REMOVE;
retval = FALSE;
break;
case XI_DeviceChanged:
@ -1406,7 +1398,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
if (source_device)
_clutter_input_device_reset_scroll_info (source_device);
}
retval = CLUTTER_TRANSLATE_REMOVE;
retval = FALSE;
break;
case XI_KeyPress:
@ -1488,7 +1480,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
if (xi_event->evtype == XI_KeyPress)
_clutter_stage_x11_set_user_time (stage_x11, event->key.time);
retval = CLUTTER_TRANSLATE_QUEUE;
retval = TRUE;
}
break;
@ -1520,11 +1512,11 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
if (xev->detail >= 4 && xev->detail <= 7)
{
retval = CLUTTER_TRANSLATE_REMOVE;
retval = FALSE;
if (xi_event->evtype == XI_ButtonPress &&
translate_pad_event (event, xev, source_device))
retval = CLUTTER_TRANSLATE_QUEUE;
retval = TRUE;
break;
}
@ -1564,7 +1556,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->any.time,
event->pad_button.button);
retval = CLUTTER_TRANSLATE_QUEUE;
retval = TRUE;
break;
}
@ -1576,7 +1568,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
case 7:
/* we only generate Scroll events on ButtonPress */
if (xi_event->evtype == XI_ButtonRelease)
return CLUTTER_TRANSLATE_REMOVE;
return FALSE;
event->scroll.type = event->type = CLUTTER_SCROLL;
@ -1682,7 +1674,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
if (xi_event->evtype == XI_ButtonPress)
_clutter_stage_x11_set_user_time (stage_x11, event->button.time);
retval = CLUTTER_TRANSLATE_QUEUE;
retval = TRUE;
}
break;
@ -1701,7 +1693,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->any.stage = stage;
if (translate_pad_event (event, xev, source_device))
retval = CLUTTER_TRANSLATE_QUEUE;
retval = TRUE;
break;
}
@ -1739,7 +1731,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->scroll.y,
delta_x, delta_y);
retval = CLUTTER_TRANSLATE_QUEUE;
retval = TRUE;
break;
}
@ -1778,7 +1770,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->motion.y,
event->motion.axes != NULL ? "yes" : "no");
retval = CLUTTER_TRANSLATE_QUEUE;
retval = TRUE;
}
break;
@ -1844,7 +1836,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->touch.y,
event->touch.axes != NULL ? "yes" : "no");
retval = CLUTTER_TRANSLATE_QUEUE;
retval = TRUE;
}
break;
@ -1890,7 +1882,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
event->touch.y,
event->touch.axes != NULL ? "yes" : "no");
retval = CLUTTER_TRANSLATE_QUEUE;
retval = TRUE;
}
break;
@ -1926,7 +1918,7 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
"Discarding Leave for ButtonRelease "
"event off-stage");
retval = CLUTTER_TRANSLATE_REMOVE;
retval = FALSE;
break;
}
@ -1947,29 +1939,23 @@ clutter_device_manager_xi2_translate_event (ClutterEventTranslator *translator,
clutter_event_set_device (event, device);
clutter_event_set_source_device (event, source_device);
retval = CLUTTER_TRANSLATE_QUEUE;
retval = TRUE;
}
break;
case XI_FocusIn:
case XI_FocusOut:
retval = CLUTTER_TRANSLATE_CONTINUE;
retval = FALSE;
break;
case XI_PropertyEvent:
handle_property_event (manager_xi2, xi_event);
retval = CLUTTER_TRANSLATE_CONTINUE;
retval = FALSE;
break;
}
return retval;
}
static void
clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface)
{
iface->translate_event = clutter_device_manager_xi2_translate_event;
}
static void
clutter_device_manager_xi2_add_device (ClutterDeviceManager *manager,
ClutterInputDevice *device)

View File

@ -68,6 +68,10 @@ struct _ClutterDeviceManagerXI2Class
GType _clutter_device_manager_xi2_get_type (void) G_GNUC_CONST;
gboolean clutter_device_manager_xi2_translate_event (ClutterDeviceManagerXI2 *manager_xi2,
XEvent *xevent,
ClutterEvent *event);
G_END_DECLS
#endif /* __CLUTTER_DEVICE_MANAGER_XI2_H__ */

View File

@ -27,7 +27,6 @@
#include "clutter-backend-x11.h"
#include "clutter-debug.h"
#include "clutter-event-translator.h"
#include "clutter-private.h"
#include <X11/Xatom.h>
@ -105,14 +104,9 @@ enum
static GParamSpec *obj_props[PROP_LAST] = { NULL, };
static void clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface);
#define clutter_keymap_x11_get_type _clutter_keymap_x11_get_type
G_DEFINE_TYPE_WITH_CODE (ClutterKeymapX11, clutter_keymap_x11,
CLUTTER_TYPE_KEYMAP,
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_EVENT_TRANSLATOR,
clutter_event_translator_iface_init));
G_DEFINE_TYPE (ClutterKeymapX11, clutter_keymap_x11, CLUTTER_TYPE_KEYMAP)
/* code adapted from gdk/x11/gdkkeys-x11.c - update_modmap */
static void
@ -496,12 +490,10 @@ static void
clutter_keymap_x11_finalize (GObject *gobject)
{
ClutterKeymapX11 *keymap;
ClutterEventTranslator *translator;
GHashTableIter iter;
gpointer key, value;
keymap = CLUTTER_KEYMAP_X11 (gobject);
translator = CLUTTER_EVENT_TRANSLATOR (keymap);
clutter_keymap_x11_refresh_reserved_keycodes (keymap);
g_hash_table_iter_init (&iter, keymap->reserved_keycodes);
@ -514,8 +506,6 @@ clutter_keymap_x11_finalize (GObject *gobject)
g_hash_table_destroy (keymap->reserved_keycodes);
g_queue_free (keymap->available_keycodes);
_clutter_backend_remove_event_translator (keymap->backend, translator);
if (keymap->xkb_desc != NULL)
XkbFreeKeyboard (keymap->xkb_desc, XkbAllComponentsMask, True);
@ -570,21 +560,16 @@ clutter_keymap_x11_init (ClutterKeymapX11 *keymap)
keymap->available_keycodes = g_queue_new ();
}
static ClutterTranslateReturn
clutter_keymap_x11_translate_event (ClutterEventTranslator *translator,
gpointer native,
ClutterEvent *event)
gboolean
clutter_keymap_x11_handle_event (ClutterKeymapX11 *keymap_x11,
XEvent *xevent)
{
ClutterKeymapX11 *keymap_x11 = CLUTTER_KEYMAP_X11 (translator);
ClutterTranslateReturn retval;
XEvent *xevent;
gboolean retval;
if (!keymap_x11->use_xkb)
return CLUTTER_TRANSLATE_CONTINUE;
return FALSE;
xevent = native;
retval = CLUTTER_TRANSLATE_CONTINUE;
retval = FALSE;
if (xevent->type == keymap_x11->xkb_event_base)
{
@ -597,7 +582,7 @@ clutter_keymap_x11_translate_event (ClutterEventTranslator *translator,
keymap_x11->current_group = XkbStateGroup (&xkb_event->state);
update_direction (keymap_x11, keymap_x11->current_group);
update_locked_mods (keymap_x11, xkb_event->state.locked_mods);
retval = CLUTTER_TRANSLATE_REMOVE;
retval = TRUE;
break;
case XkbNewKeyboardNotify:
@ -605,7 +590,7 @@ clutter_keymap_x11_translate_event (ClutterEventTranslator *translator,
CLUTTER_NOTE (EVENT, "Updating keyboard mapping");
XkbRefreshKeyboardMapping (&xkb_event->map);
keymap_x11->keymap_serial += 1;
retval = CLUTTER_TRANSLATE_REMOVE;
retval = TRUE;
break;
default:
@ -616,18 +601,12 @@ clutter_keymap_x11_translate_event (ClutterEventTranslator *translator,
{
XRefreshKeyboardMapping (&xevent->xmapping);
keymap_x11->keymap_serial += 1;
retval = CLUTTER_TRANSLATE_REMOVE;
retval = TRUE;
}
return retval;
}
static void
clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface)
{
iface->translate_event = clutter_keymap_x11_translate_event;
}
gint
_clutter_keymap_x11_get_key_group (ClutterKeymapX11 *keymap,
ClutterModifierType state)

View File

@ -63,6 +63,10 @@ gboolean clutter_keymap_x11_reserve_keycode (ClutterKeymapX11 *keymap_x11,
guint *keycode_out);
void clutter_keymap_x11_release_keycode_if_needed (ClutterKeymapX11 *keymap_x11,
guint keycode);
gboolean clutter_keymap_x11_handle_event (ClutterKeymapX11 *keymap,
XEvent *xevent);
G_END_DECLS
#endif /* __CLUTTER_KEYMAP_X11_H__ */

View File

@ -38,7 +38,6 @@
#include "clutter-debug.h"
#include "clutter-device-manager-private.h"
#include "clutter-enum-types.h"
#include "clutter-event-translator.h"
#include "clutter-event-private.h"
#include "clutter-feature.h"
#include "clutter-main.h"
@ -53,8 +52,6 @@ static ClutterStageWindowInterface *clutter_stage_window_parent_iface = NULL;
static void
clutter_stage_window_iface_init (ClutterStageWindowInterface *iface);
static void
clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface);
static ClutterStageCogl *clutter_x11_get_stage_window_from_window (Window win);
@ -66,9 +63,7 @@ G_DEFINE_TYPE_WITH_CODE (ClutterStageX11,
clutter_stage_x11,
CLUTTER_TYPE_STAGE_COGL,
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_STAGE_WINDOW,
clutter_stage_window_iface_init)
G_IMPLEMENT_INTERFACE (CLUTTER_TYPE_EVENT_TRANSLATOR,
clutter_event_translator_iface_init));
clutter_stage_window_iface_init));
#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */
#define _NET_WM_STATE_ADD 1 /* add/set property */
@ -705,24 +700,12 @@ clutter_stage_x11_finalize (GObject *gobject)
G_OBJECT_CLASS (clutter_stage_x11_parent_class)->finalize (gobject);
}
static void
clutter_stage_x11_dispose (GObject *gobject)
{
ClutterEventTranslator *translator = CLUTTER_EVENT_TRANSLATOR (gobject);
ClutterBackend *backend = CLUTTER_STAGE_COGL (gobject)->backend;
_clutter_backend_remove_event_translator (backend, translator);
G_OBJECT_CLASS (clutter_stage_x11_parent_class)->dispose (gobject);
}
static void
clutter_stage_x11_class_init (ClutterStageX11Class *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->finalize = clutter_stage_x11_finalize;
gobject_class->dispose = clutter_stage_x11_dispose;
}
static void
@ -831,25 +814,22 @@ clipped_redraws_cool_off_cb (void *data)
return G_SOURCE_REMOVE;
}
static ClutterTranslateReturn
clutter_stage_x11_translate_event (ClutterEventTranslator *translator,
gpointer native,
gboolean
clutter_stage_x11_translate_event (ClutterStageX11 *stage_x11,
XEvent *xevent,
ClutterEvent *event)
{
ClutterStageX11 *stage_x11;
ClutterStageCogl *stage_cogl;
ClutterTranslateReturn res = CLUTTER_TRANSLATE_CONTINUE;
gboolean res = FALSE;
ClutterBackendX11 *backend_x11;
Window stage_xwindow;
XEvent *xevent = native;
ClutterStage *stage;
stage_cogl = clutter_x11_get_stage_window_from_window (xevent->xany.window);
if (stage_cogl == NULL)
return CLUTTER_TRANSLATE_CONTINUE;
return FALSE;
stage = stage_cogl->wrapper;
stage_x11 = CLUTTER_STAGE_X11 (stage_cogl);
backend_x11 = CLUTTER_BACKEND_X11 (stage_cogl->backend);
stage_xwindow = stage_x11->xwin;
@ -1008,7 +988,7 @@ clutter_stage_x11_translate_event (ClutterEventTranslator *translator,
(unsigned int) stage_xwindow);
event->any.type = CLUTTER_DESTROY_NOTIFY;
event->any.stage = stage;
res = CLUTTER_TRANSLATE_QUEUE;
res = TRUE;
break;
case ClientMessage:
@ -1020,24 +1000,18 @@ clutter_stage_x11_translate_event (ClutterEventTranslator *translator,
{
event->any.type = CLUTTER_DELETE;
event->any.stage = stage;
res = CLUTTER_TRANSLATE_QUEUE;
res = TRUE;
}
break;
default:
res = CLUTTER_TRANSLATE_CONTINUE;
res = FALSE;
break;
}
return res;
}
static void
clutter_event_translator_iface_init (ClutterEventTranslatorIface *iface)
{
iface->translate_event = clutter_stage_x11_translate_event;
}
/**
* clutter_x11_get_stage_window: (skip)
* @stage: a #ClutterStage

View File

@ -91,6 +91,10 @@ void _clutter_stage_x11_events_device_changed (ClutterStageX11 *stage_x11,
void _clutter_stage_x11_set_user_time (ClutterStageX11 *stage_x11,
guint32 user_time);
gboolean clutter_stage_x11_translate_event (ClutterStageX11 *stage_x11,
XEvent *xevent,
ClutterEvent *event);
G_END_DECLS
#endif /* __CLUTTER_STAGE_H__ */

View File

@ -58,7 +58,6 @@ meta_clutter_backend_x11_create_stage (ClutterBackend *backend,
ClutterStage *wrapper,
GError **error)
{
ClutterEventTranslator *translator;
ClutterStageWindow *stage;
GType stage_type;
@ -71,11 +70,6 @@ meta_clutter_backend_x11_create_stage (ClutterBackend *backend,
"backend", backend,
"wrapper", wrapper,
NULL);
/* the X11 stage does event translation */
translator = CLUTTER_EVENT_TRANSLATOR (stage);
_clutter_backend_add_event_translator (backend, translator);
return stage;
}