[PATCH xserver] xkb: XkbSetMap on the lastSlave needs to change the master

Samir Benmendil me at rmz.io
Sat Mar 3 01:41:12 UTC 2018


The layout needs to be set on the master too if the layout is changed on
the device that was last used by the master.

Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=85256
Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=91571

Signed-off-by: Samir Benmendil <me at rmz.io>
---
 xkb/xkb.c | 26 +++++++++++++++++++++++++-
 1 file changed, 25 insertions(+), 1 deletion(-)

diff --git a/xkb/xkb.c b/xkb/xkb.c
index 678f82368..12460034b 100644
--- a/xkb/xkb.c
+++ b/xkb/xkb.c
@@ -2626,6 +2626,8 @@ ProcXkbSetMap(ClientPtr client)
     if (rc != Success)
         return rc;
 
+    DeviceIntPtr master = GetMaster(dev, MASTER_KEYBOARD);
+
     if (stuff->deviceSpec == XkbUseCoreKbd) {
         DeviceIntPtr other;
 
@@ -2641,9 +2643,21 @@ ProcXkbSetMap(ClientPtr client)
                 }
             }
         }
+    } else {
+        DeviceIntPtr other;
+
+        for (other = inputInfo.devices; other; other = other->next) {
+            if (other != dev && GetMaster(other, MASTER_KEYBOARD) != dev &&
+                (other != master || dev != master->lastSlave))
+                continue;
+
+            rc = _XkbSetMapChecks(client, other, stuff, tmp);
+            if (rc != Success)
+                return rc;
+        }
     }
 
-    /* We know now that we will succed with the SetMap. In theory anyway. */
+    /* We know now that we will succeed with the SetMap. In theory anyway. */
     rc = _XkbSetMap(client, dev, stuff, tmp);
     if (rc != Success)
         return rc;
@@ -2664,6 +2678,16 @@ ProcXkbSetMap(ClientPtr client)
                    sync. */
             }
         }
+    } else {
+        DeviceIntPtr other;
+
+        for (other = inputInfo.devices; other; other = other->next) {
+            if (other != dev && GetMaster(other, MASTER_KEYBOARD) != dev &&
+                (other != master || dev != master->lastSlave))
+                continue;
+
+            _XkbSetMap(client, other, stuff, tmp); //ignore rc
+        }
     }
 
     return Success;
-- 
2.14.2



More information about the xorg-devel mailing list