| Test protocol for keyboard handling |
| =================================== |
| |
| Platform specific tests/issues are marked with []. |
| |
| These tests are primarily about what is sent over the protocol and some |
| may be difficult or impossible to test using normal applications. One |
| such case is that xev will see fake KeyRelease events on key repeat, |
| even when no such events were sent by the client. In these cases you |
| can turn on debug logging in either the client or the server by |
| specifying "-Log *:stderr:100". |
| |
| We currently have a limitation in Xvnc where it can run out of symbols, |
| resulting in nothing being sent to the applications. Just run setxkbmap |
| with any layout to reset the symbol table. |
| |
| Client (classic, non-raw, mode) |
| ------------------------------- |
| |
| - Normal symbols: |
| |
| - ASCII characters |
| - Latin 1 character |
| - Unicode BMP characters |
| - Unicode non-BMP characters (does any layout actually have these?) |
| |
| - Dead keys: |
| |
| These are not available on a single layout, so you need to switch to |
| test everything. The useful layouts also differ per platform: |
| |
| X11: US International for most, Greek for some specific diacretics |
| Win: US International, Czech, Greek Polytonic, Vietnamese |
| OS X: ABC Extended (FIXME: lots of broken keys), |
| Greek (FIXME: cannot be used with TigerVNC) |
| |
| - Grave |
| - Acute |
| - Circumflex |
| - Tilde |
| - Macron (FIXME: broken on Win) |
| - Breve |
| - Dot above |
| - Dot below |
| - Diaeresis |
| - Ring above |
| - Double acute |
| - Caron |
| - Cedilla |
| - Ogonek |
| - Ypogegrammeni (iota below) (FIXME: broken on Win) |
| - Dialytika tonos [Win] (Diaresis on X11, and maybe OS X?) |
| - Comma above (FIXME: broken on Win) |
| - Reversed comma above (FIXME: broken on Win) |
| - Horn [X11?] |
| - Hook above [Win?] |
| - Hook below [X11?, Win?] |
| - Dakuten (Katakana voiced mark) (Only Input Methods layouts?) |
| - Handakuten (Katakana semi-voiced mark) (Only Input Methods layouts?) |
| - FIXME: Many more that we currently probably don't support |
| |
| - No composition on client |
| |
| - Modifiers: |
| |
| X11: You can usually toggle Hyper/Super and Compose/Scroll_Lock using |
| XKB options. |
| |
| - CapsLock, NumLock |
| - Shift, Ctrl |
| - Alt, AltGr, Super [Win, X11] |
| - Ctrl+AltGr [Win] |
| - Meta [X11] |
| - Left/right identification (FIXME: broken release for Shift on Win) |
| - CmdL => AltL, CmdR => SuperL, AltL => ModeSwitch, AltR => Level3Shift [OS X] |
| - Hyper sends Super [X11] |
| |
| - CapsLock, Shift and AltGr affect symbol lookup |
| - Ctrl does not affect symbol lookup |
| - Ctrl+Alt+<ANY> sends the same symbol as <ANY> |
| - "Shift press, A press, Shift release, A release" should not send "a release" |
| |
| - Numpad: |
| |
| - NumLock affects symbol lookup [Win, X11] |
| - Numpad specific symbols are sent |
| - Decimal key should send Decimal for layouts with . as a symbol, and |
| Separator for layouts with , as a symbol |
| - Shift inverts NumLock behaviour [X11] |
| - Shift turns NumLock off, but not on [Win] (FIXME: fake Shifts also sent) |
| |
| - Multimedia keys: |
| |
| OS X: FIXME: all broken |
| |
| - Back, Forward, Refresh, Stop |
| - HomePage, Search, Favourites (FIXME: broken on Win) |
| - Mail, Calculator |
| - Volume up, down, mute |
| - Media next, previous, stop, play |
| - Sleep (FIXME: broken on Win) |
| - FIXME: probably more keys exist |
| |
| - Non-character keys: |
| |
| - F1-F24 (FIXME: F14-F15 broken on OS X) |
| - Tab, Space, Backspace, Return, Esc |
| - LeftTab sends Tab [X11] |
| - PrntScrn, ScrollLock, Pause [X11, Win] |
| - Help [X11?, OS X] |
| - Insert [X11, Win] |
| - Delete, Home, End, PageUp, PageDown |
| - Arrow keys |
| - Menu |
| - Alt+PrntScrn sends Sys_Req [Win] |
| |
| - French layout (AZERTY and inverted shift behaviour for many keys) |
| |
| - Local layout changes are respected |
| |
| Client (raw mode) |
| ----------------- |
| |
| - All physical keys (modifiers or type of symbol shouldn't matter) |
| |
| - Normal keys |
| - Dead keys |
| - Numpad |
| - Multimedia keys |
| - Non-character keys |
| |
| Client (both modes) |
| ------------------- |
| |
| - Key repeat should not send repeated release events |
| |
| - Keys are released on loss of focus |
| |
| - Local input methods are disabled/enabled with focus |
| |
| - System keys should be grabbed in full screen (FIXME: lots missing on Win) |
| |
| The exact keys depends on the system and configuration, but it |
| is usually variants of these: |
| |
| - Alt+Tab |
| - Super (and Super+other) |
| - Multimedia keys |
| - Ctrl+Alt+Delete |
| - Ctrl+Esc |
| - F8-F12 |
| |
| - Lock key states: |
| |
| - Adjusted on server when connecting |
| - Adjusted on server when regaining focus |
| - Server changes are honored when focused |
| - Server changes are not honored when not focused |
| |
| - CapsLock |
| - NumLock (hidden state on macOS) |
| - ScollLock* [X11, Win] |
| |
| * Usually needs to be enabled with: xmodmap -e "add mod3 = Scroll_Lock" |
| |
| - Virtual keyboard (as much of the above as is possible) |
| |
| Server |
| ------ |
| |
| - Fake key events |
| |
| An extra press or release should be added before the real key press |
| in order to get the correct state to get the desired symbol. A second |
| fake event should be added after the real key press to restore state. |
| No extra events should be added for a key release. |
| |
| Possible fake keys: |
| |
| - Shift |
| - AltGr |
| |
| - Shift+Tab bypasses this and never fake releases Shift |
| |
| - Alternative keys |
| |
| A semantically equivalent key is sent when the desired key cannot be |
| reached in the current keyboard state: |
| |
| - Left modifier <=> Right modifier (e.g. Alt_R for Alt_L) |
| - Keypad key <=> Standard key |
| - ISO_Level3_Shift <=> Mode_Switch |
| |
| - Meta for Shift+Alt (if server keymap agrees) |
| |
| - Lock key heuristics (for clients without lock key extension) |
| |
| - CapsLock is corrected when A-Z or a-z are pressed |
| - CapsLock is corrected when Shift and A-Z or a-z are pressed* |
| - NumLock is corrected when 0-9 on the keypad are pressed |
| |
| * Gives incorrect behaviour if the client doesn't have "Shift cancels |
| CapsLock behaviour", e.g. macOS |