]> source.dussan.org Git - tigervnc.git/commitdiff
Replace Shift+Alt with Shift+Meta when possible
authorPierre Ossman <ossman@cendio.se>
Fri, 21 Sep 2018 10:30:54 +0000 (12:30 +0200)
committerPierre Ossman <ossman@cendio.se>
Fri, 21 Sep 2018 10:30:54 +0000 (12:30 +0200)
Most layouts on Unix generate Meta for Shift+Alt but non-Unix clients
will send XK_Alt_*. This results in us picking some other key which
can confuse some applications.

Try to detect this scenario and map XK_Alt_* to XK_Meta_*.

unix/xserver/hw/vnc/Input.c

index 228b382df342c6d0f29a72e67014547ba64de665..534e435e0c4c29851370d00672c6cbe67c1d212a 100644 (file)
@@ -489,6 +489,30 @@ static void vncKeysymKeyboardEvent(KeySym keysym, int down)
 
        keycode = vncKeysymToKeycode(keysym, state, &new_state);
 
+       /*
+        * Shift+Alt is often mapped to Meta, so try that rather than
+        * allocating a new entry, faking shift, or using the dummy
+        * key entries that many layouts have.
+        */
+       if ((state & ShiftMask) &&
+           ((keysym == XK_Alt_L) || (keysym == XK_Alt_R))) {
+               KeyCode alt, meta;
+
+               if (keysym == XK_Alt_L) {
+                       alt = vncKeysymToKeycode(XK_Alt_L, state & ~ShiftMask, NULL);
+                       meta = vncKeysymToKeycode(XK_Meta_L, state, NULL);
+               } else {
+                       alt = vncKeysymToKeycode(XK_Alt_R, state & ~ShiftMask, NULL);
+                       meta = vncKeysymToKeycode(XK_Meta_R, state, NULL);
+               }
+
+               if ((meta != 0) && (alt == meta)) {
+                       LOG_DEBUG("Replacing Shift+Alt with Shift+Meta");
+                       keycode = meta;
+                       new_state = state;
+               }
+       }
+
        /* Try some equivalent keysyms if we couldn't find a perfect match */
        if (keycode == 0) {
                for (i = 0;i < sizeof(altKeysym)/sizeof(altKeysym[0]);i++) {