Use the client provided (using QEMU extendend key event) scancodes if
available instead of reverse mapping the keysym.
X11 unfortunately uses keyboard driver specific keycodes and provides
no direct way to query this, so guess based on the keyboard mapping.
Handle the two most likely keyboard drivers, the old xorgkbd and evdev.
RFB->evdev and RFB->xorgkbd scancode mapping is from keycodemap:
https://gitlab.com/keycodemap/keycodemapdb
A keycodemapdb patch is needed to generate tables suitable for C++. A pull
request has been sent, but has so far not been integrated:
https://gitlab.com/keycodemap/keycodemapdb/merge_requests/2
unix/x0vncserver/rfb_to_xorgevdev.h | 262 ++++++++++++++++++++++++++++++++++++
unix/x0vncserver/rfb_to_xorgkbd.h | 262 ++++++++++++++++++++++++++++++++++++
unix/x0vncserver/x0vncserver.cxx | 46 ++++++-
3 files changed, 568 insertions(+), 2 deletions(-)
create mode 100644 unix/x0vncserver/rfb_to_xorgevdev.h
create mode 100644 unix/x0vncserver/rfb_to_xorgkbd.h
diff --git a/unix/x0vncserver/rfb_to_xorgevdev.h b/unix/x0vncserver/rfb_to_xorgevdev.h
new file mode 100644
index 00000000..026ae727
--- /dev/null
+++ b/unix/x0vncserver/rfb_to_xorgevdev.h
@@ -0,0 +1,262 @@
+/*
+ * This file is auto-generated from keymaps.csv on 2017-05-22 16:43
+ * Database checksum sha256(f45720dc09778503dea402d7b4c742d746b01d4c74155c4633a69f40d938a363)
+ * To re-generate, run:
+ * keymap-gen --lang=stdc++ code-map keymaps.csv rfb xorgevdev
+*/
+const unsigned short code_map_rfb_to_xorgevdev[254] = {
+ 0, /* rfb:0 -> linux:None (unnamed) -> xorgevdev:None */
+ 0x9, /* rfb:1 -> linux:1 (KEY_ESC) -> xorgevdev:9 */
+ 0xa, /* rfb:2 -> linux:2 (KEY_1) -> xorgevdev:10 */
+ 0xb, /* rfb:3 -> linux:3 (KEY_2) -> xorgevdev:11 */
+ 0xc, /* rfb:4 -> linux:4 (KEY_3) -> xorgevdev:12 */
+ 0xd, /* rfb:5 -> linux:5 (KEY_4) -> xorgevdev:13 */
+ 0xe, /* rfb:6 -> linux:6 (KEY_5) -> xorgevdev:14 */
+ 0xf, /* rfb:7 -> linux:7 (KEY_6) -> xorgevdev:15 */
+ 0x10, /* rfb:8 -> linux:8 (KEY_7) -> xorgevdev:16 */
+ 0x11, /* rfb:9 -> linux:9 (KEY_8) -> xorgevdev:17 */
+ 0x12, /* rfb:10 -> linux:10 (KEY_9) -> xorgevdev:18 */
+ 0x13, /* rfb:11 -> linux:11 (KEY_0) -> xorgevdev:19 */
+ 0x14, /* rfb:12 -> linux:12 (KEY_MINUS) -> xorgevdev:20 */
+ 0x15, /* rfb:13 -> linux:13 (KEY_EQUAL) -> xorgevdev:21 */
+ 0x16, /* rfb:14 -> linux:14 (KEY_BACKSPACE) -> xorgevdev:22 */
+ 0x17, /* rfb:15 -> linux:15 (KEY_TAB) -> xorgevdev:23 */
+ 0x18, /* rfb:16 -> linux:16 (KEY_Q) -> xorgevdev:24 */
+ 0x19, /* rfb:17 -> linux:17 (KEY_W) -> xorgevdev:25 */
+ 0x1a, /* rfb:18 -> linux:18 (KEY_E) -> xorgevdev:26 */
+ 0x1b, /* rfb:19 -> linux:19 (KEY_R) -> xorgevdev:27 */
+ 0x1c, /* rfb:20 -> linux:20 (KEY_T) -> xorgevdev:28 */
+ 0x1d, /* rfb:21 -> linux:21 (KEY_Y) -> xorgevdev:29 */
+ 0x1e, /* rfb:22 -> linux:22 (KEY_U) -> xorgevdev:30 */
+ 0x1f, /* rfb:23 -> linux:23 (KEY_I) -> xorgevdev:31 */
+ 0x20, /* rfb:24 -> linux:24 (KEY_O) -> xorgevdev:32 */
+ 0x21, /* rfb:25 -> linux:25 (KEY_P) -> xorgevdev:33 */
+ 0x22, /* rfb:26 -> linux:26 (KEY_LEFTBRACE) -> xorgevdev:34 */
+ 0x23, /* rfb:27 -> linux:27 (KEY_RIGHTBRACE) -> xorgevdev:35 */
+ 0x24, /* rfb:28 -> linux:28 (KEY_ENTER) -> xorgevdev:36 */
+ 0x25, /* rfb:29 -> linux:29 (KEY_LEFTCTRL) -> xorgevdev:37 */
+ 0x26, /* rfb:30 -> linux:30 (KEY_A) -> xorgevdev:38 */
+ 0x27, /* rfb:31 -> linux:31 (KEY_S) -> xorgevdev:39 */
+ 0x28, /* rfb:32 -> linux:32 (KEY_D) -> xorgevdev:40 */
+ 0x29, /* rfb:33 -> linux:33 (KEY_F) -> xorgevdev:41 */
+ 0x2a, /* rfb:34 -> linux:34 (KEY_G) -> xorgevdev:42 */
+ 0x2b, /* rfb:35 -> linux:35 (KEY_H) -> xorgevdev:43 */
+ 0x2c, /* rfb:36 -> linux:36 (KEY_J) -> xorgevdev:44 */
+ 0x2d, /* rfb:37 -> linux:37 (KEY_K) -> xorgevdev:45 */
+ 0x2e, /* rfb:38 -> linux:38 (KEY_L) -> xorgevdev:46 */
+ 0x2f, /* rfb:39 -> linux:39 (KEY_SEMICOLON) -> xorgevdev:47 */
+ 0x30, /* rfb:40 -> linux:40 (KEY_APOSTROPHE) -> xorgevdev:48 */
+ 0x31, /* rfb:41 -> linux:41 (KEY_GRAVE) -> xorgevdev:49 */
+ 0x32, /* rfb:42 -> linux:42 (KEY_LEFTSHIFT) -> xorgevdev:50 */
+ 0x33, /* rfb:43 -> linux:43 (KEY_BACKSLASH) -> xorgevdev:51 */
+ 0x34, /* rfb:44 -> linux:44 (KEY_Z) -> xorgevdev:52 */
+ 0x35, /* rfb:45 -> linux:45 (KEY_X) -> xorgevdev:53 */
+ 0x36, /* rfb:46 -> linux:46 (KEY_C) -> xorgevdev:54 */
+ 0x37, /* rfb:47 -> linux:47 (KEY_V) -> xorgevdev:55 */
+ 0x38, /* rfb:48 -> linux:48 (KEY_B) -> xorgevdev:56 */
+ 0x39, /* rfb:49 -> linux:49 (KEY_N) -> xorgevdev:57 */
+ 0x3a, /* rfb:50 -> linux:50 (KEY_M) -> xorgevdev:58 */
+ 0x3b, /* rfb:51 -> linux:51 (KEY_COMMA) -> xorgevdev:59 */
+ 0x3c, /* rfb:52 -> linux:52 (KEY_DOT) -> xorgevdev:60 */
+ 0x3d, /* rfb:53 -> linux:53 (KEY_SLASH) -> xorgevdev:61 */
+ 0x3e, /* rfb:54 -> linux:54 (KEY_RIGHTSHIFT) -> xorgevdev:62 */
+ 0x3f, /* rfb:55 -> linux:55 (KEY_KPASTERISK) -> xorgevdev:63 */
+ 0x40, /* rfb:56 -> linux:56 (KEY_LEFTALT) -> xorgevdev:64 */
+ 0x41, /* rfb:57 -> linux:57 (KEY_SPACE) -> xorgevdev:65 */
+ 0x42, /* rfb:58 -> linux:58 (KEY_CAPSLOCK) -> xorgevdev:66 */
+ 0x43, /* rfb:59 -> linux:59 (KEY_F1) -> xorgevdev:67 */
+ 0x44, /* rfb:60 -> linux:60 (KEY_F2) -> xorgevdev:68 */
+ 0x45, /* rfb:61 -> linux:61 (KEY_F3) -> xorgevdev:69 */
+ 0x46, /* rfb:62 -> linux:62 (KEY_F4) -> xorgevdev:70 */
+ 0x47, /* rfb:63 -> linux:63 (KEY_F5) -> xorgevdev:71 */
+ 0x48, /* rfb:64 -> linux:64 (KEY_F6) -> xorgevdev:72 */
+ 0x49, /* rfb:65 -> linux:65 (KEY_F7) -> xorgevdev:73 */
+ 0x4a, /* rfb:66 -> linux:66 (KEY_F8) -> xorgevdev:74 */
+ 0x4b, /* rfb:67 -> linux:67 (KEY_F9) -> xorgevdev:75 */
+ 0x4c, /* rfb:68 -> linux:68 (KEY_F10) -> xorgevdev:76 */
+ 0x4d, /* rfb:69 -> linux:69 (KEY_NUMLOCK) -> xorgevdev:77 */
+ 0x4e, /* rfb:70 -> linux:70 (KEY_SCROLLLOCK) -> xorgevdev:78 */
+ 0x4f, /* rfb:71 -> linux:71 (KEY_KP7) -> xorgevdev:79 */
+ 0x50, /* rfb:72 -> linux:72 (KEY_KP8) -> xorgevdev:80 */
+ 0x51, /* rfb:73 -> linux:73 (KEY_KP9) -> xorgevdev:81 */
+ 0x52, /* rfb:74 -> linux:74 (KEY_KPMINUS) -> xorgevdev:82 */
+ 0x53, /* rfb:75 -> linux:75 (KEY_KP4) -> xorgevdev:83 */
+ 0x54, /* rfb:76 -> linux:76 (KEY_KP5) -> xorgevdev:84 */
+ 0x55, /* rfb:77 -> linux:77 (KEY_KP6) -> xorgevdev:85 */
+ 0x56, /* rfb:78 -> linux:78 (KEY_KPPLUS) -> xorgevdev:86 */
+ 0x57, /* rfb:79 -> linux:79 (KEY_KP1) -> xorgevdev:87 */
+ 0x58, /* rfb:80 -> linux:80 (KEY_KP2) -> xorgevdev:88 */
+ 0x59, /* rfb:81 -> linux:81 (KEY_KP3) -> xorgevdev:89 */
+ 0x5a, /* rfb:82 -> linux:82 (KEY_KP0) -> xorgevdev:90 */
+ 0x5b, /* rfb:83 -> linux:83 (KEY_KPDOT) -> xorgevdev:91 */
+ 0x6b, /* rfb:84 -> linux:99 (KEY_SYSRQ) -> xorgevdev:107 */
+ 0xc2, /* rfb:85 -> linux:186 (KEY_F16) -> xorgevdev:194 */
+ 0x5e, /* rfb:86 -> linux:86 (KEY_102ND) -> xorgevdev:94 */
+ 0x5f, /* rfb:87 -> linux:87 (KEY_F11) -> xorgevdev:95 */
+ 0x60, /* rfb:88 -> linux:88 (KEY_F12) -> xorgevdev:96 */
+ 0x7d, /* rfb:89 -> linux:117 (KEY_KPEQUAL) -> xorgevdev:125 */
+ 0xc6, /* rfb:90 -> linux:190 (KEY_F20) -> xorgevdev:198 */
+ 0x6d, /* rfb:91 -> linux:101 (KEY_LINEFEED) -> xorgevdev:109 */
+ 0x67, /* rfb:92 -> linux:95 (KEY_KPJPCOMMA) -> xorgevdev:103 */
+ 0xbf, /* rfb:93 -> linux:183 (KEY_F13) -> xorgevdev:191 */
+ 0xc0, /* rfb:94 -> linux:184 (KEY_F14) -> xorgevdev:192 */
+ 0xc1, /* rfb:95 -> linux:185 (KEY_F15) -> xorgevdev:193 */
+ 0, /* rfb:96 -> linux:None (unnamed) -> xorgevdev:None */
+ 0, /* rfb:97 -> linux:None (unnamed) -> xorgevdev:None */
+ 0, /* rfb:98 -> linux:None (unnamed) -> xorgevdev:None */
+ 0xb1, /* rfb:99 -> linux:169 (KEY_PHONE) -> xorgevdev:177 */
+ 0x8e, /* rfb:100 -> linux:134 (KEY_OPEN) -> xorgevdev:142 */
+ 0x8f, /* rfb:101 -> linux:135 (KEY_PASTE) -> xorgevdev:143 */
+ 0x95, /* rfb:102 -> linux:141 (KEY_SETUP) -> xorgevdev:149 */
+ 0x98, /* rfb:103 -> linux:144 (KEY_FILE) -> xorgevdev:152 */
+ 0x99, /* rfb:104 -> linux:145 (KEY_SENDFILE) -> xorgevdev:153 */
+ 0x9a, /* rfb:105 -> linux:146 (KEY_DELETEFILE) -> xorgevdev:154 */
+ 0x9f, /* rfb:106 -> linux:151 (KEY_MSDOS) -> xorgevdev:159 */
+ 0xa1, /* rfb:107 -> linux:153 (KEY_DIRECTION) -> xorgevdev:161 */
+ 0xa9, /* rfb:108 -> linux:161 (KEY_EJECTCD) -> xorgevdev:169 */
+ 0xc9, /* rfb:109 -> linux:193 (KEY_F23) -> xorgevdev:201 */
+ 0, /* rfb:110 -> linux:None (unnamed) -> xorgevdev:None */
+ 0xca, /* rfb:111 -> linux:194 (KEY_F24) -> xorgevdev:202 */
+ 0xb2, /* rfb:112 -> linux:170 (KEY_ISO) -> xorgevdev:178 */
+ 0xb6, /* rfb:113 -> linux:174 (KEY_EXIT) -> xorgevdev:182 */
+ 0xb7, /* rfb:114 -> linux:175 (KEY_MOVE) -> xorgevdev:183 */
+ 0x61, /* rfb:115 -> linux:89 (KEY_RO) -> xorgevdev:97 */
+ 0xc7, /* rfb:116 -> linux:191 (KEY_F21) -> xorgevdev:199 */
+ 0xb9, /* rfb:117 -> linux:177 (KEY_SCROLLUP) -> xorgevdev:185 */
+ 0x5d, /* rfb:118 -> linux:85 (KEY_ZENKAKUHANKAKU) -> xorgevdev:93 */
+ 0x63, /* rfb:119 -> linux:91 (KEY_HIRAGANA) -> xorgevdev:99 */
+ 0x62, /* rfb:120 -> linux:90 (KEY_KATAKANA) -> xorgevdev:98 */
+ 0x64, /* rfb:121 -> linux:92 (KEY_HENKAN) -> xorgevdev:100 */
+ 0, /* rfb:122 -> linux:None (unnamed) -> xorgevdev:None */
+ 0x66, /* rfb:123 -> linux:94 (KEY_MUHENKAN) -> xorgevdev:102 */
+ 0, /* rfb:124 -> linux:None (unnamed) -> xorgevdev:None */
+ 0x84, /* rfb:125 -> linux:124 (KEY_YEN) -> xorgevdev:132 */
+ 0x81, /* rfb:126 -> linux:121 (KEY_KPCOMMA) -> xorgevdev:129 */
+ 0, /* rfb:127 -> linux:None (unnamed) -> xorgevdev:None */
+ 0, /* rfb:128 -> linux:None (unnamed) -> xorgevdev:None */
+ 0xb3, /* rfb:129 -> linux:171 (KEY_CONFIG) -> xorgevdev:179 */
+ 0x9e, /* rfb:130 -> linux:150 (KEY_WWW) -> xorgevdev:158 */
+ 0xc3, /* rfb:131 -> linux:187 (KEY_F17) -> xorgevdev:195 */
+ 0xc5, /* rfb:132 -> linux:189 (KEY_F19) -> xorgevdev:197 */
+ 0x89, /* rfb:133 -> linux:129 (KEY_AGAIN) -> xorgevdev:137 */
+ 0x8a, /* rfb:134 -> linux:130 (KEY_PROPS) -> xorgevdev:138 */
+ 0x8b, /* rfb:135 -> linux:131 (KEY_UNDO) -> xorgevdev:139 */
+ 0xb8, /* rfb:136 -> linux:176 (KEY_EDIT) -> xorgevdev:184 */
+ 0xbd, /* rfb:137 -> linux:181 (KEY_NEW) -> xorgevdev:189 */
+ 0xbe, /* rfb:138 -> linux:182 (KEY_REDO) -> xorgevdev:190 */
+ 0x80, /* rfb:139 -> linux:120 (KEY_SCALE) -> xorgevdev:128 */
+ 0x8c, /* rfb:140 -> linux:132 (KEY_FRONT) -> xorgevdev:140 */
+ 0x83, /* rfb:141 -> linux:123 (KEY_HANJA) -> xorgevdev:131 */
+ 0xf1, /* rfb:142 -> linux:233 (KEY_FORWARDMAIL) -> xorgevdev:241 */
+ 0xba, /* rfb:143 -> linux:178 (KEY_SCROLLDOWN) -> xorgevdev:186 */
+ 0xad, /* rfb:144 -> linux:165 (KEY_PREVIOUSSONG) -> xorgevdev:173 */
+ 0, /* rfb:145 -> linux:None (unnamed) -> xorgevdev:None */
+ 0xa0, /* rfb:146 -> linux:152 (KEY_SCREENLOCK) -> xorgevdev:160 */
+ 0x9b, /* rfb:147 -> linux:147 (KEY_XFER) -> xorgevdev:155 */
+ 0xe6, /* rfb:148 -> linux:222 (KEY_ALTERASE) -> xorgevdev:230 */
+ 0xcb, /* rfb:149 -> linux:195 (unnamed) -> xorgevdev:203 */
+ 0xcc, /* rfb:150 -> linux:196 (unnamed) -> xorgevdev:204 */
+ 0x9d, /* rfb:151 -> linux:149 (KEY_PROG2) -> xorgevdev:157 */
+ 0xb0, /* rfb:152 -> linux:168 (KEY_REWIND) -> xorgevdev:176 */
+ 0xab, /* rfb:153 -> linux:163 (KEY_NEXTSONG) -> xorgevdev:171 */
+ 0xcd, /* rfb:154 -> linux:197 (unnamed) -> xorgevdev:205 */
+ 0xce, /* rfb:155 -> linux:198 (unnamed) -> xorgevdev:206 */
+ 0x68, /* rfb:156 -> linux:96 (KEY_KPENTER) -> xorgevdev:104 */
+ 0x69, /* rfb:157 -> linux:97 (KEY_RIGHTCTRL) -> xorgevdev:105 */
+ 0x93, /* rfb:158 -> linux:139 (KEY_MENU) -> xorgevdev:147 */
+ 0x9c, /* rfb:159 -> linux:148 (KEY_PROG1) -> xorgevdev:156 */
+ 0x79, /* rfb:160 -> linux:113 (KEY_MUTE) -> xorgevdev:121 */
+ 0x94, /* rfb:161 -> linux:140 (KEY_CALC) -> xorgevdev:148 */
+ 0xac, /* rfb:162 -> linux:164 (KEY_PLAYPAUSE) -> xorgevdev:172 */
+ 0xa8, /* rfb:163 -> linux:160 (KEY_CLOSECD) -> xorgevdev:168 */
+ 0xae, /* rfb:164 -> linux:166 (KEY_STOPCD) -> xorgevdev:174 */
+ 0xd5, /* rfb:165 -> linux:205 (KEY_SUSPEND) -> xorgevdev:213 */
+ 0xa2, /* rfb:166 -> linux:154 (KEY_CYCLEWINDOWS) -> xorgevdev:162 */
+ 0xcf, /* rfb:167 -> linux:199 (unnamed) -> xorgevdev:207 */
+ 0xd0, /* rfb:168 -> linux:200 (KEY_PLAYCD) -> xorgevdev:208 */
+ 0xd1, /* rfb:169 -> linux:201 (KEY_PAUSECD) -> xorgevdev:209 */
+ 0, /* rfb:170 -> linux:None (unnamed) -> xorgevdev:None */
+ 0xd2, /* rfb:171 -> linux:202 (KEY_PROG3) -> xorgevdev:210 */
+ 0xd3, /* rfb:172 -> linux:203 (KEY_PROG4) -> xorgevdev:211 */
+ 0xd4, /* rfb:173 -> linux:204 (KEY_DASHBOARD) -> xorgevdev:212 */
+ 0x7a, /* rfb:174 -> linux:114 (KEY_VOLUMEDOWN) -> xorgevdev:122 */
+ 0xd6, /* rfb:175 -> linux:206 (KEY_CLOSE) -> xorgevdev:214 */
+ 0x7b, /* rfb:176 -> linux:115 (KEY_VOLUMEUP) -> xorgevdev:123 */
+ 0xaf, /* rfb:177 -> linux:167 (KEY_RECORD) -> xorgevdev:175 */
+ 0xb4, /* rfb:178 -> linux:172 (KEY_HOMEPAGE) -> xorgevdev:180 */
+ 0xd7, /* rfb:179 -> linux:207 (KEY_PLAY) -> xorgevdev:215 */
+ 0xd8, /* rfb:180 -> linux:208 (KEY_FASTFORWARD) -> xorgevdev:216 */
+ 0x6a, /* rfb:181 -> linux:98 (KEY_KPSLASH) -> xorgevdev:106 */
+ 0xd9, /* rfb:182 -> linux:209 (KEY_BASSBOOST) -> xorgevdev:217 */
+ 0x6b, /* rfb:183 -> linux:99 (KEY_SYSRQ) -> xorgevdev:107 (qemu compat) */
+ 0x6c, /* rfb:184 -> linux:100 (KEY_RIGHTALT) -> xorgevdev:108 */
+ 0xda, /* rfb:185 -> linux:210 (KEY_PRINT) -> xorgevdev:218 */
+ 0xdb, /* rfb:186 -> linux:211 (KEY_HP) -> xorgevdev:219 */
+ 0xdc, /* rfb:187 -> linux:212 (KEY_CAMERA) -> xorgevdev:220 */
+ 0x91, /* rfb:188 -> linux:137 (KEY_CUT) -> xorgevdev:145 */
+ 0xdd, /* rfb:189 -> linux:213 (KEY_SOUND) -> xorgevdev:221 */
+ 0xde, /* rfb:190 -> linux:214 (KEY_QUESTION) -> xorgevdev:222 */
+ 0xdf, /* rfb:191 -> linux:215 (KEY_EMAIL) -> xorgevdev:223 */
+ 0xe0, /* rfb:192 -> linux:216 (KEY_CHAT) -> xorgevdev:224 */
+ 0x90, /* rfb:193 -> linux:136 (KEY_FIND) -> xorgevdev:144 */
+ 0xe2, /* rfb:194 -> linux:218 (KEY_CONNECT) -> xorgevdev:226 */
+ 0xe3, /* rfb:195 -> linux:219 (KEY_FINANCE) -> xorgevdev:227 */
+ 0xe4, /* rfb:196 -> linux:220 (KEY_SPORT) -> xorgevdev:228 */
+ 0x7f, /* rfb:197 -> linux:119 (KEY_PAUSE) -> xorgevdev:127 (qemu compat) */
+ 0x7f, /* rfb:198 -> linux:119 (KEY_PAUSE) -> xorgevdev:127 */
+ 0x6e, /* rfb:199 -> linux:102 (KEY_HOME) -> xorgevdev:110 */
+ 0x6f, /* rfb:200 -> linux:103 (KEY_UP) -> xorgevdev:111 */
+ 0x70, /* rfb:201 -> linux:104 (KEY_PAGEUP) -> xorgevdev:112 */
+ 0xe7, /* rfb:202 -> linux:223 (KEY_CANCEL) -> xorgevdev:231 */
+ 0x71, /* rfb:203 -> linux:105 (KEY_LEFT) -> xorgevdev:113 */
+ 0xe8, /* rfb:204 -> linux:224 (KEY_BRIGHTNESSDOWN) -> xorgevdev:232 */
+ 0x72, /* rfb:205 -> linux:106 (KEY_RIGHT) -> xorgevdev:114 */
+ 0x7e, /* rfb:206 -> linux:118 (KEY_KPPLUSMINUS) -> xorgevdev:126 */
+ 0x73, /* rfb:207 -> linux:107 (KEY_END) -> xorgevdev:115 */
+ 0x74, /* rfb:208 -> linux:108 (KEY_DOWN) -> xorgevdev:116 */
+ 0x75, /* rfb:209 -> linux:109 (KEY_PAGEDOWN) -> xorgevdev:117 */
+ 0x76, /* rfb:210 -> linux:110 (KEY_INSERT) -> xorgevdev:118 */
+ 0x77, /* rfb:211 -> linux:111 (KEY_DELETE) -> xorgevdev:119 */
+ 0xe9, /* rfb:212 -> linux:225 (KEY_BRIGHTNESSUP) -> xorgevdev:233 */
+ 0xf2, /* rfb:213 -> linux:234 (KEY_SAVE) -> xorgevdev:242 */
+ 0xeb, /* rfb:214 -> linux:227 (KEY_SWITCHVIDEOMODE) -> xorgevdev:235 */
+ 0xec, /* rfb:215 -> linux:228 (KEY_KBDILLUMTOGGLE) -> xorgevdev:236 */
+ 0xed, /* rfb:216 -> linux:229 (KEY_KBDILLUMDOWN) -> xorgevdev:237 */
+ 0xee, /* rfb:217 -> linux:230 (KEY_KBDILLUMUP) -> xorgevdev:238 */
+ 0xef, /* rfb:218 -> linux:231 (KEY_SEND) -> xorgevdev:239 */
+ 0x85, /* rfb:219 -> linux:125 (KEY_LEFTMETA) -> xorgevdev:133 */
+ 0x86, /* rfb:220 -> linux:126 (KEY_RIGHTMETA) -> xorgevdev:134 */
+ 0x87, /* rfb:221 -> linux:127 (KEY_COMPOSE) -> xorgevdev:135 */
+ 0x7c, /* rfb:222 -> linux:116 (KEY_POWER) -> xorgevdev:124 */
+ 0x96, /* rfb:223 -> linux:142 (KEY_SLEEP) -> xorgevdev:150 */
+ 0, /* rfb:224 -> linux:None (unnamed) -> xorgevdev:None */
+ 0, /* rfb:225 -> linux:None (unnamed) -> xorgevdev:None */
+ 0, /* rfb:226 -> linux:None (unnamed) -> xorgevdev:None */
+ 0x97, /* rfb:227 -> linux:143 (KEY_WAKEUP) -> xorgevdev:151 */
+ 0xf0, /* rfb:228 -> linux:232 (KEY_REPLY) -> xorgevdev:240 */
+ 0xe1, /* rfb:229 -> linux:217 (KEY_SEARCH) -> xorgevdev:225 */
+ 0xa4, /* rfb:230 -> linux:156 (KEY_BOOKMARKS) -> xorgevdev:164 */
+ 0xb5, /* rfb:231 -> linux:173 (KEY_REFRESH) -> xorgevdev:181 */
+ 0x88, /* rfb:232 -> linux:128 (KEY_STOP) -> xorgevdev:136 */
+ 0xa7, /* rfb:233 -> linux:159 (KEY_FORWARD) -> xorgevdev:167 */
+ 0xa6, /* rfb:234 -> linux:158 (KEY_BACK) -> xorgevdev:166 */
+ 0xa5, /* rfb:235 -> linux:157 (KEY_COMPUTER) -> xorgevdev:165 */
+ 0xa3, /* rfb:236 -> linux:155 (KEY_MAIL) -> xorgevdev:163 */
+ 0xea, /* rfb:237 -> linux:226 (KEY_MEDIA) -> xorgevdev:234 */
+ 0, /* rfb:238 -> linux:None (unnamed) -> xorgevdev:None */
+ 0x78, /* rfb:239 -> linux:112 (KEY_MACRO) -> xorgevdev:120 */
+ 0xf3, /* rfb:240 -> linux:235 (KEY_DOCUMENTS) -> xorgevdev:243 */
+ 0xf4, /* rfb:241 -> linux:236 (KEY_BATTERY) -> xorgevdev:244 */
+ 0xf5, /* rfb:242 -> linux:237 (KEY_BLUETOOTH) -> xorgevdev:245 */
+ 0xf6, /* rfb:243 -> linux:238 (KEY_WLAN) -> xorgevdev:246 */
+ 0xf7, /* rfb:244 -> linux:239 (KEY_UWB) -> xorgevdev:247 */
+ 0x92, /* rfb:245 -> linux:138 (KEY_HELP) -> xorgevdev:146 */
+ 0xbb, /* rfb:246 -> linux:179 (KEY_KPLEFTPAREN) -> xorgevdev:187 */
+ 0xc4, /* rfb:247 -> linux:188 (KEY_F18) -> xorgevdev:196 */
+ 0x8d, /* rfb:248 -> linux:133 (KEY_COPY) -> xorgevdev:141 */
+ 0xc8, /* rfb:249 -> linux:192 (KEY_F22) -> xorgevdev:200 */
+ 0, /* rfb:250 -> linux:None (unnamed) -> xorgevdev:None */
+ 0xbc, /* rfb:251 -> linux:180 (KEY_KPRIGHTPAREN) -> xorgevdev:188 */
+ 0, /* rfb:252 -> linux:None (unnamed) -> xorgevdev:None */
+ 0xaa, /* rfb:253 -> linux:162 (KEY_EJECTCLOSECD) -> xorgevdev:170 */
+};
diff --git a/unix/x0vncserver/rfb_to_xorgkbd.h b/unix/x0vncserver/rfb_to_xorgkbd.h
new file mode 100644
index 00000000..ee935520
--- /dev/null
+++ b/unix/x0vncserver/rfb_to_xorgkbd.h
@@ -0,0 +1,262 @@
+/*
+ * This file is auto-generated from keymaps.csv on 2017-05-22 17:20
+ * Database checksum sha256(f45720dc09778503dea402d7b4c742d746b01d4c74155c4633a69f40d938a363)
+ * To re-generate, run:
+ * keymap-gen --lang=stdc++ code-map keymaps.csv rfb xorgkbd
+*/
+const unsigned short code_map_rfb_to_xorgkbd[254] = {
+ 0, /* rfb:0 -> linux:None (unnamed) -> xorgkbd:None */
+ 0x9, /* rfb:1 -> linux:1 (KEY_ESC) -> xorgkbd:9 */
+ 0xa, /* rfb:2 -> linux:2 (KEY_1) -> xorgkbd:10 */
+ 0xb, /* rfb:3 -> linux:3 (KEY_2) -> xorgkbd:11 */
+ 0xc, /* rfb:4 -> linux:4 (KEY_3) -> xorgkbd:12 */
+ 0xd, /* rfb:5 -> linux:5 (KEY_4) -> xorgkbd:13 */
+ 0xe, /* rfb:6 -> linux:6 (KEY_5) -> xorgkbd:14 */
+ 0xf, /* rfb:7 -> linux:7 (KEY_6) -> xorgkbd:15 */
+ 0x10, /* rfb:8 -> linux:8 (KEY_7) -> xorgkbd:16 */
+ 0x11, /* rfb:9 -> linux:9 (KEY_8) -> xorgkbd:17 */
+ 0x12, /* rfb:10 -> linux:10 (KEY_9) -> xorgkbd:18 */
+ 0x13, /* rfb:11 -> linux:11 (KEY_0) -> xorgkbd:19 */
+ 0x14, /* rfb:12 -> linux:12 (KEY_MINUS) -> xorgkbd:20 */
+ 0x15, /* rfb:13 -> linux:13 (KEY_EQUAL) -> xorgkbd:21 */
+ 0x16, /* rfb:14 -> linux:14 (KEY_BACKSPACE) -> xorgkbd:22 */
+ 0x17, /* rfb:15 -> linux:15 (KEY_TAB) -> xorgkbd:23 */
+ 0x18, /* rfb:16 -> linux:16 (KEY_Q) -> xorgkbd:24 */
+ 0x19, /* rfb:17 -> linux:17 (KEY_W) -> xorgkbd:25 */
+ 0x1a, /* rfb:18 -> linux:18 (KEY_E) -> xorgkbd:26 */
+ 0x1b, /* rfb:19 -> linux:19 (KEY_R) -> xorgkbd:27 */
+ 0x1c, /* rfb:20 -> linux:20 (KEY_T) -> xorgkbd:28 */
+ 0x1d, /* rfb:21 -> linux:21 (KEY_Y) -> xorgkbd:29 */
+ 0x1e, /* rfb:22 -> linux:22 (KEY_U) -> xorgkbd:30 */
+ 0x1f, /* rfb:23 -> linux:23 (KEY_I) -> xorgkbd:31 */
+ 0x20, /* rfb:24 -> linux:24 (KEY_O) -> xorgkbd:32 */
+ 0x21, /* rfb:25 -> linux:25 (KEY_P) -> xorgkbd:33 */
+ 0x22, /* rfb:26 -> linux:26 (KEY_LEFTBRACE) -> xorgkbd:34 */
+ 0x23, /* rfb:27 -> linux:27 (KEY_RIGHTBRACE) -> xorgkbd:35 */
+ 0x24, /* rfb:28 -> linux:28 (KEY_ENTER) -> xorgkbd:36 */
+ 0x25, /* rfb:29 -> linux:29 (KEY_LEFTCTRL) -> xorgkbd:37 */
+ 0x26, /* rfb:30 -> linux:30 (KEY_A) -> xorgkbd:38 */
+ 0x27, /* rfb:31 -> linux:31 (KEY_S) -> xorgkbd:39 */
+ 0x28, /* rfb:32 -> linux:32 (KEY_D) -> xorgkbd:40 */
+ 0x29, /* rfb:33 -> linux:33 (KEY_F) -> xorgkbd:41 */
+ 0x2a, /* rfb:34 -> linux:34 (KEY_G) -> xorgkbd:42 */
+ 0x2b, /* rfb:35 -> linux:35 (KEY_H) -> xorgkbd:43 */
+ 0x2c, /* rfb:36 -> linux:36 (KEY_J) -> xorgkbd:44 */
+ 0x2d, /* rfb:37 -> linux:37 (KEY_K) -> xorgkbd:45 */
+ 0x2e, /* rfb:38 -> linux:38 (KEY_L) -> xorgkbd:46 */
+ 0x2f, /* rfb:39 -> linux:39 (KEY_SEMICOLON) -> xorgkbd:47 */
+ 0x30, /* rfb:40 -> linux:40 (KEY_APOSTROPHE) -> xorgkbd:48 */
+ 0x31, /* rfb:41 -> linux:41 (KEY_GRAVE) -> xorgkbd:49 */
+ 0x32, /* rfb:42 -> linux:42 (KEY_LEFTSHIFT) -> xorgkbd:50 */
+ 0x33, /* rfb:43 -> linux:43 (KEY_BACKSLASH) -> xorgkbd:51 */
+ 0x34, /* rfb:44 -> linux:44 (KEY_Z) -> xorgkbd:52 */
+ 0x35, /* rfb:45 -> linux:45 (KEY_X) -> xorgkbd:53 */
+ 0x36, /* rfb:46 -> linux:46 (KEY_C) -> xorgkbd:54 */
+ 0x37, /* rfb:47 -> linux:47 (KEY_V) -> xorgkbd:55 */
+ 0x38, /* rfb:48 -> linux:48 (KEY_B) -> xorgkbd:56 */
+ 0x39, /* rfb:49 -> linux:49 (KEY_N) -> xorgkbd:57 */
+ 0x3a, /* rfb:50 -> linux:50 (KEY_M) -> xorgkbd:58 */
+ 0x3b, /* rfb:51 -> linux:51 (KEY_COMMA) -> xorgkbd:59 */
+ 0x3c, /* rfb:52 -> linux:52 (KEY_DOT) -> xorgkbd:60 */
+ 0x3d, /* rfb:53 -> linux:53 (KEY_SLASH) -> xorgkbd:61 */
+ 0x3e, /* rfb:54 -> linux:54 (KEY_RIGHTSHIFT) -> xorgkbd:62 */
+ 0x3f, /* rfb:55 -> linux:55 (KEY_KPASTERISK) -> xorgkbd:63 */
+ 0x40, /* rfb:56 -> linux:56 (KEY_LEFTALT) -> xorgkbd:64 */
+ 0x41, /* rfb:57 -> linux:57 (KEY_SPACE) -> xorgkbd:65 */
+ 0x42, /* rfb:58 -> linux:58 (KEY_CAPSLOCK) -> xorgkbd:66 */
+ 0x43, /* rfb:59 -> linux:59 (KEY_F1) -> xorgkbd:67 */
+ 0x44, /* rfb:60 -> linux:60 (KEY_F2) -> xorgkbd:68 */
+ 0x45, /* rfb:61 -> linux:61 (KEY_F3) -> xorgkbd:69 */
+ 0x46, /* rfb:62 -> linux:62 (KEY_F4) -> xorgkbd:70 */
+ 0x47, /* rfb:63 -> linux:63 (KEY_F5) -> xorgkbd:71 */
+ 0x48, /* rfb:64 -> linux:64 (KEY_F6) -> xorgkbd:72 */
+ 0x49, /* rfb:65 -> linux:65 (KEY_F7) -> xorgkbd:73 */
+ 0x4a, /* rfb:66 -> linux:66 (KEY_F8) -> xorgkbd:74 */
+ 0x4b, /* rfb:67 -> linux:67 (KEY_F9) -> xorgkbd:75 */
+ 0x4c, /* rfb:68 -> linux:68 (KEY_F10) -> xorgkbd:76 */
+ 0x4d, /* rfb:69 -> linux:69 (KEY_NUMLOCK) -> xorgkbd:77 */
+ 0x4e, /* rfb:70 -> linux:70 (KEY_SCROLLLOCK) -> xorgkbd:78 */
+ 0x4f, /* rfb:71 -> linux:71 (KEY_KP7) -> xorgkbd:79 */
+ 0x50, /* rfb:72 -> linux:72 (KEY_KP8) -> xorgkbd:80 */
+ 0x51, /* rfb:73 -> linux:73 (KEY_KP9) -> xorgkbd:81 */
+ 0x52, /* rfb:74 -> linux:74 (KEY_KPMINUS) -> xorgkbd:82 */
+ 0x53, /* rfb:75 -> linux:75 (KEY_KP4) -> xorgkbd:83 */
+ 0x54, /* rfb:76 -> linux:76 (KEY_KP5) -> xorgkbd:84 */
+ 0x55, /* rfb:77 -> linux:77 (KEY_KP6) -> xorgkbd:85 */
+ 0x56, /* rfb:78 -> linux:78 (KEY_KPPLUS) -> xorgkbd:86 */
+ 0x57, /* rfb:79 -> linux:79 (KEY_KP1) -> xorgkbd:87 */
+ 0x58, /* rfb:80 -> linux:80 (KEY_KP2) -> xorgkbd:88 */
+ 0x59, /* rfb:81 -> linux:81 (KEY_KP3) -> xorgkbd:89 */
+ 0x5a, /* rfb:82 -> linux:82 (KEY_KP0) -> xorgkbd:90 */
+ 0x5b, /* rfb:83 -> linux:83 (KEY_KPDOT) -> xorgkbd:91 */
+ 0x6f, /* rfb:84 -> linux:99 (KEY_SYSRQ) -> xorgkbd:111 */
+ 0x79, /* rfb:85 -> linux:186 (KEY_F16) -> xorgkbd:121 */
+ 0x5e, /* rfb:86 -> linux:86 (KEY_102ND) -> xorgkbd:94 */
+ 0x5f, /* rfb:87 -> linux:87 (KEY_F11) -> xorgkbd:95 */
+ 0x60, /* rfb:88 -> linux:88 (KEY_F12) -> xorgkbd:96 */
+ 0x7e, /* rfb:89 -> linux:117 (KEY_KPEQUAL) -> xorgkbd:126 */
+ 0, /* rfb:90 -> linux:190 (KEY_F20) -> xorgkbd:None */
+ 0, /* rfb:91 -> linux:101 (KEY_LINEFEED) -> xorgkbd:None */
+ 0, /* rfb:92 -> linux:95 (KEY_KPJPCOMMA) -> xorgkbd:None */
+ 0x76, /* rfb:93 -> linux:183 (KEY_F13) -> xorgkbd:118 */
+ 0x77, /* rfb:94 -> linux:184 (KEY_F14) -> xorgkbd:119 */
+ 0x78, /* rfb:95 -> linux:185 (KEY_F15) -> xorgkbd:120 */
+ 0, /* rfb:96 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:97 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:98 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:99 -> linux:169 (KEY_PHONE) -> xorgkbd:None */
+ 0, /* rfb:100 -> linux:134 (KEY_OPEN) -> xorgkbd:None */
+ 0, /* rfb:101 -> linux:135 (KEY_PASTE) -> xorgkbd:None */
+ 0, /* rfb:102 -> linux:141 (KEY_SETUP) -> xorgkbd:None */
+ 0, /* rfb:103 -> linux:144 (KEY_FILE) -> xorgkbd:None */
+ 0, /* rfb:104 -> linux:145 (KEY_SENDFILE) -> xorgkbd:None */
+ 0, /* rfb:105 -> linux:146 (KEY_DELETEFILE) -> xorgkbd:None */
+ 0, /* rfb:106 -> linux:151 (KEY_MSDOS) -> xorgkbd:None */
+ 0, /* rfb:107 -> linux:153 (KEY_DIRECTION) -> xorgkbd:None */
+ 0, /* rfb:108 -> linux:161 (KEY_EJECTCD) -> xorgkbd:None */
+ 0, /* rfb:109 -> linux:193 (KEY_F23) -> xorgkbd:None */
+ 0, /* rfb:110 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:111 -> linux:194 (KEY_F24) -> xorgkbd:None */
+ 0, /* rfb:112 -> linux:170 (KEY_ISO) -> xorgkbd:None */
+ 0, /* rfb:113 -> linux:174 (KEY_EXIT) -> xorgkbd:None */
+ 0, /* rfb:114 -> linux:175 (KEY_MOVE) -> xorgkbd:None */
+ 0, /* rfb:115 -> linux:89 (KEY_RO) -> xorgkbd:None */
+ 0, /* rfb:116 -> linux:191 (KEY_F21) -> xorgkbd:None */
+ 0, /* rfb:117 -> linux:177 (KEY_SCROLLUP) -> xorgkbd:None */
+ 0, /* rfb:118 -> linux:85 (KEY_ZENKAKUHANKAKU) -> xorgkbd:None */
+ 0, /* rfb:119 -> linux:91 (KEY_HIRAGANA) -> xorgkbd:None */
+ 0, /* rfb:120 -> linux:90 (KEY_KATAKANA) -> xorgkbd:None */
+ 0, /* rfb:121 -> linux:92 (KEY_HENKAN) -> xorgkbd:None */
+ 0, /* rfb:122 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:123 -> linux:94 (KEY_MUHENKAN) -> xorgkbd:None */
+ 0, /* rfb:124 -> linux:None (unnamed) -> xorgkbd:None */
+ 0x85, /* rfb:125 -> linux:124 (KEY_YEN) -> xorgkbd:133 */
+ 0, /* rfb:126 -> linux:121 (KEY_KPCOMMA) -> xorgkbd:None */
+ 0, /* rfb:127 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:128 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:129 -> linux:171 (KEY_CONFIG) -> xorgkbd:None */
+ 0, /* rfb:130 -> linux:150 (KEY_WWW) -> xorgkbd:None */
+ 0x7a, /* rfb:131 -> linux:187 (KEY_F17) -> xorgkbd:122 */
+ 0, /* rfb:132 -> linux:189 (KEY_F19) -> xorgkbd:None */
+ 0, /* rfb:133 -> linux:129 (KEY_AGAIN) -> xorgkbd:None */
+ 0, /* rfb:134 -> linux:130 (KEY_PROPS) -> xorgkbd:None */
+ 0, /* rfb:135 -> linux:131 (KEY_UNDO) -> xorgkbd:None */
+ 0, /* rfb:136 -> linux:176 (KEY_EDIT) -> xorgkbd:None */
+ 0, /* rfb:137 -> linux:181 (KEY_NEW) -> xorgkbd:None */
+ 0, /* rfb:138 -> linux:182 (KEY_REDO) -> xorgkbd:None */
+ 0, /* rfb:139 -> linux:120 (KEY_SCALE) -> xorgkbd:None */
+ 0, /* rfb:140 -> linux:132 (KEY_FRONT) -> xorgkbd:None */
+ 0, /* rfb:141 -> linux:123 (KEY_HANJA) -> xorgkbd:None */
+ 0, /* rfb:142 -> linux:233 (KEY_FORWARDMAIL) -> xorgkbd:None */
+ 0, /* rfb:143 -> linux:178 (KEY_SCROLLDOWN) -> xorgkbd:None */
+ 0, /* rfb:144 -> linux:165 (KEY_PREVIOUSSONG) -> xorgkbd:None */
+ 0, /* rfb:145 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:146 -> linux:152 (KEY_SCREENLOCK) -> xorgkbd:None */
+ 0, /* rfb:147 -> linux:147 (KEY_XFER) -> xorgkbd:None */
+ 0, /* rfb:148 -> linux:222 (KEY_ALTERASE) -> xorgkbd:None */
+ 0, /* rfb:149 -> linux:195 (unnamed) -> xorgkbd:None */
+ 0, /* rfb:150 -> linux:196 (unnamed) -> xorgkbd:None */
+ 0, /* rfb:151 -> linux:149 (KEY_PROG2) -> xorgkbd:None */
+ 0, /* rfb:152 -> linux:168 (KEY_REWIND) -> xorgkbd:None */
+ 0, /* rfb:153 -> linux:163 (KEY_NEXTSONG) -> xorgkbd:None */
+ 0, /* rfb:154 -> linux:197 (unnamed) -> xorgkbd:None */
+ 0, /* rfb:155 -> linux:198 (unnamed) -> xorgkbd:None */
+ 0x6c, /* rfb:156 -> linux:96 (KEY_KPENTER) -> xorgkbd:108 */
+ 0x6d, /* rfb:157 -> linux:97 (KEY_RIGHTCTRL) -> xorgkbd:109 */
+ 0, /* rfb:158 -> linux:139 (KEY_MENU) -> xorgkbd:None */
+ 0, /* rfb:159 -> linux:148 (KEY_PROG1) -> xorgkbd:None */
+ 0, /* rfb:160 -> linux:113 (KEY_MUTE) -> xorgkbd:None */
+ 0, /* rfb:161 -> linux:140 (KEY_CALC) -> xorgkbd:None */
+ 0, /* rfb:162 -> linux:164 (KEY_PLAYPAUSE) -> xorgkbd:None */
+ 0, /* rfb:163 -> linux:160 (KEY_CLOSECD) -> xorgkbd:None */
+ 0, /* rfb:164 -> linux:166 (KEY_STOPCD) -> xorgkbd:None */
+ 0, /* rfb:165 -> linux:205 (KEY_SUSPEND) -> xorgkbd:None */
+ 0, /* rfb:166 -> linux:154 (KEY_CYCLEWINDOWS) -> xorgkbd:None */
+ 0, /* rfb:167 -> linux:199 (unnamed) -> xorgkbd:None */
+ 0, /* rfb:168 -> linux:200 (KEY_PLAYCD) -> xorgkbd:None */
+ 0, /* rfb:169 -> linux:201 (KEY_PAUSECD) -> xorgkbd:None */
+ 0, /* rfb:170 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:171 -> linux:202 (KEY_PROG3) -> xorgkbd:None */
+ 0, /* rfb:172 -> linux:203 (KEY_PROG4) -> xorgkbd:None */
+ 0, /* rfb:173 -> linux:204 (KEY_DASHBOARD) -> xorgkbd:None */
+ 0, /* rfb:174 -> linux:114 (KEY_VOLUMEDOWN) -> xorgkbd:None */
+ 0, /* rfb:175 -> linux:206 (KEY_CLOSE) -> xorgkbd:None */
+ 0, /* rfb:176 -> linux:115 (KEY_VOLUMEUP) -> xorgkbd:None */
+ 0, /* rfb:177 -> linux:167 (KEY_RECORD) -> xorgkbd:None */
+ 0, /* rfb:178 -> linux:172 (KEY_HOMEPAGE) -> xorgkbd:None */
+ 0, /* rfb:179 -> linux:207 (KEY_PLAY) -> xorgkbd:None */
+ 0, /* rfb:180 -> linux:208 (KEY_FASTFORWARD) -> xorgkbd:None */
+ 0x70, /* rfb:181 -> linux:98 (KEY_KPSLASH) -> xorgkbd:112 */
+ 0, /* rfb:182 -> linux:209 (KEY_BASSBOOST) -> xorgkbd:None */
+ 0, /* rfb:183 -> linux:None (unnamed) -> xorgkbd:None */
+ 0x71, /* rfb:184 -> linux:100 (KEY_RIGHTALT) -> xorgkbd:113 */
+ 0, /* rfb:185 -> linux:210 (KEY_PRINT) -> xorgkbd:None */
+ 0, /* rfb:186 -> linux:211 (KEY_HP) -> xorgkbd:None */
+ 0, /* rfb:187 -> linux:212 (KEY_CAMERA) -> xorgkbd:None */
+ 0, /* rfb:188 -> linux:137 (KEY_CUT) -> xorgkbd:None */
+ 0, /* rfb:189 -> linux:213 (KEY_SOUND) -> xorgkbd:None */
+ 0, /* rfb:190 -> linux:214 (KEY_QUESTION) -> xorgkbd:None */
+ 0, /* rfb:191 -> linux:215 (KEY_EMAIL) -> xorgkbd:None */
+ 0, /* rfb:192 -> linux:216 (KEY_CHAT) -> xorgkbd:None */
+ 0, /* rfb:193 -> linux:136 (KEY_FIND) -> xorgkbd:None */
+ 0, /* rfb:194 -> linux:218 (KEY_CONNECT) -> xorgkbd:None */
+ 0, /* rfb:195 -> linux:219 (KEY_FINANCE) -> xorgkbd:None */
+ 0, /* rfb:196 -> linux:220 (KEY_SPORT) -> xorgkbd:None */
+ 0, /* rfb:197 -> linux:221 (KEY_SHOP) -> xorgkbd:None */
+ 0x6e, /* rfb:198 -> linux:119 (KEY_PAUSE) -> xorgkbd:110 */
+ 0x61, /* rfb:199 -> linux:102 (KEY_HOME) -> xorgkbd:97 */
+ 0x62, /* rfb:200 -> linux:103 (KEY_UP) -> xorgkbd:98 */
+ 0x63, /* rfb:201 -> linux:104 (KEY_PAGEUP) -> xorgkbd:99 */
+ 0, /* rfb:202 -> linux:223 (KEY_CANCEL) -> xorgkbd:None */
+ 0x64, /* rfb:203 -> linux:105 (KEY_LEFT) -> xorgkbd:100 */
+ 0, /* rfb:204 -> linux:224 (KEY_BRIGHTNESSDOWN) -> xorgkbd:None */
+ 0x66, /* rfb:205 -> linux:106 (KEY_RIGHT) -> xorgkbd:102 */
+ 0, /* rfb:206 -> linux:118 (KEY_KPPLUSMINUS) -> xorgkbd:None */
+ 0x67, /* rfb:207 -> linux:107 (KEY_END) -> xorgkbd:103 */
+ 0x68, /* rfb:208 -> linux:108 (KEY_DOWN) -> xorgkbd:104 */
+ 0x69, /* rfb:209 -> linux:109 (KEY_PAGEDOWN) -> xorgkbd:105 */
+ 0x6a, /* rfb:210 -> linux:110 (KEY_INSERT) -> xorgkbd:106 */
+ 0x6b, /* rfb:211 -> linux:111 (KEY_DELETE) -> xorgkbd:107 */
+ 0, /* rfb:212 -> linux:225 (KEY_BRIGHTNESSUP) -> xorgkbd:None */
+ 0, /* rfb:213 -> linux:234 (KEY_SAVE) -> xorgkbd:None */
+ 0, /* rfb:214 -> linux:227 (KEY_SWITCHVIDEOMODE) -> xorgkbd:None */
+ 0, /* rfb:215 -> linux:228 (KEY_KBDILLUMTOGGLE) -> xorgkbd:None */
+ 0, /* rfb:216 -> linux:229 (KEY_KBDILLUMDOWN) -> xorgkbd:None */
+ 0, /* rfb:217 -> linux:230 (KEY_KBDILLUMUP) -> xorgkbd:None */
+ 0, /* rfb:218 -> linux:231 (KEY_SEND) -> xorgkbd:None */
+ 0x73, /* rfb:219 -> linux:125 (KEY_LEFTMETA) -> xorgkbd:115 */
+ 0x74, /* rfb:220 -> linux:126 (KEY_RIGHTMETA) -> xorgkbd:116 */
+ 0x75, /* rfb:221 -> linux:127 (KEY_COMPOSE) -> xorgkbd:117 */
+ 0, /* rfb:222 -> linux:116 (KEY_POWER) -> xorgkbd:None */
+ 0, /* rfb:223 -> linux:142 (KEY_SLEEP) -> xorgkbd:None */
+ 0, /* rfb:224 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:225 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:226 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:227 -> linux:143 (KEY_WAKEUP) -> xorgkbd:None */
+ 0, /* rfb:228 -> linux:232 (KEY_REPLY) -> xorgkbd:None */
+ 0, /* rfb:229 -> linux:217 (KEY_SEARCH) -> xorgkbd:None */
+ 0, /* rfb:230 -> linux:156 (KEY_BOOKMARKS) -> xorgkbd:None */
+ 0, /* rfb:231 -> linux:173 (KEY_REFRESH) -> xorgkbd:None */
+ 0, /* rfb:232 -> linux:128 (KEY_STOP) -> xorgkbd:None */
+ 0, /* rfb:233 -> linux:159 (KEY_FORWARD) -> xorgkbd:None */
+ 0, /* rfb:234 -> linux:158 (KEY_BACK) -> xorgkbd:None */
+ 0, /* rfb:235 -> linux:157 (KEY_COMPUTER) -> xorgkbd:None */
+ 0, /* rfb:236 -> linux:155 (KEY_MAIL) -> xorgkbd:None */
+ 0, /* rfb:237 -> linux:226 (KEY_MEDIA) -> xorgkbd:None */
+ 0, /* rfb:238 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:239 -> linux:112 (KEY_MACRO) -> xorgkbd:None */
+ 0, /* rfb:240 -> linux:235 (KEY_DOCUMENTS) -> xorgkbd:None */
+ 0, /* rfb:241 -> linux:236 (KEY_BATTERY) -> xorgkbd:None */
+ 0, /* rfb:242 -> linux:237 (KEY_BLUETOOTH) -> xorgkbd:None */
+ 0, /* rfb:243 -> linux:238 (KEY_WLAN) -> xorgkbd:None */
+ 0, /* rfb:244 -> linux:239 (KEY_UWB) -> xorgkbd:None */
+ 0, /* rfb:245 -> linux:138 (KEY_HELP) -> xorgkbd:None */
+ 0, /* rfb:246 -> linux:179 (KEY_KPLEFTPAREN) -> xorgkbd:None */
+ 0, /* rfb:247 -> linux:188 (KEY_F18) -> xorgkbd:None */
+ 0, /* rfb:248 -> linux:133 (KEY_COPY) -> xorgkbd:None */
+ 0, /* rfb:249 -> linux:192 (KEY_F22) -> xorgkbd:None */
+ 0, /* rfb:250 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:251 -> linux:180 (KEY_KPRIGHTPAREN) -> xorgkbd:None */
+ 0, /* rfb:252 -> linux:None (unnamed) -> xorgkbd:None */
+ 0, /* rfb:253 -> linux:162 (KEY_EJECTCLOSECD) -> xorgkbd:None */
+};
diff --git a/unix/x0vncserver/x0vncserver.cxx b/unix/x0vncserver/x0vncserver.cxx
index e16bd386..114c6f24 100644
--- a/unix/x0vncserver/x0vncserver.cxx
+++ b/unix/x0vncserver/x0vncserver.cxx
@@ -39,6 +39,7 @@
#include <X11/X.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
+#include <X11/XKBlib.h>
#ifdef HAVE_XTEST
#include <X11/extensions/XTest.h>
#endif
@@ -51,6 +52,9 @@
#include <x0vncserver/XPixelBuffer.h>
#include <x0vncserver/PollingScheduler.h>
+#include <x0vncserver/rfb_to_xorgevdev.h>
+#include <x0vncserver/rfb_to_xorgkbd.h>
+
// XXX Lynx/OS 2.3: protos for select(), bzero()
#ifdef Lynx
#include <sys/proto.h>
@@ -141,7 +145,7 @@ public:
XDesktop(Display* dpy_, Geometry *geometry_)
: dpy(dpy_), geometry(geometry_), pb(0), server(0),
oldButtonMask(0), haveXtest(false), haveDamage(false),
- maxButtons(0), running(false)
+ maxButtons(0), running(false), codeMap(0), codeMapLen(0)
{
#ifdef HAVE_XTEST
int xtestEventBase;
@@ -174,6 +178,34 @@ public:
#ifdef HAVE_XDAMAGE
}
#endif
+
+ // X11 unfortunately uses keyboard driver specific keycodes and provides no
+ // direct way to query this, so guess based on the keyboard mapping
+ XkbDescPtr desc = XkbGetKeyboard(dpy, XkbAllComponentsMask, XkbUseCoreKbd);
+ if (desc && desc->names) {
+ char *keycodes = XGetAtomName(dpy, desc->names->keycodes);
+
+ if (keycodes) {
+ if (strncmp("evdev", keycodes, strlen("evdev")) == 0) {
+ codeMap = code_map_rfb_to_xorgevdev;
+ codeMapLen = sizeof(code_map_rfb_to_xorgevdev) /
+ sizeof(code_map_rfb_to_xorgevdev[0]);
+
vlog.info("Using evdev codemap\n");
+ } else if (strncmp("xfree86", keycodes, strlen("xfree86")) == 0) {
+ codeMap = code_map_rfb_to_xorgkbd;
+ codeMapLen = sizeof(code_map_rfb_to_xorgkbd) /
+ sizeof(code_map_rfb_to_xorgkbd[0]);
+
vlog.info("Using xorgkbd codemap\n");
+ } else {
+
vlog.info("Unknown keycode '%s', no codemap\n", keycodes);
+ }
+ XFree(keycodes);
+ } else {
+ vlog.debug("Unable to get keycode map\n");
+ }
+
+ XkbFreeKeyboard(desc, 0, True);
+ }
}
virtual ~XDesktop() {
stop();
@@ -255,8 +287,16 @@ public:
virtual void keyEvent(rdr::U32 key, rdr::U32 code, bool down) {
#ifdef HAVE_XTEST
+ int keycode = 0;
if (!haveXtest) return;
- int keycode = XKeysymToKeycode(dpy, key);
+
+ // Use scan code if provided and mapping exists
+ if (codeMap && code < codeMapLen)
+ keycode = codeMap[code];
+
+ if (!keycode)
+ keycode = XKeysymToKeycode(dpy, key);
+
if (keycode)
XTestFakeKeyEvent(dpy, keycode, down, CurrentTime);
#endif
@@ -306,6 +346,8 @@ protected:
Damage damage;
int xdamageEventBase;
#endif
+ const unsigned short *codeMap;
+ unsigned codeMapLen;
};
--
2.11.0