Blame SOURCES/0039-xwayland-Handle-keymap-changes.patch

70130e
From d43a01c9cb622ea7300614dce3d0752e21ca180a Mon Sep 17 00:00:00 2001
70130e
From: Rui Matos <tiagomatos@gmail.com>
70130e
Date: Mon, 21 Oct 2013 14:41:54 +0200
70130e
Subject: [PATCH 39/39] xwayland: Handle keymap changes
70130e
70130e
---
70130e
 hw/xfree86/xwayland/xwayland-input.c | 39 +++++++++++++++++++++++++++++++++---
70130e
 include/input.h                      |  2 +-
70130e
 2 files changed, 37 insertions(+), 4 deletions(-)
70130e
70130e
diff --git a/hw/xfree86/xwayland/xwayland-input.c b/hw/xfree86/xwayland/xwayland-input.c
70130e
index d031b34..ebf1af1 100644
70130e
--- a/hw/xfree86/xwayland/xwayland-input.c
70130e
+++ b/hw/xfree86/xwayland/xwayland-input.c
70130e
@@ -143,7 +143,10 @@ xwl_keyboard_proc(DeviceIntPtr device, int what)
70130e
     switch (what) {
70130e
     case DEVICE_INIT:
70130e
 	device->public.on = FALSE;
70130e
-	len = strnlen(xwl_seat->keymap, xwl_seat->keymap_size);
70130e
+        if (xwl_seat->keymap)
70130e
+            len = strnlen(xwl_seat->keymap, xwl_seat->keymap_size);
70130e
+        else
70130e
+            len = 0;
70130e
         if (!InitKeyboardDeviceStructFromString(device, xwl_seat->keymap,
70130e
 						len,
70130e
 						NULL, xwl_keyboard_control))
70130e
@@ -453,12 +456,42 @@ keyboard_handle_keymap(void *data, struct wl_keyboard *keyboard,
70130e
 		       uint32_t format, int fd, uint32_t size)
70130e
 {
70130e
     struct xwl_seat *xwl_seat = data;
70130e
+    DeviceIntPtr master;
70130e
+    XkbDescPtr xkb;
70130e
+    XkbChangesRec changes = { 0 };
70130e
+
70130e
+    if (xwl_seat->keymap)
70130e
+        munmap(xwl_seat->keymap, xwl_seat->keymap_size);
70130e
 
70130e
     xwl_seat->keymap_size = size;
70130e
     xwl_seat->keymap = mmap(NULL, size, PROT_READ, MAP_SHARED, fd, 0);
70130e
-    if (xwl_seat->keymap == MAP_FAILED)
70130e
-	;	/* wah wah */
70130e
+    if (xwl_seat->keymap == MAP_FAILED) {
70130e
+        xwl_seat->keymap_size = 0;
70130e
+        xwl_seat->keymap = NULL;
70130e
+        goto out;
70130e
+    }
70130e
+
70130e
+    if (!xwl_seat->keyboard)
70130e
+        goto out;
70130e
+
70130e
+    xkb = XkbCompileKeymapFromString(xwl_seat->keyboard, xwl_seat->keymap,
70130e
+                                     strnlen(xwl_seat->keymap, xwl_seat->keymap_size));
70130e
+    if (!xkb)
70130e
+        goto out;
70130e
+
70130e
+    XkbUpdateDescActions(xkb, xkb->min_key_code, XkbNumKeys(xkb), &changes);
70130e
+    /* Keep the current controls */
70130e
+    XkbCopyControls(xkb, xwl_seat->keyboard->key->xkbInfo->desc);
70130e
+
70130e
+    XkbDeviceApplyKeymap(xwl_seat->keyboard, xkb);
70130e
+
70130e
+    master = GetMaster(xwl_seat->keyboard, MASTER_KEYBOARD);
70130e
+    if (master && master->lastSlave == xwl_seat->keyboard)
70130e
+        XkbDeviceApplyKeymap(master, xkb);
70130e
+
70130e
+    XkbFreeKeyboard(xkb, XkbAllComponentsMask, TRUE);
70130e
 
70130e
+ out:
70130e
     close(fd);
70130e
 }
70130e
 
70130e
diff --git a/include/input.h b/include/input.h
70130e
index 6573a3a..1edcedc 100644
70130e
--- a/include/input.h
70130e
+++ b/include/input.h
70130e
@@ -508,7 +508,7 @@ extern int AttachDevice(ClientPtr client,
70130e
                         DeviceIntPtr slave, DeviceIntPtr master);
70130e
 
70130e
 extern _X_EXPORT DeviceIntPtr GetPairedDevice(DeviceIntPtr kbd);
70130e
-extern DeviceIntPtr GetMaster(DeviceIntPtr dev, int type);
70130e
+extern _X_EXPORT DeviceIntPtr GetMaster(DeviceIntPtr dev, int type);
70130e
 
70130e
 extern _X_EXPORT int AllocDevicePair(ClientPtr client,
70130e
                                      const char *name,
70130e
-- 
70130e
1.8.3.1
70130e