]> Pileus Git - ~andy/gtk/commitdiff
wayland: Process the keymap that is sent over from the compositor
authorRob Bradford <rob@linux.intel.com>
Mon, 16 Jul 2012 11:33:35 +0000 (12:33 +0100)
committerRob Bradford <rob@linux.intel.com>
Mon, 16 Jul 2012 12:44:29 +0000 (13:44 +0100)
Load the keymap from the file descriptor that the compositor has sent us and
then save that into our internal object for future use.

gdk/wayland/gdkdevice-wayland.c
gdk/wayland/gdkdisplay-wayland.c
gdk/wayland/gdkdisplay-wayland.h
gdk/wayland/gdkkeys-wayland.c
gdk/wayland/gdkprivate-wayland.h

index 6e15fa86211600fd7efe03df64be79ec7316dbd2..c45eb217a8b397ffcab95d115c4881ef68e4e348 100644 (file)
@@ -36,6 +36,7 @@
 #include <X11/keysym.h>
 
 #include <sys/time.h>
+#include <sys/mman.h>
 
 #define GDK_TYPE_DEVICE_CORE         (gdk_device_core_get_type ())
 #define GDK_DEVICE_CORE(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), GDK_TYPE_DEVICE_CORE, GdkDeviceCore))
@@ -1126,6 +1127,37 @@ keyboard_handle_keymap (void               *data,
                        int                 fd,
                        uint32_t            size)
 {
+  GdkWaylandDevice *device = data;
+  GdkWaylandDisplay *display = GDK_WAYLAND_DISPLAY (device->display);
+  GdkKeymap *gdk_keymap;
+  gchar *keymap_data;
+  struct xkb_keymap *keymap;
+
+  if (format != WL_KEYBOARD_KEYMAP_FORMAT_XKB_V1)
+    {
+      g_critical (G_STRLOC ": Unknown keymap format");
+      close (fd);
+      return;
+    }
+
+  keymap_data = mmap (NULL, size, PROT_READ, MAP_SHARED, fd, 0);
+  if (keymap_data == MAP_FAILED)
+    {
+      g_critical (G_STRLOC ": Unable to map fd for keymap %s", g_strerror (errno));
+      close (fd);
+      return;
+    }
+
+  keymap = xkb_map_new_from_string (display->xkb_context,
+                                    keymap_data,
+                                    format,
+                                    0);
+
+  munmap (keymap_data, size);
+  close (fd);
+
+  gdk_keymap = _gdk_wayland_display_get_keymap (device->display);
+  _gdk_wayland_keymap_update_keymap (gdk_keymap, keymap);
 }
 
 static void
index 13cfb0c7488b19dac05e186a2e337d0bd947bc57..84660a17ddadae7be44d88f56cdb74898fb00334 100644 (file)
@@ -619,6 +619,8 @@ _gdk_wayland_display_init (GdkWaylandDisplay *display)
 {
   _gdk_wayland_display_manager_add_display (gdk_display_manager_get (),
                                            GDK_DISPLAY (display));
+
+  display->xkb_context = xkb_context_new (0);
 }
 
 static void
index 8b6dd5cc2f3f817eef28bc40f0277d2254e09207..c31a82b98f138f1aeb14ffafd53b8827d2cc5df1 100644 (file)
@@ -87,6 +87,8 @@ struct _GdkWaylandDisplay
 
   GSource *event_source;
 
+  struct xkb_context *xkb_context;
+
 #ifdef GDK_WAYLAND_USE_EGL
   EGLDisplay egl_display;
   EGLContext egl_context;
index 0a13b93ea5c58467ac1ad55a6c3f70a67c036100..b4b205b6a2fbb2c3e79f3dc76b3a6872c5da298e 100644 (file)
@@ -49,6 +49,11 @@ struct _GdkWaylandKeymap
   GdkKeymap parent_instance;
   GdkModifierType modmap[8];
   struct xkb_desc *xkb;
+  struct xkb_keymap *keymap;
+  struct xkb_state *state;
+  xkb_mod_mask_t control_mask;
+  xkb_mod_mask_t alt_mask;
+  xkb_mod_mask_t shift_mask;
 };
 
 struct _GdkWaylandKeymapClass
@@ -661,6 +666,32 @@ _gdk_wayland_keymap_new (GdkDisplay *display)
   return GDK_KEYMAP (keymap);
 }
 
+void
+_gdk_wayland_keymap_update_keymap (GdkKeymap  *gdk_keymap,
+                                   struct xkb_keymap *xkb_keymap)
+{
+  GdkWaylandKeymap *keymap;
+
+  keymap = GDK_WAYLAND_KEYMAP (gdk_keymap);
+
+  if (keymap->keymap)
+    xkb_map_unref (keymap->keymap);
+
+  keymap->keymap = xkb_keymap;
+
+  if (keymap->state)
+    xkb_state_unref (keymap->state);
+
+  keymap->state = xkb_state_new (keymap->keymap);
+
+  keymap->control_mask =
+    1 << xkb_map_mod_get_index(keymap->keymap, "Control");
+  keymap->alt_mask =
+    1 << xkb_map_mod_get_index(keymap->keymap, "Mod1");
+  keymap->shift_mask =
+    1 << xkb_map_mod_get_index(keymap->keymap, "Shift");
+}
+
 struct xkb_desc *_gdk_wayland_keymap_get_xkb_desc (GdkKeymap *keymap)
 {
   return GDK_WAYLAND_KEYMAP (keymap)->xkb;
index 6b4d3b8a2d3fe1a5a8d51c47069807e66506f7b7..607e99a1228f9afd98997daca5bb8ec59166b470 100644 (file)
@@ -33,6 +33,8 @@
 #include <gdk/gdkprivate.h>
 #include <gdk/wayland/gdkdisplay-wayland.h>
 
+#include <xkbcommon/xkbcommon.h>
+
 #include "gdkinternals.h"
 
 #include "config.h"
@@ -89,6 +91,8 @@ void _gdk_wayland_display_create_window_impl (GdkDisplay    *display,
                                              gint           attributes_mask);
 
 GdkKeymap *_gdk_wayland_display_get_keymap (GdkDisplay *display);
+void       _gdk_wayland_keymap_update_keymap (GdkKeymap  *gdk_keymap,
+                                              struct xkb_keymap *xkb_keymap);
 
 GdkWindow *_gdk_wayland_display_get_selection_owner (GdkDisplay *display,
                                                 GdkAtom     selection);