From 3b532f87b26d791b0b64b87aa39141d1a81098e8 Mon Sep 17 00:00:00 2001 From: Pierre Ossman Date: Fri, 21 Sep 2018 12:30:54 +0200 Subject: [PATCH] Replace Shift+Alt with Shift+Meta when possible 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 | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/unix/xserver/hw/vnc/Input.c b/unix/xserver/hw/vnc/Input.c index 228b382d..534e435e 100644 --- a/unix/xserver/hw/vnc/Input.c +++ b/unix/xserver/hw/vnc/Input.c @@ -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++) { -- 2.39.5