summaryrefslogtreecommitdiff
path: root/gdk/wayland
diff options
context:
space:
mode:
authorRob Bradford <rob@linux.intel.com>2012-07-16 12:33:35 +0100
committerRob Bradford <rob@linux.intel.com>2012-07-16 13:44:29 +0100
commit1d080a01c19b06b6bf62c62c633ea3d18e2dcafd (patch)
tree732f8c5aeb9ce1c289620d726feca647c5f1d5aa /gdk/wayland
parent19d16f8b8058e71464ff672737fe8f20acc37e14 (diff)
downloadgtk+-1d080a01c19b06b6bf62c62c633ea3d18e2dcafd.tar.gz
wayland: Process the keymap that is sent over from the compositor
Load the keymap from the file descriptor that the compositor has sent us and then save that into our internal object for future use.
Diffstat (limited to 'gdk/wayland')
-rw-r--r--gdk/wayland/gdkdevice-wayland.c32
-rw-r--r--gdk/wayland/gdkdisplay-wayland.c2
-rw-r--r--gdk/wayland/gdkdisplay-wayland.h2
-rw-r--r--gdk/wayland/gdkkeys-wayland.c31
-rw-r--r--gdk/wayland/gdkprivate-wayland.h4
5 files changed, 71 insertions, 0 deletions
diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c
index 6e15fa8621..c45eb217a8 100644
--- a/gdk/wayland/gdkdevice-wayland.c
+++ b/gdk/wayland/gdkdevice-wayland.c
@@ -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
diff --git a/gdk/wayland/gdkdisplay-wayland.c b/gdk/wayland/gdkdisplay-wayland.c
index 13cfb0c748..84660a17dd 100644
--- a/gdk/wayland/gdkdisplay-wayland.c
+++ b/gdk/wayland/gdkdisplay-wayland.c
@@ -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
diff --git a/gdk/wayland/gdkdisplay-wayland.h b/gdk/wayland/gdkdisplay-wayland.h
index 8b6dd5cc2f..c31a82b98f 100644
--- a/gdk/wayland/gdkdisplay-wayland.h
+++ b/gdk/wayland/gdkdisplay-wayland.h
@@ -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;
diff --git a/gdk/wayland/gdkkeys-wayland.c b/gdk/wayland/gdkkeys-wayland.c
index 0a13b93ea5..b4b205b6a2 100644
--- a/gdk/wayland/gdkkeys-wayland.c
+++ b/gdk/wayland/gdkkeys-wayland.c
@@ -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;
diff --git a/gdk/wayland/gdkprivate-wayland.h b/gdk/wayland/gdkprivate-wayland.h
index 6b4d3b8a2d..607e99a122 100644
--- a/gdk/wayland/gdkprivate-wayland.h
+++ b/gdk/wayland/gdkprivate-wayland.h
@@ -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);