Since X11 does not provide a localized version of virtual keys, I mapped the X11 event's `KeySym` to such a "virtual-key code", using `evt.keycode` only as a fall back. It's not perfect but close to what Windows and macOS have.
Here is the mapping schema:
``` * 0x00 (unknown virtual key) * 0x01 XK_space (shifted from Latin-1) * 0x02 XK_comma (shifted from Latin-1 OR guessed from xKeycode) * 0x03 XK_period (shifted from Latin-1 OR guessed from xKeycode) * 0x04 .. 0x07 (unused) * * 0x08 .. 0x1f SPECIAL KEYS 1 (from all-mask 0xff00) * 0x20 .. 0x29 NUMERIC ASCII KEYS (shifted from Latin-1) * 0x2a .. 0x43 ALPHABETIC ASCII KEYS (shifted from Latin-1) * * 0x44 US_MINUS (guessed from xKeycode) * 0x45 US_PLUS (guessed from xKeycode) * 0x46 US_LBRACKET (guessed from xKeycode) * 0x47 US_RBRACKET (guessed from xKeycode) * 0x48 US_COLON (guessed from xKeycode) * 0x49 US_QUOTE (guessed from xKeycode) * 0x4a US_TILDE (guessed from xKeycode) * 0x4b US_BACKSLASH (guessed from xKeycode) * 0x4c US_COMMA (guessed from xKeycode) * 0x4d US_PERIOD (guessed from xKeycode) * 0x4e US_SLASH (guessed from xKeycode) * 0x4f US_102 (guessed from xKeycode) * * 0x50 .. 0xff SPECIAL KEYS 2 (from all-mask 0xff00) ```
Here is the new mapping table for Squeak: [new-x11-virtual-keys.1.cs.txt](https://github.com/OpenSmalltalk/opensmalltalk-vm/files/7269113/new-x11-virt...)
See /usr/include/X11/keysymdef.h to understand the "SPECIAL KEYS" (masked 0xff00).
The biggest remaining issue is all those "OEM keys", which means the ones you push for "+" or "/" or "~" and so on.
*Note that the idea of having a localized version of the virtual key is that you can print it in an application's user interface. Would be really annoying if an app insists on, e.g., Z while you actionally pushed Y.*
You can view, comment on, or merge this pull request online at:
https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/599
-- Commit Summary --
* <a href="https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/599/commits/4c64947be11eef4a4b567852edb4bd231b7a90e2">For keyDown and keyUp events, pass keycodes into the image. Not quite the virtual keys on other platforms because no information about locale.</a> * <a href="https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/599/commits/147f7d63e70e380331eddb524a90828aa8b0dd8e">Prepare skeleton for xkey2sqVirtualKeyCode(). Fix several several naming issues: keyCode -> ascii, codes -> keyNameEntries, nameForKeycode -> nameForKeysym</a> * <a href="https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/599/commits/ff3c42659822b528d49f578538e434d1acae4fd1">Compute a virtual-key code using X11's KeySym and -- as a fall-back -- that event's not-localized KeyCode.</a>
-- File Changes --
M platforms/unix/vm-display-X11/sqUnixX11.c (181)
-- Patch Links --
https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/599.patch https://github.com/OpenSmalltalk/opensmalltalk-vm/pull/599.diff