diff --git a/clutter/x11/Makefile.am b/clutter/x11/Makefile.am
index 6e227bb71..b8c7c03da 100644
--- a/clutter/x11/Makefile.am
+++ b/clutter/x11/Makefile.am
@@ -46,6 +46,8 @@ libclutter_x11_la_SOURCES = \
$(srcdir)/clutter-event-x11.c \
$(srcdir)/clutter-input-device-x11.h \
$(srcdir)/clutter-input-device-x11.c \
+ $(srcdir)/clutter-keymap-x11.h \
+ $(srcdir)/clutter-keymap-x11.c \
$(srcdir)/clutter-settings-x11.h \
$(srcdir)/clutter-stage-x11.h \
$(srcdir)/clutter-stage-x11.c \
diff --git a/clutter/x11/clutter-backend-x11.c b/clutter/x11/clutter-backend-x11.c
index 8bc13ec49..8a78c1937 100644
--- a/clutter/x11/clutter-backend-x11.c
+++ b/clutter/x11/clutter-backend-x11.c
@@ -319,6 +319,12 @@ clutter_backend_x11_post_parse (ClutterBackend *backend,
"backend", backend_x11,
NULL);
+ /* register keymap */
+ backend_x11->keymap =
+ g_object_new (CLUTTER_TYPE_KEYMAP_X11,
+ "backend", backend_x11,
+ NULL);
+
/* create XSETTINGS client */
backend_x11->xsettings =
_clutter_xsettings_client_new (backend_x11->xdpy,
diff --git a/clutter/x11/clutter-backend-x11.h b/clutter/x11/clutter-backend-x11.h
index 482634314..78a15cf0b 100644
--- a/clutter/x11/clutter-backend-x11.h
+++ b/clutter/x11/clutter-backend-x11.h
@@ -30,6 +30,7 @@
#include "clutter-x11.h"
+#include "clutter-keymap-x11.h"
#include "xsettings/xsettings-client.h"
G_BEGIN_DECLS
@@ -88,6 +89,8 @@ struct _ClutterBackendX11
XSettingsClient *xsettings;
Window xsettings_xwin;
+
+ ClutterKeymapX11 *keymap;
};
struct _ClutterBackendX11Class
diff --git a/clutter/x11/clutter-event-x11.c b/clutter/x11/clutter-event-x11.c
index 9643f189a..9e65d9fa1 100644
--- a/clutter/x11/clutter-event-x11.c
+++ b/clutter/x11/clutter-event-x11.c
@@ -30,6 +30,7 @@
#include "clutter-stage-x11.h"
#include "clutter-backend-x11.h"
+#include "clutter-keymap-x11.h"
#include "clutter-x11.h"
#include "../clutter-backend.h"
@@ -343,19 +344,6 @@ translate_key_event (ClutterBackend *backend,
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;
@@ -366,6 +354,9 @@ translate_key_event (ClutterBackend *backend,
xevent->xkey.keycode,
0);
+ event_x11->key_group =
+ _clutter_keymap_x11_get_key_group (event->key.modifier_state);
+
/* unicode_value is the printable representation */
n = XLookupString (&xevent->xkey, buffer, sizeof (buffer) - 1, NULL, NULL);
diff --git a/clutter/x11/clutter-keymap-x11.c b/clutter/x11/clutter-keymap-x11.c
new file mode 100644
index 000000000..4e5561bd8
--- /dev/null
+++ b/clutter/x11/clutter-keymap-x11.c
@@ -0,0 +1,123 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2010 Intel Corp.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see .
+ *
+ * Author: Emmanuele Bassi
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "clutter-keymap-x11.h"
+
+#include "clutter-debug.h"
+#include "clutter-private.h"
+
+#include
+
+#ifdef HAVE_XINPUT
+#include
+#endif
+
+#ifdef HAVE_XKB
+#include
+#endif
+
+typedef struct _ClutterKeymapX11Class ClutterKeymapX11Class;
+
+struct _ClutterKeymapX11
+{
+ GObject parent_instance;
+
+ ClutterBackend *backend;
+};
+
+struct _ClutterKeymapX11Class
+{
+ GObjectClass parent_class;
+};
+
+enum
+{
+ PROP_0,
+
+ PROP_BACKEND
+};
+
+G_DEFINE_TYPE (ClutterKeymapX11, clutter_keymap_x11, G_TYPE_OBJECT);
+
+static void
+clutter_keymap_x11_set_property (GObject *gobject,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ ClutterKeymapX11 *keymap = CLUTTER_KEYMAP_X11 (gobject);
+
+ switch (prop_id)
+ {
+ case PROP_BACKEND:
+ keymap->backend = g_value_get_object (value);
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+clutter_keymap_x11_finalize (GObject *gobject)
+{
+ G_OBJECT_CLASS (clutter_keymap_x11_parent_class)->finalize (gobject);
+}
+
+static void
+clutter_keymap_x11_class_init (ClutterKeymapX11Class *klass)
+{
+ GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ GParamSpec *pspec;
+
+ gobject_class->set_property = clutter_keymap_x11_set_property;
+ gobject_class->finalize = clutter_keymap_x11_finalize;
+
+ pspec = g_param_spec_object ("backend",
+ "Backend",
+ "The Clutter backend",
+ CLUTTER_TYPE_BACKEND,
+ CLUTTER_PARAM_WRITABLE |
+ G_PARAM_CONSTRUCT_ONLY);
+ g_object_class_install_property (gobject_class, PROP_BACKEND, pspec);
+}
+
+static void
+clutter_keymap_x11_init (ClutterKeymapX11 *keymap)
+{
+}
+
+gint
+_clutter_keymap_x11_get_key_group (ClutterModifierType state)
+{
+#ifdef HAVE_XKB
+ return XkbGroupForCoreState (state);
+#else
+ return 0;
+#endif /* HAVE_XKB */
+}
diff --git a/clutter/x11/clutter-keymap-x11.h b/clutter/x11/clutter-keymap-x11.h
new file mode 100644
index 000000000..a64c8b2b7
--- /dev/null
+++ b/clutter/x11/clutter-keymap-x11.h
@@ -0,0 +1,44 @@
+/*
+ * Clutter.
+ *
+ * An OpenGL based 'interactive canvas' library.
+ *
+ * Copyright (C) 2009 Intel Corp.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see .
+ *
+ * Author: Emmanuele Bassi
+ */
+
+#ifndef __CLUTTER_KEYMAP_X11_H__
+#define __CLUTTER_KEYMAP_X11_H__
+
+#include
+#include
+
+G_BEGIN_DECLS
+
+#define CLUTTER_TYPE_KEYMAP_X11 (clutter_keymap_x11_get_type ())
+#define CLUTTER_KEYMAP_X11(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_KEYMAP_X11, ClutterKeymapX11))
+#define CLUTTER_IS_KEYMAP_X11(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_KEYMAP_X11))
+
+typedef struct _ClutterKeymapX11 ClutterKeymapX11;
+
+GType clutter_keymap_x11_get_type (void) G_GNUC_CONST;
+
+gint _clutter_keymap_x11_get_key_group (ClutterModifierType state);
+
+G_END_DECLS
+
+#endif /* __CLUTTER_KEYMAP_X11_H__ */