return CLUTTER_FEATURE_STAGE_USER_RESIZE | CLUTTER_FEATURE_STAGE_CURSOR;
}
+static void
+clutter_backend_x11_copy_event_data (ClutterBackend *backend,
+ ClutterEvent *src,
+ ClutterEvent *dest)
+{
+ gpointer event_x11;
+
+ event_x11 = _clutter_event_get_platform_data (src);
+ if (event_x11 != NULL)
+ _clutter_event_set_platform_data (dest, _clutter_event_x11_copy (event_x11));
+}
+
+static void
+clutter_backend_x11_free_event_data (ClutterBackend *backend,
+ ClutterEvent *event)
+{
+ gpointer event_x11;
+
+ event_x11 = _clutter_event_get_platform_data (event);
+ if (event_x11 != NULL)
+ _clutter_event_x11_free (event_x11);
+}
+
gboolean
clutter_backend_x11_handle_event (ClutterBackendX11 *backend_x11,
XEvent *xevent)
backend_class->add_options = clutter_backend_x11_add_options;
backend_class->get_features = clutter_backend_x11_get_features;
backend_class->get_device_manager = clutter_backend_x11_get_device_manager;
+ backend_class->copy_event_data = clutter_backend_x11_copy_event_data;
+ backend_class->free_event_data = clutter_backend_x11_free_event_data;
backendx11_class->handle_event = clutter_backend_x11_handle_event;
}
#include <X11/extensions/XInput.h>
#endif
+#ifdef HAVE_XKB
+#include <X11/XKBlib.h>
+#endif
+
/* XEMBED protocol support for toolkit embedding */
#define XEMBED_MAPPED (1 << 0)
#define MAX_SUPPORTED_XEMBED_VERSION 1
GPollFD event_poll_fd;
};
+struct _ClutterEventX11
+{
+ /* additional fields for Key events */
+ gint key_group;
+};
+
+ClutterEventX11 *
+_clutter_event_x11_new (void)
+{
+ return g_slice_new0 (ClutterEventX11);
+}
+
+ClutterEventX11 *
+_clutter_event_x11_copy (ClutterEventX11 *event_x11)
+{
+ if (event_x11 != NULL)
+ return g_slice_dup (ClutterEventX11, event_x11);
+
+ return NULL;
+}
+
+void
+_clutter_event_x11_free (ClutterEventX11 *event_x11)
+{
+ if (event_x11 != NULL)
+ g_slice_free (ClutterEventX11, event_x11);
+}
+
static gboolean clutter_event_prepare (GSource *source,
gint *timeout);
static gboolean clutter_event_check (GSource *source);
ClutterEvent *event,
XEvent *xevent)
{
- char buffer[256+1];
+ ClutterEventX11 *event_x11;
+ char buffer[256 + 1];
int n;
CLUTTER_NOTE (EVENT, "Translating key %s event",
xevent->xany.type == KeyPress ? "press" : "release");
+ /* KeyEvents have platform specific data associated to them */
+ event_x11 = _clutter_event_x11_new ();
+ _clutter_event_set_platform_data (event, event_x11);
+
+#ifdef HAVE_XKB
+ event_x11->key_group = XkbGroupForCoreState (xevent->xkey.state);
+
+ CLUTTER_NOTE (EVENT, "Key group: %d (xkb enabled: yes)",
+ event_x11->key_group);
+#else
+ /* we force the key group to 0 */
+ event_x11->key_group = 0;
+
+ CLUTTER_NOTE (EVENT, "Key group: %d (xkb enabled: no)",
+ event_x11->key_group);
+#endif /* HAVE_XKB */
+
event->key.time = xevent->xkey.time;
event->key.modifier_state = (ClutterModifierType) xevent->xkey.state;
event->key.hardware_keycode = xevent->xkey.keycode;
(event->key.unicode_value != -2))
return;
}
-
- event->key.unicode_value = (gunichar)'\0';
+ else
+ event->key.unicode_value = (gunichar)'\0';
}
static gboolean
if ((stage_x11->state & CLUTTER_STAGE_STATE_FULLSCREEN) ||
(stage_x11->xwin_width != xevent->xconfigure.width) ||
(stage_x11->xwin_height != xevent->xconfigure.height))
- clutter_actor_queue_relayout (CLUTTER_ACTOR (stage));
+ {
+ clutter_actor_queue_relayout (CLUTTER_ACTOR (stage));
+ }
/* If we're fullscreened, we want these variables to
* represent the size of the window before it was set
g_queue_push_head (clutter_context->events_queue, event);
}
else
- {
- clutter_event_free (event);
- }
+ clutter_event_free (event);
}
}
return CLUTTER_BACKEND_X11 (backend)->last_event_time;
}
+
+/**
+ * clutter_x11_event_get_key_group:
+ * @event: a #ClutterEvent of type %CLUTTER_KEY_PRESS or %CLUTTER_KEY_RELEASE
+ *
+ * Retrieves the group for the modifiers set in @event
+ *
+ * Return value: the group id
+ *
+ * Since: 1.4
+ */
+gint
+clutter_x11_event_get_key_group (const ClutterEvent *event)
+{
+ ClutterEventX11 *event_x11;
+
+ g_return_val_if_fail (event != NULL, 0);
+ g_return_val_if_fail (event->type == CLUTTER_KEY_PRESS ||
+ event->type == CLUTTER_KEY_RELEASE, 0);
+
+ event_x11 = _clutter_event_get_platform_data (event);
+ if (event_x11 == NULL)
+ return 0;
+
+ return event_x11->key_group;
+}