From ffc2c3840466ed50abc35cba40fdc697e478ebd6 Mon Sep 17 00:00:00 2001 From: Ulrich Sibiller Date: Fri, 19 Jun 2020 00:18:34 +0200 Subject: Keyboard.c: improve capslock and numlock handling Fixes ArcticaProject/nx-libs#935 --- nx-X11/programs/Xserver/hw/nxagent/Keyboard.c | 42 +++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) (limited to 'nx-X11/programs/Xserver/hw/nxagent/Keyboard.c') diff --git a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c index 48ab721f5..14d811877 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Keyboard.c @@ -713,6 +713,48 @@ XkbError: } #endif + #ifdef TEST + if (nxagentCapsLockKeycode != 0) + { + fprintf(stderr, "%s: Modifiers for CapsLock (%d): 0x%x\n", __func__, nxagentCapsLockKeycode, xkb->map->modmap[nxagentCapsLockKeycode]); + } + if (nxagentNumLockKeycode != 0) + { + fprintf(stderr, "%s: Modifiers for NumLock (%d): 0x%x\n", __func__, nxagentNumLockKeycode, xkb->map->modmap[nxagentNumLockKeycode]); + } + #endif + + /* Users can add options to their xkb setup. E.g. setxkbmap + * -option caps:ctrl_modifier makes CapsLock behave like the + * Ctrl key. As we have special treatment for CapsLock and + * NumLock to keep them in sync with the real X server we + * check if they are assigned to another modifier. In that + * case we disable the sync treatment by setting the according + * keycode to 0. + */ + if (xkb && xkb->map && xkb->map->modmap) + { + if (nxagentCapsLockKeycode != 0 && xkb->map->modmap[nxagentCapsLockKeycode] != LockMask) + { + nxagentCapsLockKeycode = 0; + #ifdef TEST + fprintf(stderr, "%s: CapsLock key is mapped to some other modifier - disabling special treatment\n", __func__); + #endif + } + + /* I have not found an xkb option definition for remapping + * NumLock. But users can still do that manually so let's be + * safe here. + */ + if (xkb->map->modmap[nxagentNumLockKeycode] != Mod2Mask) + { + nxagentNumLockKeycode = 0; + #ifdef TEST + fprintf(stderr, "%s: Numock key is mapped to some other modifier - disabling special treatment\n", __func__); + #endif + } + } + #ifdef DEBUG fprintf(stderr, "%s: Going to set rules and init device: " "[rules='%s',model='%s',layout='%s',variant='%s',options='%s'].\n", __func__, -- cgit v1.2.3