Peter Hutterer 9f7e9a8
From 0ad717edcf372425ddf2ba9926857419ab62f4f5 Mon Sep 17 00:00:00 2001
Peter Hutterer 9f7e9a8
From: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer 9f7e9a8
Date: Wed, 29 May 2019 16:19:55 +1000
Peter Hutterer 9f7e9a8
Subject: [PATCH xserver] Xi: return AlreadyGrabbed for key grabs > 255
Peter Hutterer 9f7e9a8
Peter Hutterer 9f7e9a8
We can't have high keycodes because everything in XKB relies on 8 bits. XI2's
Peter Hutterer 9f7e9a8
API allows for 32-bit keycodes so we have to take those but nothing in the
Peter Hutterer 9f7e9a8
server is really ready for this. The effect of this right now is that any high
Peter Hutterer 9f7e9a8
keycode grab is clipped to 255 and thus ends up grabbing a different key
Peter Hutterer 9f7e9a8
instead.
Peter Hutterer 9f7e9a8
Peter Hutterer 9f7e9a8
https://bugzilla.redhat.com/show_bug.cgi?id=1697804
Peter Hutterer 9f7e9a8
Peter Hutterer 9f7e9a8
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer 9f7e9a8
---
Peter Hutterer 9f7e9a8
 Xi/xipassivegrab.c | 10 ++++++++--
Peter Hutterer 9f7e9a8
 1 file changed, 8 insertions(+), 2 deletions(-)
Peter Hutterer 9f7e9a8
Peter Hutterer 9f7e9a8
diff --git a/Xi/xipassivegrab.c b/Xi/xipassivegrab.c
Peter Hutterer 9f7e9a8
index 65d5870f6..d30f51f3c 100644
Peter Hutterer 9f7e9a8
--- a/Xi/xipassivegrab.c
Peter Hutterer 9f7e9a8
+++ b/Xi/xipassivegrab.c
Peter Hutterer 9f7e9a8
@@ -203,8 +203,14 @@ ProcXIPassiveGrabDevice(ClientPtr client)
Peter Hutterer 9f7e9a8
                                 &param, XI2, &mask);
Peter Hutterer 9f7e9a8
             break;
Peter Hutterer 9f7e9a8
         case XIGrabtypeKeycode:
Peter Hutterer 9f7e9a8
-            status = GrabKey(client, dev, mod_dev, stuff->detail,
Peter Hutterer 9f7e9a8
-                             &param, XI2, &mask);
Peter Hutterer 9f7e9a8
+            /* XI2 allows 32-bit keycodes but thanks to XKB we can never
Peter Hutterer 9f7e9a8
+             * implement this. Just return an error for all keycodes that
Peter Hutterer 9f7e9a8
+             * cannot work anyway */
Peter Hutterer 9f7e9a8
+            if (stuff->detail > 255)
Peter Hutterer 9f7e9a8
+                status = XIAlreadyGrabbed;
Peter Hutterer 9f7e9a8
+            else
Peter Hutterer 9f7e9a8
+                status = GrabKey(client, dev, mod_dev, stuff->detail,
Peter Hutterer 9f7e9a8
+                                 &param, XI2, &mask);
Peter Hutterer 9f7e9a8
             break;
Peter Hutterer 9f7e9a8
         case XIGrabtypeEnter:
Peter Hutterer 9f7e9a8
         case XIGrabtypeFocusIn:
Peter Hutterer 9f7e9a8
-- 
Peter Hutterer 9f7e9a8
2.21.0
Peter Hutterer 9f7e9a8