All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrange" <berrange@redhat.com>
To: qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 2/2] Add pre-generated keymaps
Date: Tue, 17 Jan 2012 19:35:07 +0000	[thread overview]
Message-ID: <1326828907-13822-3-git-send-email-berrange@redhat.com> (raw)
In-Reply-To: <1326828907-13822-1-git-send-email-berrange@redhat.com>

From: "Daniel P. Berrange" <berrange@redhat.com>

To avoid the need for QEMU maintainers to have the perl Text::CSV
module on their build machines, add pre-generated keymaps for each
of the 6 conversions needed for QEMU's SDL driver
---
 ui/sdl_keymap_osx2rfb.c         |  117 +++++++++++++++++++
 ui/sdl_keymap_win322rfb.c       |  140 +++++++++++++++++++++++
 ui/sdl_keymap_xorgevdev2rfb.c   |  240 +++++++++++++++++++++++++++++++++++++++
 ui/sdl_keymap_xorgkbd2rfb.c     |  112 ++++++++++++++++++
 ui/sdl_keymap_xorgxquartz2rfb.c |  117 +++++++++++++++++++
 ui/sdl_keymap_xorgxwin2rfb.c    |  112 ++++++++++++++++++
 6 files changed, 838 insertions(+), 0 deletions(-)
 create mode 100644 ui/sdl_keymap_osx2rfb.c
 create mode 100644 ui/sdl_keymap_win322rfb.c
 create mode 100644 ui/sdl_keymap_xorgevdev2rfb.c
 create mode 100644 ui/sdl_keymap_xorgkbd2rfb.c
 create mode 100644 ui/sdl_keymap_xorgxquartz2rfb.c
 create mode 100644 ui/sdl_keymap_xorgxwin2rfb.c

diff --git a/ui/sdl_keymap_osx2rfb.c b/ui/sdl_keymap_osx2rfb.c
new file mode 100644
index 0000000..62cd692
--- /dev/null
+++ b/ui/sdl_keymap_osx2rfb.c
@@ -0,0 +1,117 @@
+static const guint16 keymap_osx2rfb[] = {
+  [0x0] = 0x1e,        /* 0 (ANSI_A) => 30 via 30 (KEY_A) */
+  [0x1] = 0x1f,        /* 1 (ANSI_S) => 31 via 31 (KEY_S) */
+  [0x2] = 0x20,        /* 2 (ANSI_D) => 32 via 32 (KEY_D) */
+  [0x3] = 0x21,        /* 3 (ANSI_F) => 33 via 33 (KEY_F) */
+  [0x4] = 0x23,        /* 4 (ANSI_H) => 35 via 35 (KEY_H) */
+  [0x5] = 0x22,        /* 5 (ANSI_G) => 34 via 34 (KEY_G) */
+  [0x6] = 0x2c,        /* 6 (ANSI_Z) => 44 via 44 (KEY_Z) */
+  [0x7] = 0x2d,        /* 7 (ANSI_X) => 45 via 45 (KEY_X) */
+  [0x8] = 0x2e,        /* 8 (ANSI_C) => 46 via 46 (KEY_C) */
+  [0x9] = 0x2f,        /* 9 (ANSI_V) => 47 via 47 (KEY_V) */
+  [0xa] = 0x70,        /* 10 (ISO_Section) => 112 via 170 (KEY_ISO) */
+  [0xb] = 0x30,        /* 11 (ANSI_B) => 48 via 48 (KEY_B) */
+  [0xc] = 0x10,        /* 12 (ANSI_Q) => 16 via 16 (KEY_Q) */
+  [0xd] = 0x11,        /* 13 (ANSI_W) => 17 via 17 (KEY_W) */
+  [0xe] = 0x12,        /* 14 (ANSI_E) => 18 via 18 (KEY_E) */
+  [0xf] = 0x13,        /* 15 (ANSI_R) => 19 via 19 (KEY_R) */
+  [0x10] = 0x15,       /* 16 (ANSI_Y) => 21 via 21 (KEY_Y) */
+  [0x11] = 0x14,       /* 17 (ANSI_T) => 20 via 20 (KEY_T) */
+  [0x12] = 0x2,        /* 18 (ANSI_1) => 2 via 2 (KEY_1) */
+  [0x13] = 0x3,        /* 19 (ANSI_2) => 3 via 3 (KEY_2) */
+  [0x14] = 0x4,        /* 20 (ANSI_3) => 4 via 4 (KEY_3) */
+  [0x15] = 0x5,        /* 21 (ANSI_4) => 5 via 5 (KEY_4) */
+  [0x16] = 0x7,        /* 22 (ANSI_6) => 7 via 7 (KEY_6) */
+  [0x17] = 0x6,        /* 23 (ANSI_5) => 6 via 6 (KEY_5) */
+  [0x18] = 0xd,        /* 24 (ANSI_Equal) => 13 via 13 (KEY_EQUAL) */
+  [0x19] = 0xa,        /* 25 (ANSI_9) => 10 via 10 (KEY_9) */
+  [0x1a] = 0x8,        /* 26 (ANSI_7) => 8 via 8 (KEY_7) */
+  [0x1b] = 0xc,        /* 27 (ANSI_Minus) => 12 via 12 (KEY_MINUS) */
+  [0x1c] = 0x9,        /* 28 (ANSI_8) => 9 via 9 (KEY_8) */
+  [0x1d] = 0xb,        /* 29 (ANSI_0) => 11 via 11 (KEY_0) */
+  [0x1e] = 0x1b,       /* 30 (ANSI_RightBracket) => 27 via 27 (KEY_RIGHTBRACE) */
+  [0x1f] = 0x18,       /* 31 (ANSI_O) => 24 via 24 (KEY_O) */
+  [0x20] = 0x16,       /* 32 (ANSI_U) => 22 via 22 (KEY_U) */
+  [0x21] = 0x1a,       /* 33 (ANSI_LeftBracket) => 26 via 26 (KEY_LEFTBRACE) */
+  [0x22] = 0x17,       /* 34 (ANSI_I) => 23 via 23 (KEY_I) */
+  [0x23] = 0x19,       /* 35 (ANSI_P) => 25 via 25 (KEY_P) */
+  [0x24] = 0x1c,       /* 36 (Return) => 28 via 28 (KEY_ENTER) */
+  [0x25] = 0x26,       /* 37 (ANSI_L) => 38 via 38 (KEY_L) */
+  [0x26] = 0x24,       /* 38 (ANSI_J) => 36 via 36 (KEY_J) */
+  [0x27] = 0x28,       /* 39 (ANSI_Quote) => 40 via 40 (KEY_APOSTROPHE) */
+  [0x28] = 0x25,       /* 40 (ANSI_K) => 37 via 37 (KEY_K) */
+  [0x29] = 0x27,       /* 41 (ANSI_Semicolon) => 39 via 39 (KEY_SEMICOLON) */
+  [0x2a] = 0x2b,       /* 42 (ANSI_Backslash) => 43 via 43 (KEY_BACKSLASH) */
+  [0x2b] = 0x33,       /* 43 (ANSI_Comma) => 51 via 51 (KEY_COMMA) */
+  [0x2c] = 0x35,       /* 44 (ANSI_Slash) => 53 via 53 (KEY_SLASH) */
+  [0x2d] = 0x31,       /* 45 (ANSI_N) => 49 via 49 (KEY_N) */
+  [0x2e] = 0x32,       /* 46 (ANSI_M) => 50 via 50 (KEY_M) */
+  [0x2f] = 0x34,       /* 47 (ANSI_Period) => 52 via 52 (KEY_DOT) */
+  [0x30] = 0xf,        /* 48 (Tab) => 15 via 15 (KEY_TAB) */
+  [0x31] = 0x39,       /* 49 (Space) => 57 via 57 (KEY_SPACE) */
+  [0x32] = 0x29,       /* 50 (ANSI_Grave) => 41 via 41 (KEY_GRAVE) */
+  [0x33] = 0xe,        /* 51 (Delete) => 14 via 14 (KEY_BACKSPACE) */
+  [0x35] = 0x1,        /* 53 (Escape) => 1 via 1 (KEY_ESC) */
+  [0x37] = 0xdb,       /* 55 (Command) => 219 via 125 (KEY_LEFTMETA) */
+  [0x38] = 0x2a,       /* 56 (Shift) => 42 via 42 (KEY_LEFTSHIFT) */
+  [0x39] = 0x3a,       /* 57 (CapsLock) => 58 via 58 (KEY_CAPSLOCK) */
+  [0x3a] = 0x38,       /* 58 (Option) => 56 via 56 (KEY_LEFTALT) */
+  [0x3b] = 0x1d,       /* 59 (Control) => 29 via 29 (KEY_LEFTCTRL) */
+  [0x3c] = 0x36,       /* 60 (RightShift) => 54 via 54 (KEY_RIGHTSHIFT) */
+  [0x3d] = 0xb8,       /* 61 (RightOption) => 184 via 100 (KEY_RIGHTALT) */
+  [0x3e] = 0x9d,       /* 62 (RightControl) => 157 via 97 (KEY_RIGHTCTRL) */
+  [0x3f] = 0xdd,       /* 63 (Function) => 221 via 127 (KEY_COMPOSE) */
+  [0x40] = 0x83,       /* 64 (F17) => 131 via 187 (KEY_F17) */
+  [0x41] = 0x53,       /* 65 (ANSI_KeypadDecimal) => 83 via 83 (KEY_KPDOT) */
+  [0x43] = 0x37,       /* 67 (ANSI_KeypadMultiply) => 55 via 55 (KEY_KPASTERISK) */
+  [0x45] = 0x4e,       /* 69 (ANSI_KeypadPlus) => 78 via 78 (KEY_KPPLUS) */
+  [0x47] = 0x7e,       /* 71 (ANSI_KeypadClear????) => 126 via 121 (KEY_KPCOMMA) */
+  [0x48] = 0xb0,       /* 72 (VolumeUp) => 176 via 115 (KEY_VOLUMEUP) */
+  [0x49] = 0xae,       /* 73 (VolumeDown) => 174 via 114 (KEY_VOLUMEDOWN) */
+  [0x4a] = 0xa0,       /* 74 (Mute) => 160 via 113 (KEY_MUTE) */
+  [0x4b] = 0xb5,       /* 75 (ANSI_KeypadDivide) => 181 via 98 (KEY_KPSLASH) */
+  [0x4c] = 0x9c,       /* 76 (ANSI_KeypadEnter) => 156 via 96 (KEY_KPENTER) */
+  [0x4e] = 0x4a,       /* 78 (ANSI_KeypadMinus) => 74 via 74 (KEY_KPMINUS) */
+  [0x4f] = 0xf7,       /* 79 (F18) => 247 via 188 (KEY_F18) */
+  [0x50] = 0x84,       /* 80 (F19) => 132 via 189 (KEY_F19) */
+  [0x51] = 0x59,       /* 81 (ANSI_KeypadEquals) => 89 via 117 (KEY_KPEQUAL) */
+  [0x52] = 0x52,       /* 82 (ANSI_Keypad0) => 82 via 82 (KEY_KP0) */
+  [0x53] = 0x4f,       /* 83 (ANSI_Keypad1) => 79 via 79 (KEY_KP1) */
+  [0x54] = 0x50,       /* 84 (ANSI_Keypad2) => 80 via 80 (KEY_KP2) */
+  [0x55] = 0x51,       /* 85 (ANSI_Keypad3) => 81 via 81 (KEY_KP3) */
+  [0x56] = 0x4b,       /* 86 (ANSI_Keypad4) => 75 via 75 (KEY_KP4) */
+  [0x57] = 0x4c,       /* 87 (ANSI_Keypad5) => 76 via 76 (KEY_KP5) */
+  [0x58] = 0x4d,       /* 88 (ANSI_Keypad6) => 77 via 77 (KEY_KP6) */
+  [0x59] = 0x47,       /* 89 (ANSI_Keypad7) => 71 via 71 (KEY_KP7) */
+  [0x5a] = 0x5a,       /* 90 (F20) => 90 via 190 (KEY_F20) */
+  [0x5b] = 0x48,       /* 91 (ANSI_Keypad8) => 72 via 72 (KEY_KP8) */
+  [0x5c] = 0x49,       /* 92 (ANSI_Keypad9) => 73 via 73 (KEY_KP9) */
+  [0x5d] = 0x7d,       /* 93 (JIS_Yen) => 125 via 124 (KEY_YEN) */
+  [0x5f] = 0x5c,       /* 95 (JIS_KeypadComma) => 92 via 95 (KEY_KPJPCOMMA) */
+  [0x60] = 0x3f,       /* 96 (F5) => 63 via 63 (KEY_F5) */
+  [0x61] = 0x40,       /* 97 (F6) => 64 via 64 (KEY_F6) */
+  [0x62] = 0x41,       /* 98 (F7) => 65 via 65 (KEY_F7) */
+  [0x63] = 0x3d,       /* 99 (F3) => 61 via 61 (KEY_F3) */
+  [0x64] = 0x42,       /* 100 (F8) => 66 via 66 (KEY_F8) */
+  [0x65] = 0x43,       /* 101 (F9) => 67 via 67 (KEY_F9) */
+  [0x67] = 0x57,       /* 103 (F11) => 87 via 87 (KEY_F11) */
+  [0x68] = 0x78,       /* 104 (JIS_Kana????) => 120 via 90 (KEY_KATAKANA) */
+  [0x69] = 0x5d,       /* 105 (F13) => 93 via 183 (KEY_F13) */
+  [0x6a] = 0x55,       /* 106 (F16) => 85 via 186 (KEY_F16) */
+  [0x6b] = 0x5e,       /* 107 (F14) => 94 via 184 (KEY_F14) */
+  [0x6d] = 0x44,       /* 109 (F10) => 68 via 68 (KEY_F10) */
+  [0x6f] = 0x58,       /* 111 (F12) => 88 via 88 (KEY_F12) */
+  [0x71] = 0x5f,       /* 113 (F15) => 95 via 185 (KEY_F15) */
+  [0x73] = 0xc7,       /* 115 (Home) => 199 via 102 (KEY_HOME) */
+  [0x74] = 0xc9,       /* 116 (PageUp) => 201 via 104 (KEY_PAGEUP) */
+  [0x75] = 0xd3,       /* 117 (ForwardDelete) => 211 via 111 (KEY_DELETE) */
+  [0x76] = 0x3e,       /* 118 (F4) => 62 via 62 (KEY_F4) */
+  [0x77] = 0xcf,       /* 119 (End) => 207 via 107 (KEY_END) */
+  [0x78] = 0x3c,       /* 120 (F2) => 60 via 60 (KEY_F2) */
+  [0x79] = 0xd1,       /* 121 (PageDown) => 209 via 109 (KEY_PAGEDOWN) */
+  [0x7a] = 0x3b,       /* 122 (F1) => 59 via 59 (KEY_F1) */
+  [0x7b] = 0xcb,       /* 123 (LeftArrow) => 203 via 105 (KEY_LEFT) */
+  [0x7c] = 0xcd,       /* 124 (RightArrow) => 205 via 106 (KEY_RIGHT) */
+  [0x7d] = 0xd0,       /* 125 (DownArrow) => 208 via 108 (KEY_DOWN) */
+  [0x7e] = 0xc8,       /* 126 (UpArrow) => 200 via 103 (KEY_UP) */
+};
diff --git a/ui/sdl_keymap_win322rfb.c b/ui/sdl_keymap_win322rfb.c
new file mode 100644
index 0000000..74a01d1
--- /dev/null
+++ b/ui/sdl_keymap_win322rfb.c
@@ -0,0 +1,140 @@
+static const guint16 keymap_win322rfb[] = {
+  [0x8] = 0xe,         /* 8 (VK_BACK) => 14 via 14 (KEY_BACKSPACE) */
+  [0x9] = 0xf,         /* 9 (VK_TAB) => 15 via 15 (KEY_TAB) */
+  [0xd] = 0x1c,        /* 13 (VK_RETURN) => 28 via 28 (KEY_ENTER) */
+  [0x10] = 0x2a,       /* 16 (VK_LSHIFT) => 42 via 42 (KEY_LEFTSHIFT) */
+  [0x11] = 0x1d,       /* 17 (VK_CONTROL) => 29 via 29 (KEY_LEFTCTRL) */
+  [0x12] = 0x38,       /* 18 (VK_MENU) => 56 via 56 (KEY_LEFTALT) */
+  [0x13] = 0xc6,       /* 19 (VK_PAUSE) => 198 via 119 (KEY_PAUSE) */
+  [0x14] = 0x3a,       /* 20 (VK_CAPITAL) => 58 via 58 (KEY_CAPSLOCK) */
+  [0x19] = 0x8d,       /* 25 (VK_HANJA) => 141 via 123 (KEY_HANJA) */
+  [0x1b] = 0x1,        /* 27 (VK_ESCAPE) => 1 via 1 (KEY_ESC) */
+  [0x20] = 0x39,       /* 32 (VK_SPACE) => 57 via 57 (KEY_SPACE) */
+  [0x21] = 0xc9,       /* 33 (VK_PRIOR) => 201 via 104 (KEY_PAGEUP) */
+  [0x22] = 0xd1,       /* 34 (VK_NEXT) => 209 via 109 (KEY_PAGEDOWN) */
+  [0x23] = 0xcf,       /* 35 (VK_END) => 207 via 107 (KEY_END) */
+  [0x24] = 0xc7,       /* 36 (VK_HOME) => 199 via 102 (KEY_HOME) */
+  [0x25] = 0xcb,       /* 37 (VK_LEFT) => 203 via 105 (KEY_LEFT) */
+  [0x26] = 0xc8,       /* 38 (VK_UP) => 200 via 103 (KEY_UP) */
+  [0x27] = 0xcd,       /* 39 (VK_RIGHT) => 205 via 106 (KEY_RIGHT) */
+  [0x28] = 0xd0,       /* 40 (VK_DOWN) => 208 via 108 (KEY_DOWN) */
+  [0x2a] = 0xb9,       /* 42 (VK_PRINT) => 185 via 210 (KEY_PRINT) */
+  [0x2c] = 0x54,       /* 44 (VK_SNAPSHOT ???) => 84 via 99 (KEY_SYSRQ) */
+  [0x2d] = 0xd2,       /* 45 (VK_INSERT) => 210 via 110 (KEY_INSERT) */
+  [0x2e] = 0xd3,       /* 46 (VK_DELETE) => 211 via 111 (KEY_DELETE) */
+  [0x2f] = 0xf5,       /* 47 (VK_HELP) => 245 via 138 (KEY_HELP) */
+  [0x30] = 0xb,        /* 48 (VK_0) => 11 via 11 (KEY_0) */
+  [0x31] = 0x2,        /* 49 (VK_1) => 2 via 2 (KEY_1) */
+  [0x32] = 0x3,        /* 50 (VK_2) => 3 via 3 (KEY_2) */
+  [0x33] = 0x4,        /* 51 (VK_3) => 4 via 4 (KEY_3) */
+  [0x34] = 0x5,        /* 52 (VK_4) => 5 via 5 (KEY_4) */
+  [0x35] = 0x6,        /* 53 (VK_5) => 6 via 6 (KEY_5) */
+  [0x36] = 0x7,        /* 54 (VK_6) => 7 via 7 (KEY_6) */
+  [0x37] = 0x8,        /* 55 (VK_7) => 8 via 8 (KEY_7) */
+  [0x38] = 0x9,        /* 56 (VK_8) => 9 via 9 (KEY_8) */
+  [0x39] = 0xa,        /* 57 (VK_9) => 10 via 10 (KEY_9) */
+  [0x41] = 0x1e,       /* 65 (VK_A) => 30 via 30 (KEY_A) */
+  [0x42] = 0x30,       /* 66 (VK_B) => 48 via 48 (KEY_B) */
+  [0x43] = 0x2e,       /* 67 (VK_C) => 46 via 46 (KEY_C) */
+  [0x44] = 0x20,       /* 68 (VK_D) => 32 via 32 (KEY_D) */
+  [0x45] = 0x12,       /* 69 (VK_E) => 18 via 18 (KEY_E) */
+  [0x46] = 0x21,       /* 70 (VK_F) => 33 via 33 (KEY_F) */
+  [0x47] = 0x22,       /* 71 (VK_G) => 34 via 34 (KEY_G) */
+  [0x48] = 0x23,       /* 72 (VK_H) => 35 via 35 (KEY_H) */
+  [0x49] = 0x17,       /* 73 (VK_I) => 23 via 23 (KEY_I) */
+  [0x4a] = 0x24,       /* 74 (VK_J) => 36 via 36 (KEY_J) */
+  [0x4b] = 0x25,       /* 75 (VK_K) => 37 via 37 (KEY_K) */
+  [0x4c] = 0x26,       /* 76 (VK_L) => 38 via 38 (KEY_L) */
+  [0x4d] = 0x32,       /* 77 (VK_M) => 50 via 50 (KEY_M) */
+  [0x4e] = 0x31,       /* 78 (VK_N) => 49 via 49 (KEY_N) */
+  [0x4f] = 0x18,       /* 79 (VK_O) => 24 via 24 (KEY_O) */
+  [0x50] = 0x19,       /* 80 (VK_P) => 25 via 25 (KEY_P) */
+  [0x51] = 0x10,       /* 81 (VK_Q) => 16 via 16 (KEY_Q) */
+  [0x52] = 0x13,       /* 82 (VK_R) => 19 via 19 (KEY_R) */
+  [0x53] = 0x1f,       /* 83 (VK_S) => 31 via 31 (KEY_S) */
+  [0x54] = 0x14,       /* 84 (VK_T) => 20 via 20 (KEY_T) */
+  [0x55] = 0x16,       /* 85 (VK_U) => 22 via 22 (KEY_U) */
+  [0x56] = 0x2f,       /* 86 (VK_V) => 47 via 47 (KEY_V) */
+  [0x57] = 0x11,       /* 87 (VK_W) => 17 via 17 (KEY_W) */
+  [0x58] = 0x2d,       /* 88 (VK_X) => 45 via 45 (KEY_X) */
+  [0x59] = 0x15,       /* 89 (VK_Y) => 21 via 21 (KEY_Y) */
+  [0x5a] = 0x2c,       /* 90 (VK_Z) => 44 via 44 (KEY_Z) */
+  [0x5b] = 0xdb,       /* 91 (VK_LWIN) => 219 via 125 (KEY_LEFTMETA) */
+  [0x5c] = 0xdc,       /* 92 (VK_RWIN) => 220 via 126 (KEY_RIGHTMETA) */
+  [0x5d] = 0xdd,       /* 93 (VK_APPS) => 221 via 127 (KEY_COMPOSE) */
+  [0x5f] = 0xdf,       /* 95 (VK_SLEEP) => 223 via 142 (KEY_SLEEP) */
+  [0x60] = 0x52,       /* 96 (VK_NUMPAD0) => 82 via 82 (KEY_KP0) */
+  [0x61] = 0x4f,       /* 97 (VK_NUMPAD1) => 79 via 79 (KEY_KP1) */
+  [0x62] = 0x50,       /* 98 (VK_NUMPAD2) => 80 via 80 (KEY_KP2) */
+  [0x63] = 0x51,       /* 99 (VK_NUMPAD3) => 81 via 81 (KEY_KP3) */
+  [0x64] = 0x4b,       /* 100 (VK_NUMPAD4) => 75 via 75 (KEY_KP4) */
+  [0x65] = 0x4c,       /* 101 (VK_NUMPAD5) => 76 via 76 (KEY_KP5) */
+  [0x66] = 0x4d,       /* 102 (VK_NUMPAD6) => 77 via 77 (KEY_KP6) */
+  [0x67] = 0x47,       /* 103 (VK_NUMPAD7) => 71 via 71 (KEY_KP7) */
+  [0x68] = 0x48,       /* 104 (VK_NUMPAD8) => 72 via 72 (KEY_KP8) */
+  [0x69] = 0x49,       /* 105 (VK_NUMPAD9) => 73 via 73 (KEY_KP9) */
+  [0x6a] = 0x37,       /* 106 (VK_MULTIPLY) => 55 via 55 (KEY_KPASTERISK) */
+  [0x6b] = 0x4e,       /* 107 (VK_ADD) => 78 via 78 (KEY_KPPLUS) */
+  [0x6c] = 0x7e,       /* 108 (VK_SEPARATOR??) => 126 via 121 (KEY_KPCOMMA) */
+  [0x6d] = 0x4a,       /* 109 (VK_SUBTRACT) => 74 via 74 (KEY_KPMINUS) */
+  [0x6e] = 0x53,       /* 110 (VK_DECIMAL) => 83 via 83 (KEY_KPDOT) */
+  [0x6f] = 0xb5,       /* 111 (VK_DIVIDE) => 181 via 98 (KEY_KPSLASH) */
+  [0x70] = 0x3b,       /* 112 (VK_F1) => 59 via 59 (KEY_F1) */
+  [0x71] = 0x3c,       /* 113 (VK_F2) => 60 via 60 (KEY_F2) */
+  [0x72] = 0x3d,       /* 114 (VK_F3) => 61 via 61 (KEY_F3) */
+  [0x73] = 0x3e,       /* 115 (VK_F4) => 62 via 62 (KEY_F4) */
+  [0x74] = 0x3f,       /* 116 (VK_F5) => 63 via 63 (KEY_F5) */
+  [0x75] = 0x40,       /* 117 (VK_F6) => 64 via 64 (KEY_F6) */
+  [0x76] = 0x41,       /* 118 (VK_F7) => 65 via 65 (KEY_F7) */
+  [0x77] = 0x42,       /* 119 (VK_F8) => 66 via 66 (KEY_F8) */
+  [0x78] = 0x43,       /* 120 (VK_F9) => 67 via 67 (KEY_F9) */
+  [0x79] = 0x44,       /* 121 (VK_F10) => 68 via 68 (KEY_F10) */
+  [0x7a] = 0x57,       /* 122 (VK_F11) => 87 via 87 (KEY_F11) */
+  [0x7b] = 0x58,       /* 123 (VK_F12) => 88 via 88 (KEY_F12) */
+  [0x7c] = 0x5d,       /* 124 (VK_F13) => 93 via 183 (KEY_F13) */
+  [0x7d] = 0x5e,       /* 125 (VK_F14) => 94 via 184 (KEY_F14) */
+  [0x7e] = 0x5f,       /* 126 (VK_F15) => 95 via 185 (KEY_F15) */
+  [0x7f] = 0x55,       /* 127 (VK_F16) => 85 via 186 (KEY_F16) */
+  [0x80] = 0x83,       /* 128 (VK_F17) => 131 via 187 (KEY_F17) */
+  [0x81] = 0xf7,       /* 129 (VK_F18) => 247 via 188 (KEY_F18) */
+  [0x82] = 0x84,       /* 130 (VK_F19) => 132 via 189 (KEY_F19) */
+  [0x83] = 0x5a,       /* 131 (VK_F20) => 90 via 190 (KEY_F20) */
+  [0x84] = 0x74,       /* 132 (VK_F21) => 116 via 191 (KEY_F21) */
+  [0x85] = 0xf9,       /* 133 (VK_F22) => 249 via 192 (KEY_F22) */
+  [0x86] = 0x6d,       /* 134 (VK_F23) => 109 via 193 (KEY_F23) */
+  [0x87] = 0x6f,       /* 135 (VK_F24) => 111 via 194 (KEY_F24) */
+  [0x90] = 0x45,       /* 144 (VK_NUMLOCK) => 69 via 69 (KEY_NUMLOCK) */
+  [0x91] = 0x46,       /* 145 (VK_SCROLL) => 70 via 70 (KEY_SCROLLLOCK) */
+  [0xa0] = 0x2a,       /* 160 (VK_LSHIFT) => 42 via 42 (KEY_LEFTSHIFT) */
+  [0xa1] = 0x36,       /* 161 (VK_RSHIFT) => 54 via 54 (KEY_RIGHTSHIFT) */
+  [0xa2] = 0x1d,       /* 162 (VK_CONTROL) => 29 via 29 (KEY_LEFTCTRL) */
+  [0xa3] = 0x9d,       /* 163 (VK_RCONTROL) => 157 via 97 (KEY_RIGHTCTRL) */
+  [0xa4] = 0x38,       /* 164 (VK_MENU) => 56 via 56 (KEY_LEFTALT) */
+  [0xa5] = 0xb8,       /* 165 (VK_RMENU) => 184 via 100 (KEY_RIGHTALT) */
+  [0xa6] = 0xea,       /* 166 (VK_BROWSER_BACK) => 234 via 158 (KEY_BACK) */
+  [0xa7] = 0xe9,       /* 167 (VK_BROWSER_FORWARD) => 233 via 159 (KEY_FORWARD) */
+  [0xa8] = 0xe7,       /* 168 (VK_BROWSER_REFRESH) => 231 via 173 (KEY_REFRESH) */
+  [0xa9] = 0xe8,       /* 169 (VK_BROWSER_STOP) => 232 via 128 (KEY_STOP) */
+  [0xaa] = 0xe5,       /* 170 (VK_BROWSER_SEARCH) => 229 via 217 (KEY_SEARCH) */
+  [0xac] = 0xb2,       /* 172 (VK_BROWSER_HOME) => 178 via 172 (KEY_HOMEPAGE) */
+  [0xad] = 0xa0,       /* 173 (VK_VOLUME_MUTE) => 160 via 113 (KEY_MUTE) */
+  [0xae] = 0xae,       /* 174 (VK_VOLUME_DOWN) => 174 via 114 (KEY_VOLUMEDOWN) */
+  [0xaf] = 0xb0,       /* 175 (VK_VOLUME_UP) => 176 via 115 (KEY_VOLUMEUP) */
+  [0xb0] = 0x99,       /* 176 (VK_MEDIA_NEXT_TRACK) => 153 via 163 (KEY_NEXTSONG) */
+  [0xb1] = 0x90,       /* 177 (VK_MEDIA_PREV_TRACK) => 144 via 165 (KEY_PREVIOUSSONG) */
+  [0xb2] = 0xa4,       /* 178 (VK_MEDIA_STOP) => 164 via 166 (KEY_STOPCD) */
+  [0xb3] = 0xa2,       /* 179 (VK_MEDIA_PLAY_PAUSE) => 162 via 164 (KEY_PLAYPAUSE) */
+  [0xb4] = 0xbf,       /* 180 (VK_LAUNCH_MAIL) => 191 via 215 (KEY_EMAIL) */
+  [0xba] = 0x27,       /* 186 (VK_OEM_1) => 39 via 39 (KEY_SEMICOLON) */
+  [0xbb] = 0xd,        /* 187 (VK_OEM_PLUS) => 13 via 13 (KEY_EQUAL) */
+  [0xbc] = 0x33,       /* 188 (VK_OEM_COMMA) => 51 via 51 (KEY_COMMA) */
+  [0xbd] = 0xc,        /* 189 (VK_OEM_MINUS) => 12 via 12 (KEY_MINUS) */
+  [0xbe] = 0x34,       /* 190 (VK_OEM_PERIOD) => 52 via 52 (KEY_DOT) */
+  [0xbf] = 0x35,       /* 191 (VK_OEM_2) => 53 via 53 (KEY_SLASH) */
+  [0xc0] = 0x29,       /* 192 (VK_OEM_3) => 41 via 41 (KEY_GRAVE) */
+  [0xdb] = 0x1a,       /* 219 (VK_OEM_4) => 26 via 26 (KEY_LEFTBRACE) */
+  [0xdc] = 0x2b,       /* 220 (VK_OEM_5) => 43 via 43 (KEY_BACKSLASH) */
+  [0xdd] = 0x1b,       /* 221 (VK_OEM_6) => 27 via 27 (KEY_RIGHTBRACE) */
+  [0xe1] = 0x56,       /* 225 (VK_OEM_102) => 86 via 86 (KEY_102ND) */
+  [0xfa] = 0xb3,       /* 250 (VK_PLAY) => 179 via 207 (KEY_PLAY) */
+};
diff --git a/ui/sdl_keymap_xorgevdev2rfb.c b/ui/sdl_keymap_xorgevdev2rfb.c
new file mode 100644
index 0000000..6f12b32
--- /dev/null
+++ b/ui/sdl_keymap_xorgevdev2rfb.c
@@ -0,0 +1,240 @@
+static const guint16 keymap_xorgevdev2rfb[] = {
+  [0x9] = 0x1,         /* 9 => 1 via 1 (KEY_ESC) */
+  [0xa] = 0x2,         /* 10 => 2 via 2 (KEY_1) */
+  [0xb] = 0x3,         /* 11 => 3 via 3 (KEY_2) */
+  [0xc] = 0x4,         /* 12 => 4 via 4 (KEY_3) */
+  [0xd] = 0x5,         /* 13 => 5 via 5 (KEY_4) */
+  [0xe] = 0x6,         /* 14 => 6 via 6 (KEY_5) */
+  [0xf] = 0x7,         /* 15 => 7 via 7 (KEY_6) */
+  [0x10] = 0x8,        /* 16 => 8 via 8 (KEY_7) */
+  [0x11] = 0x9,        /* 17 => 9 via 9 (KEY_8) */
+  [0x12] = 0xa,        /* 18 => 10 via 10 (KEY_9) */
+  [0x13] = 0xb,        /* 19 => 11 via 11 (KEY_0) */
+  [0x14] = 0xc,        /* 20 => 12 via 12 (KEY_MINUS) */
+  [0x15] = 0xd,        /* 21 => 13 via 13 (KEY_EQUAL) */
+  [0x16] = 0xe,        /* 22 => 14 via 14 (KEY_BACKSPACE) */
+  [0x17] = 0xf,        /* 23 => 15 via 15 (KEY_TAB) */
+  [0x18] = 0x10,       /* 24 => 16 via 16 (KEY_Q) */
+  [0x19] = 0x11,       /* 25 => 17 via 17 (KEY_W) */
+  [0x1a] = 0x12,       /* 26 => 18 via 18 (KEY_E) */
+  [0x1b] = 0x13,       /* 27 => 19 via 19 (KEY_R) */
+  [0x1c] = 0x14,       /* 28 => 20 via 20 (KEY_T) */
+  [0x1d] = 0x15,       /* 29 => 21 via 21 (KEY_Y) */
+  [0x1e] = 0x16,       /* 30 => 22 via 22 (KEY_U) */
+  [0x1f] = 0x17,       /* 31 => 23 via 23 (KEY_I) */
+  [0x20] = 0x18,       /* 32 => 24 via 24 (KEY_O) */
+  [0x21] = 0x19,       /* 33 => 25 via 25 (KEY_P) */
+  [0x22] = 0x1a,       /* 34 => 26 via 26 (KEY_LEFTBRACE) */
+  [0x23] = 0x1b,       /* 35 => 27 via 27 (KEY_RIGHTBRACE) */
+  [0x24] = 0x1c,       /* 36 => 28 via 28 (KEY_ENTER) */
+  [0x25] = 0x1d,       /* 37 => 29 via 29 (KEY_LEFTCTRL) */
+  [0x26] = 0x1e,       /* 38 => 30 via 30 (KEY_A) */
+  [0x27] = 0x1f,       /* 39 => 31 via 31 (KEY_S) */
+  [0x28] = 0x20,       /* 40 => 32 via 32 (KEY_D) */
+  [0x29] = 0x21,       /* 41 => 33 via 33 (KEY_F) */
+  [0x2a] = 0x22,       /* 42 => 34 via 34 (KEY_G) */
+  [0x2b] = 0x23,       /* 43 => 35 via 35 (KEY_H) */
+  [0x2c] = 0x24,       /* 44 => 36 via 36 (KEY_J) */
+  [0x2d] = 0x25,       /* 45 => 37 via 37 (KEY_K) */
+  [0x2e] = 0x26,       /* 46 => 38 via 38 (KEY_L) */
+  [0x2f] = 0x27,       /* 47 => 39 via 39 (KEY_SEMICOLON) */
+  [0x30] = 0x28,       /* 48 => 40 via 40 (KEY_APOSTROPHE) */
+  [0x31] = 0x29,       /* 49 => 41 via 41 (KEY_GRAVE) */
+  [0x32] = 0x2a,       /* 50 => 42 via 42 (KEY_LEFTSHIFT) */
+  [0x33] = 0x2b,       /* 51 => 43 via 43 (KEY_BACKSLASH) */
+  [0x34] = 0x2c,       /* 52 => 44 via 44 (KEY_Z) */
+  [0x35] = 0x2d,       /* 53 => 45 via 45 (KEY_X) */
+  [0x36] = 0x2e,       /* 54 => 46 via 46 (KEY_C) */
+  [0x37] = 0x2f,       /* 55 => 47 via 47 (KEY_V) */
+  [0x38] = 0x30,       /* 56 => 48 via 48 (KEY_B) */
+  [0x39] = 0x31,       /* 57 => 49 via 49 (KEY_N) */
+  [0x3a] = 0x32,       /* 58 => 50 via 50 (KEY_M) */
+  [0x3b] = 0x33,       /* 59 => 51 via 51 (KEY_COMMA) */
+  [0x3c] = 0x34,       /* 60 => 52 via 52 (KEY_DOT) */
+  [0x3d] = 0x35,       /* 61 => 53 via 53 (KEY_SLASH) */
+  [0x3e] = 0x36,       /* 62 => 54 via 54 (KEY_RIGHTSHIFT) */
+  [0x3f] = 0x37,       /* 63 => 55 via 55 (KEY_KPASTERISK) */
+  [0x40] = 0x38,       /* 64 => 56 via 56 (KEY_LEFTALT) */
+  [0x41] = 0x39,       /* 65 => 57 via 57 (KEY_SPACE) */
+  [0x42] = 0x3a,       /* 66 => 58 via 58 (KEY_CAPSLOCK) */
+  [0x43] = 0x3b,       /* 67 => 59 via 59 (KEY_F1) */
+  [0x44] = 0x3c,       /* 68 => 60 via 60 (KEY_F2) */
+  [0x45] = 0x3d,       /* 69 => 61 via 61 (KEY_F3) */
+  [0x46] = 0x3e,       /* 70 => 62 via 62 (KEY_F4) */
+  [0x47] = 0x3f,       /* 71 => 63 via 63 (KEY_F5) */
+  [0x48] = 0x40,       /* 72 => 64 via 64 (KEY_F6) */
+  [0x49] = 0x41,       /* 73 => 65 via 65 (KEY_F7) */
+  [0x4a] = 0x42,       /* 74 => 66 via 66 (KEY_F8) */
+  [0x4b] = 0x43,       /* 75 => 67 via 67 (KEY_F9) */
+  [0x4c] = 0x44,       /* 76 => 68 via 68 (KEY_F10) */
+  [0x4d] = 0x45,       /* 77 => 69 via 69 (KEY_NUMLOCK) */
+  [0x4e] = 0x46,       /* 78 => 70 via 70 (KEY_SCROLLLOCK) */
+  [0x4f] = 0x47,       /* 79 => 71 via 71 (KEY_KP7) */
+  [0x50] = 0x48,       /* 80 => 72 via 72 (KEY_KP8) */
+  [0x51] = 0x49,       /* 81 => 73 via 73 (KEY_KP9) */
+  [0x52] = 0x4a,       /* 82 => 74 via 74 (KEY_KPMINUS) */
+  [0x53] = 0x4b,       /* 83 => 75 via 75 (KEY_KP4) */
+  [0x54] = 0x4c,       /* 84 => 76 via 76 (KEY_KP5) */
+  [0x55] = 0x4d,       /* 85 => 77 via 77 (KEY_KP6) */
+  [0x56] = 0x4e,       /* 86 => 78 via 78 (KEY_KPPLUS) */
+  [0x57] = 0x4f,       /* 87 => 79 via 79 (KEY_KP1) */
+  [0x58] = 0x50,       /* 88 => 80 via 80 (KEY_KP2) */
+  [0x59] = 0x51,       /* 89 => 81 via 81 (KEY_KP3) */
+  [0x5a] = 0x52,       /* 90 => 82 via 82 (KEY_KP0) */
+  [0x5b] = 0x53,       /* 91 => 83 via 83 (KEY_KPDOT) */
+  [0x5c] = 0x54,       /* 92 => 84 via 84 */
+  [0x5d] = 0x76,       /* 93 => 118 via 85 (KEY_ZENKAKUHANKAKU) */
+  [0x5e] = 0x56,       /* 94 => 86 via 86 (KEY_102ND) */
+  [0x5f] = 0x57,       /* 95 => 87 via 87 (KEY_F11) */
+  [0x60] = 0x58,       /* 96 => 88 via 88 (KEY_F12) */
+  [0x61] = 0x73,       /* 97 => 115 via 89 (KEY_RO) */
+  [0x62] = 0x78,       /* 98 => 120 via 90 (KEY_KATAKANA) */
+  [0x63] = 0x77,       /* 99 => 119 via 91 (KEY_HIRAGANA) */
+  [0x64] = 0x79,       /* 100 => 121 via 92 (KEY_HENKAN) */
+  [0x65] = 0x70,       /* 101 => 112 via 93 (KEY_KATAKANAHIRAGANA) */
+  [0x66] = 0x7b,       /* 102 => 123 via 94 (KEY_MUHENKAN) */
+  [0x67] = 0x5c,       /* 103 => 92 via 95 (KEY_KPJPCOMMA) */
+  [0x68] = 0x9c,       /* 104 => 156 via 96 (KEY_KPENTER) */
+  [0x69] = 0x9d,       /* 105 => 157 via 97 (KEY_RIGHTCTRL) */
+  [0x6a] = 0xb5,       /* 106 => 181 via 98 (KEY_KPSLASH) */
+  [0x6b] = 0x54,       /* 107 => 84 via 99 (KEY_SYSRQ) */
+  [0x6c] = 0xb8,       /* 108 => 184 via 100 (KEY_RIGHTALT) */
+  [0x6d] = 0x5b,       /* 109 => 91 via 101 (KEY_LINEFEED) */
+  [0x6e] = 0xc7,       /* 110 => 199 via 102 (KEY_HOME) */
+  [0x6f] = 0xc8,       /* 111 => 200 via 103 (KEY_UP) */
+  [0x70] = 0xc9,       /* 112 => 201 via 104 (KEY_PAGEUP) */
+  [0x71] = 0xcb,       /* 113 => 203 via 105 (KEY_LEFT) */
+  [0x72] = 0xcd,       /* 114 => 205 via 106 (KEY_RIGHT) */
+  [0x73] = 0xcf,       /* 115 => 207 via 107 (KEY_END) */
+  [0x74] = 0xd0,       /* 116 => 208 via 108 (KEY_DOWN) */
+  [0x75] = 0xd1,       /* 117 => 209 via 109 (KEY_PAGEDOWN) */
+  [0x76] = 0xd2,       /* 118 => 210 via 110 (KEY_INSERT) */
+  [0x77] = 0xd3,       /* 119 => 211 via 111 (KEY_DELETE) */
+  [0x78] = 0xef,       /* 120 => 239 via 112 (KEY_MACRO) */
+  [0x79] = 0xa0,       /* 121 => 160 via 113 (KEY_MUTE) */
+  [0x7a] = 0xae,       /* 122 => 174 via 114 (KEY_VOLUMEDOWN) */
+  [0x7b] = 0xb0,       /* 123 => 176 via 115 (KEY_VOLUMEUP) */
+  [0x7c] = 0xde,       /* 124 => 222 via 116 (KEY_POWER) */
+  [0x7d] = 0x59,       /* 125 => 89 via 117 (KEY_KPEQUAL) */
+  [0x7e] = 0xce,       /* 126 => 206 via 118 (KEY_KPPLUSMINUS) */
+  [0x7f] = 0xc6,       /* 127 => 198 via 119 (KEY_PAUSE) */
+  [0x80] = 0x8b,       /* 128 => 139 via 120 (KEY_SCALE) */
+  [0x81] = 0x7e,       /* 129 => 126 via 121 (KEY_KPCOMMA) */
+  [0x83] = 0x8d,       /* 131 => 141 via 123 (KEY_HANJA) */
+  [0x84] = 0x7d,       /* 132 => 125 via 124 (KEY_YEN) */
+  [0x85] = 0xdb,       /* 133 => 219 via 125 (KEY_LEFTMETA) */
+  [0x86] = 0xdc,       /* 134 => 220 via 126 (KEY_RIGHTMETA) */
+  [0x87] = 0xdd,       /* 135 => 221 via 127 (KEY_COMPOSE) */
+  [0x88] = 0xe8,       /* 136 => 232 via 128 (KEY_STOP) */
+  [0x89] = 0x85,       /* 137 => 133 via 129 (KEY_AGAIN) */
+  [0x8a] = 0x86,       /* 138 => 134 via 130 (KEY_PROPS) */
+  [0x8b] = 0x87,       /* 139 => 135 via 131 (KEY_UNDO) */
+  [0x8c] = 0x8c,       /* 140 => 140 via 132 (KEY_FRONT) */
+  [0x8d] = 0xf8,       /* 141 => 248 via 133 (KEY_COPY) */
+  [0x8e] = 0x64,       /* 142 => 100 via 134 (KEY_OPEN) */
+  [0x8f] = 0x65,       /* 143 => 101 via 135 (KEY_PASTE) */
+  [0x90] = 0xc1,       /* 144 => 193 via 136 (KEY_FIND) */
+  [0x91] = 0xbc,       /* 145 => 188 via 137 (KEY_CUT) */
+  [0x92] = 0xf5,       /* 146 => 245 via 138 (KEY_HELP) */
+  [0x93] = 0x9e,       /* 147 => 158 via 139 (KEY_MENU) */
+  [0x94] = 0xa1,       /* 148 => 161 via 140 (KEY_CALC) */
+  [0x95] = 0x66,       /* 149 => 102 via 141 (KEY_SETUP) */
+  [0x96] = 0xdf,       /* 150 => 223 via 142 (KEY_SLEEP) */
+  [0x97] = 0xe3,       /* 151 => 227 via 143 (KEY_WAKEUP) */
+  [0x98] = 0x67,       /* 152 => 103 via 144 (KEY_FILE) */
+  [0x99] = 0x68,       /* 153 => 104 via 145 (KEY_SENDFILE) */
+  [0x9a] = 0x69,       /* 154 => 105 via 146 (KEY_DELETEFILE) */
+  [0x9b] = 0x93,       /* 155 => 147 via 147 (KEY_XFER) */
+  [0x9c] = 0x9f,       /* 156 => 159 via 148 (KEY_PROG1) */
+  [0x9d] = 0x97,       /* 157 => 151 via 149 (KEY_PROG2) */
+  [0x9e] = 0x82,       /* 158 => 130 via 150 (KEY_WWW) */
+  [0x9f] = 0x6a,       /* 159 => 106 via 151 (KEY_MSDOS) */
+  [0xa0] = 0x92,       /* 160 => 146 via 152 (KEY_SCREENLOCK) */
+  [0xa1] = 0x6b,       /* 161 => 107 via 153 (KEY_DIRECTION) */
+  [0xa2] = 0xa6,       /* 162 => 166 via 154 (KEY_CYCLEWINDOWS) */
+  [0xa3] = 0xec,       /* 163 => 236 via 155 (KEY_MAIL) */
+  [0xa4] = 0xe6,       /* 164 => 230 via 156 (KEY_BOOKMARKS) */
+  [0xa5] = 0xeb,       /* 165 => 235 via 157 (KEY_COMPUTER) */
+  [0xa6] = 0xea,       /* 166 => 234 via 158 (KEY_BACK) */
+  [0xa7] = 0xe9,       /* 167 => 233 via 159 (KEY_FORWARD) */
+  [0xa8] = 0xa3,       /* 168 => 163 via 160 (KEY_CLOSECD) */
+  [0xa9] = 0x6c,       /* 169 => 108 via 161 (KEY_EJECTCD) */
+  [0xaa] = 0xfd,       /* 170 => 253 via 162 (KEY_EJECTCLOSECD) */
+  [0xab] = 0x99,       /* 171 => 153 via 163 (KEY_NEXTSONG) */
+  [0xac] = 0xa2,       /* 172 => 162 via 164 (KEY_PLAYPAUSE) */
+  [0xad] = 0x90,       /* 173 => 144 via 165 (KEY_PREVIOUSSONG) */
+  [0xae] = 0xa4,       /* 174 => 164 via 166 (KEY_STOPCD) */
+  [0xaf] = 0xb1,       /* 175 => 177 via 167 (KEY_RECORD) */
+  [0xb0] = 0x98,       /* 176 => 152 via 168 (KEY_REWIND) */
+  [0xb1] = 0x63,       /* 177 => 99 via 169 (KEY_PHONE) */
+  [0xb2] = 0x70,       /* 178 => 112 via 170 (KEY_ISO) */
+  [0xb3] = 0x81,       /* 179 => 129 via 171 (KEY_CONFIG) */
+  [0xb4] = 0xb2,       /* 180 => 178 via 172 (KEY_HOMEPAGE) */
+  [0xb5] = 0xe7,       /* 181 => 231 via 173 (KEY_REFRESH) */
+  [0xb6] = 0x71,       /* 182 => 113 via 174 (KEY_EXIT) */
+  [0xb7] = 0x72,       /* 183 => 114 via 175 (KEY_MOVE) */
+  [0xb8] = 0x88,       /* 184 => 136 via 176 (KEY_EDIT) */
+  [0xb9] = 0x75,       /* 185 => 117 via 177 (KEY_SCROLLUP) */
+  [0xba] = 0x8f,       /* 186 => 143 via 178 (KEY_SCROLLDOWN) */
+  [0xbb] = 0xf6,       /* 187 => 246 via 179 (KEY_KPLEFTPAREN) */
+  [0xbc] = 0xfb,       /* 188 => 251 via 180 (KEY_KPRIGHTPAREN) */
+  [0xbd] = 0x89,       /* 189 => 137 via 181 (KEY_NEW) */
+  [0xbe] = 0x8a,       /* 190 => 138 via 182 (KEY_REDO) */
+  [0xbf] = 0x5d,       /* 191 => 93 via 183 (KEY_F13) */
+  [0xc0] = 0x5e,       /* 192 => 94 via 184 (KEY_F14) */
+  [0xc1] = 0x5f,       /* 193 => 95 via 185 (KEY_F15) */
+  [0xc2] = 0x55,       /* 194 => 85 via 186 (KEY_F16) */
+  [0xc3] = 0x83,       /* 195 => 131 via 187 (KEY_F17) */
+  [0xc4] = 0xf7,       /* 196 => 247 via 188 (KEY_F18) */
+  [0xc5] = 0x84,       /* 197 => 132 via 189 (KEY_F19) */
+  [0xc6] = 0x5a,       /* 198 => 90 via 190 (KEY_F20) */
+  [0xc7] = 0x74,       /* 199 => 116 via 191 (KEY_F21) */
+  [0xc8] = 0xf9,       /* 200 => 249 via 192 (KEY_F22) */
+  [0xc9] = 0x6d,       /* 201 => 109 via 193 (KEY_F23) */
+  [0xca] = 0x6f,       /* 202 => 111 via 194 (KEY_F24) */
+  [0xcb] = 0x95,       /* 203 => 149 via 195 */
+  [0xcc] = 0x96,       /* 204 => 150 via 196 */
+  [0xcd] = 0x9a,       /* 205 => 154 via 197 */
+  [0xce] = 0x9b,       /* 206 => 155 via 198 */
+  [0xcf] = 0xa7,       /* 207 => 167 via 199 */
+  [0xd0] = 0xa8,       /* 208 => 168 via 200 (KEY_PLAYCD) */
+  [0xd1] = 0xa9,       /* 209 => 169 via 201 (KEY_PAUSECD) */
+  [0xd2] = 0xab,       /* 210 => 171 via 202 (KEY_PROG3) */
+  [0xd3] = 0xac,       /* 211 => 172 via 203 (KEY_PROG4) */
+  [0xd4] = 0xad,       /* 212 => 173 via 204 (KEY_DASHBOARD) */
+  [0xd5] = 0xa5,       /* 213 => 165 via 205 (KEY_SUSPEND) */
+  [0xd6] = 0xaf,       /* 214 => 175 via 206 (KEY_CLOSE) */
+  [0xd7] = 0xb3,       /* 215 => 179 via 207 (KEY_PLAY) */
+  [0xd8] = 0xb4,       /* 216 => 180 via 208 (KEY_FASTFORWARD) */
+  [0xd9] = 0xb6,       /* 217 => 182 via 209 (KEY_BASSBOOST) */
+  [0xda] = 0xb9,       /* 218 => 185 via 210 (KEY_PRINT) */
+  [0xdb] = 0xba,       /* 219 => 186 via 211 (KEY_HP) */
+  [0xdc] = 0xbb,       /* 220 => 187 via 212 (KEY_CAMERA) */
+  [0xdd] = 0xbd,       /* 221 => 189 via 213 (KEY_SOUND) */
+  [0xde] = 0xbe,       /* 222 => 190 via 214 (KEY_QUESTION) */
+  [0xdf] = 0xbf,       /* 223 => 191 via 215 (KEY_EMAIL) */
+  [0xe0] = 0xc0,       /* 224 => 192 via 216 (KEY_CHAT) */
+  [0xe1] = 0xe5,       /* 225 => 229 via 217 (KEY_SEARCH) */
+  [0xe2] = 0xc2,       /* 226 => 194 via 218 (KEY_CONNECT) */
+  [0xe3] = 0xc3,       /* 227 => 195 via 219 (KEY_FINANCE) */
+  [0xe4] = 0xc4,       /* 228 => 196 via 220 (KEY_SPORT) */
+  [0xe5] = 0xc5,       /* 229 => 197 via 221 (KEY_SHOP) */
+  [0xe6] = 0x94,       /* 230 => 148 via 222 (KEY_ALTERASE) */
+  [0xe7] = 0xca,       /* 231 => 202 via 223 (KEY_CANCEL) */
+  [0xe8] = 0xcc,       /* 232 => 204 via 224 (KEY_BRIGHTNESSDOWN) */
+  [0xe9] = 0xd4,       /* 233 => 212 via 225 (KEY_BRIGHTNESSUP) */
+  [0xea] = 0xed,       /* 234 => 237 via 226 (KEY_MEDIA) */
+  [0xeb] = 0xd6,       /* 235 => 214 via 227 (KEY_SWITCHVIDEOMODE) */
+  [0xec] = 0xd7,       /* 236 => 215 via 228 (KEY_KBDILLUMTOGGLE) */
+  [0xed] = 0xd8,       /* 237 => 216 via 229 (KEY_KBDILLUMDOWN) */
+  [0xee] = 0xd9,       /* 238 => 217 via 230 (KEY_KBDILLUMUP) */
+  [0xef] = 0xda,       /* 239 => 218 via 231 (KEY_SEND) */
+  [0xf0] = 0xe4,       /* 240 => 228 via 232 (KEY_REPLY) */
+  [0xf1] = 0x8e,       /* 241 => 142 via 233 (KEY_FORWARDMAIL) */
+  [0xf2] = 0xd5,       /* 242 => 213 via 234 (KEY_SAVE) */
+  [0xf3] = 0xf0,       /* 243 => 240 via 235 (KEY_DOCUMENTS) */
+  [0xf4] = 0xf1,       /* 244 => 241 via 236 (KEY_BATTERY) */
+  [0xf5] = 0xf2,       /* 245 => 242 via 237 (KEY_BLUETOOTH) */
+  [0xf6] = 0xf3,       /* 246 => 243 via 238 (KEY_WLAN) */
+  [0xf7] = 0xf4,       /* 247 => 244 via 239 (KEY_UWB) */
+};
diff --git a/ui/sdl_keymap_xorgkbd2rfb.c b/ui/sdl_keymap_xorgkbd2rfb.c
new file mode 100644
index 0000000..4a741ae
--- /dev/null
+++ b/ui/sdl_keymap_xorgkbd2rfb.c
@@ -0,0 +1,112 @@
+static const guint16 keymap_xorgkbd2rfb[] = {
+  [0x9] = 0x1,         /* 9 => 1 via 1 (KEY_ESC) */
+  [0xa] = 0x2,         /* 10 => 2 via 2 (KEY_1) */
+  [0xb] = 0x3,         /* 11 => 3 via 3 (KEY_2) */
+  [0xc] = 0x4,         /* 12 => 4 via 4 (KEY_3) */
+  [0xd] = 0x5,         /* 13 => 5 via 5 (KEY_4) */
+  [0xe] = 0x6,         /* 14 => 6 via 6 (KEY_5) */
+  [0xf] = 0x7,         /* 15 => 7 via 7 (KEY_6) */
+  [0x10] = 0x8,        /* 16 => 8 via 8 (KEY_7) */
+  [0x11] = 0x9,        /* 17 => 9 via 9 (KEY_8) */
+  [0x12] = 0xa,        /* 18 => 10 via 10 (KEY_9) */
+  [0x13] = 0xb,        /* 19 => 11 via 11 (KEY_0) */
+  [0x14] = 0xc,        /* 20 => 12 via 12 (KEY_MINUS) */
+  [0x15] = 0xd,        /* 21 => 13 via 13 (KEY_EQUAL) */
+  [0x16] = 0xe,        /* 22 => 14 via 14 (KEY_BACKSPACE) */
+  [0x17] = 0xf,        /* 23 => 15 via 15 (KEY_TAB) */
+  [0x18] = 0x10,       /* 24 => 16 via 16 (KEY_Q) */
+  [0x19] = 0x11,       /* 25 => 17 via 17 (KEY_W) */
+  [0x1a] = 0x12,       /* 26 => 18 via 18 (KEY_E) */
+  [0x1b] = 0x13,       /* 27 => 19 via 19 (KEY_R) */
+  [0x1c] = 0x14,       /* 28 => 20 via 20 (KEY_T) */
+  [0x1d] = 0x15,       /* 29 => 21 via 21 (KEY_Y) */
+  [0x1e] = 0x16,       /* 30 => 22 via 22 (KEY_U) */
+  [0x1f] = 0x17,       /* 31 => 23 via 23 (KEY_I) */
+  [0x20] = 0x18,       /* 32 => 24 via 24 (KEY_O) */
+  [0x21] = 0x19,       /* 33 => 25 via 25 (KEY_P) */
+  [0x22] = 0x1a,       /* 34 => 26 via 26 (KEY_LEFTBRACE) */
+  [0x23] = 0x1b,       /* 35 => 27 via 27 (KEY_RIGHTBRACE) */
+  [0x24] = 0x1c,       /* 36 => 28 via 28 (KEY_ENTER) */
+  [0x25] = 0x1d,       /* 37 => 29 via 29 (KEY_LEFTCTRL) */
+  [0x26] = 0x1e,       /* 38 => 30 via 30 (KEY_A) */
+  [0x27] = 0x1f,       /* 39 => 31 via 31 (KEY_S) */
+  [0x28] = 0x20,       /* 40 => 32 via 32 (KEY_D) */
+  [0x29] = 0x21,       /* 41 => 33 via 33 (KEY_F) */
+  [0x2a] = 0x22,       /* 42 => 34 via 34 (KEY_G) */
+  [0x2b] = 0x23,       /* 43 => 35 via 35 (KEY_H) */
+  [0x2c] = 0x24,       /* 44 => 36 via 36 (KEY_J) */
+  [0x2d] = 0x25,       /* 45 => 37 via 37 (KEY_K) */
+  [0x2e] = 0x26,       /* 46 => 38 via 38 (KEY_L) */
+  [0x2f] = 0x27,       /* 47 => 39 via 39 (KEY_SEMICOLON) */
+  [0x30] = 0x28,       /* 48 => 40 via 40 (KEY_APOSTROPHE) */
+  [0x31] = 0x29,       /* 49 => 41 via 41 (KEY_GRAVE) */
+  [0x32] = 0x2a,       /* 50 => 42 via 42 (KEY_LEFTSHIFT) */
+  [0x33] = 0x2b,       /* 51 => 43 via 43 (KEY_BACKSLASH) */
+  [0x34] = 0x2c,       /* 52 => 44 via 44 (KEY_Z) */
+  [0x35] = 0x2d,       /* 53 => 45 via 45 (KEY_X) */
+  [0x36] = 0x2e,       /* 54 => 46 via 46 (KEY_C) */
+  [0x37] = 0x2f,       /* 55 => 47 via 47 (KEY_V) */
+  [0x38] = 0x30,       /* 56 => 48 via 48 (KEY_B) */
+  [0x39] = 0x31,       /* 57 => 49 via 49 (KEY_N) */
+  [0x3a] = 0x32,       /* 58 => 50 via 50 (KEY_M) */
+  [0x3b] = 0x33,       /* 59 => 51 via 51 (KEY_COMMA) */
+  [0x3c] = 0x34,       /* 60 => 52 via 52 (KEY_DOT) */
+  [0x3d] = 0x35,       /* 61 => 53 via 53 (KEY_SLASH) */
+  [0x3e] = 0x36,       /* 62 => 54 via 54 (KEY_RIGHTSHIFT) */
+  [0x3f] = 0x37,       /* 63 => 55 via 55 (KEY_KPASTERISK) */
+  [0x40] = 0x38,       /* 64 => 56 via 56 (KEY_LEFTALT) */
+  [0x41] = 0x39,       /* 65 => 57 via 57 (KEY_SPACE) */
+  [0x42] = 0x3a,       /* 66 => 58 via 58 (KEY_CAPSLOCK) */
+  [0x43] = 0x3b,       /* 67 => 59 via 59 (KEY_F1) */
+  [0x44] = 0x3c,       /* 68 => 60 via 60 (KEY_F2) */
+  [0x45] = 0x3d,       /* 69 => 61 via 61 (KEY_F3) */
+  [0x46] = 0x3e,       /* 70 => 62 via 62 (KEY_F4) */
+  [0x47] = 0x3f,       /* 71 => 63 via 63 (KEY_F5) */
+  [0x48] = 0x40,       /* 72 => 64 via 64 (KEY_F6) */
+  [0x49] = 0x41,       /* 73 => 65 via 65 (KEY_F7) */
+  [0x4a] = 0x42,       /* 74 => 66 via 66 (KEY_F8) */
+  [0x4b] = 0x43,       /* 75 => 67 via 67 (KEY_F9) */
+  [0x4c] = 0x44,       /* 76 => 68 via 68 (KEY_F10) */
+  [0x4d] = 0x45,       /* 77 => 69 via 69 (KEY_NUMLOCK) */
+  [0x4e] = 0x46,       /* 78 => 70 via 70 (KEY_SCROLLLOCK) */
+  [0x4f] = 0x47,       /* 79 => 71 via 71 (KEY_KP7) */
+  [0x50] = 0x48,       /* 80 => 72 via 72 (KEY_KP8) */
+  [0x51] = 0x49,       /* 81 => 73 via 73 (KEY_KP9) */
+  [0x52] = 0x4a,       /* 82 => 74 via 74 (KEY_KPMINUS) */
+  [0x53] = 0x4b,       /* 83 => 75 via 75 (KEY_KP4) */
+  [0x54] = 0x4c,       /* 84 => 76 via 76 (KEY_KP5) */
+  [0x55] = 0x4d,       /* 85 => 77 via 77 (KEY_KP6) */
+  [0x56] = 0x4e,       /* 86 => 78 via 78 (KEY_KPPLUS) */
+  [0x57] = 0x4f,       /* 87 => 79 via 79 (KEY_KP1) */
+  [0x58] = 0x50,       /* 88 => 80 via 80 (KEY_KP2) */
+  [0x59] = 0x51,       /* 89 => 81 via 81 (KEY_KP3) */
+  [0x5a] = 0x52,       /* 90 => 82 via 82 (KEY_KP0) */
+  [0x5b] = 0x53,       /* 91 => 83 via 83 (KEY_KPDOT) */
+  [0x61] = 0xc7,       /* 97 => 199 via 102 (KEY_HOME) */
+  [0x62] = 0xc8,       /* 98 => 200 via 103 (KEY_UP) */
+  [0x63] = 0xc9,       /* 99 => 201 via 104 (KEY_PAGEUP) */
+  [0x64] = 0xcb,       /* 100 => 203 via 105 (KEY_LEFT) */
+  [0x66] = 0xcd,       /* 102 => 205 via 106 (KEY_RIGHT) */
+  [0x67] = 0xcf,       /* 103 => 207 via 107 (KEY_END) */
+  [0x68] = 0xd0,       /* 104 => 208 via 108 (KEY_DOWN) */
+  [0x69] = 0xd1,       /* 105 => 209 via 109 (KEY_PAGEDOWN) */
+  [0x6a] = 0xd2,       /* 106 => 210 via 110 (KEY_INSERT) */
+  [0x6b] = 0xd3,       /* 107 => 211 via 111 (KEY_DELETE) */
+  [0x6c] = 0x9c,       /* 108 => 156 via 96 (KEY_KPENTER) */
+  [0x6d] = 0x9d,       /* 109 => 157 via 97 (KEY_RIGHTCTRL) */
+  [0x6e] = 0xc6,       /* 110 => 198 via 119 (KEY_PAUSE) */
+  [0x6f] = 0x54,       /* 111 => 84 via 99 (KEY_SYSRQ) */
+  [0x70] = 0xb5,       /* 112 => 181 via 98 (KEY_KPSLASH) */
+  [0x71] = 0xb8,       /* 113 => 184 via 100 (KEY_RIGHTALT) */
+  [0x73] = 0xdb,       /* 115 => 219 via 125 (KEY_LEFTMETA) */
+  [0x74] = 0xdc,       /* 116 => 220 via 126 (KEY_RIGHTMETA) */
+  [0x75] = 0xdd,       /* 117 => 221 via 127 (KEY_COMPOSE) */
+  [0x76] = 0x5d,       /* 118 => 93 via 183 (KEY_F13) */
+  [0x77] = 0x5e,       /* 119 => 94 via 184 (KEY_F14) */
+  [0x78] = 0x5f,       /* 120 => 95 via 185 (KEY_F15) */
+  [0x79] = 0x55,       /* 121 => 85 via 186 (KEY_F16) */
+  [0x7a] = 0x83,       /* 122 => 131 via 187 (KEY_F17) */
+  [0x7e] = 0x59,       /* 126 => 89 via 117 (KEY_KPEQUAL) */
+  [0x85] = 0x7d,       /* 133 => 125 via 124 (KEY_YEN) */
+  [0xd0] = 0x70,       /* 208 => 112 via 93 (KEY_KATAKANAHIRAGANA) */
+};
diff --git a/ui/sdl_keymap_xorgxquartz2rfb.c b/ui/sdl_keymap_xorgxquartz2rfb.c
new file mode 100644
index 0000000..992ff6b
--- /dev/null
+++ b/ui/sdl_keymap_xorgxquartz2rfb.c
@@ -0,0 +1,117 @@
+static const guint16 keymap_xorgxquartz2rfb[] = {
+  [0x8] = 0x1e,        /* 8 => 30 via 30 (KEY_A) */
+  [0x9] = 0x1f,        /* 9 => 31 via 31 (KEY_S) */
+  [0xa] = 0x20,        /* 10 => 32 via 32 (KEY_D) */
+  [0xb] = 0x21,        /* 11 => 33 via 33 (KEY_F) */
+  [0xc] = 0x23,        /* 12 => 35 via 35 (KEY_H) */
+  [0xd] = 0x22,        /* 13 => 34 via 34 (KEY_G) */
+  [0xe] = 0x2c,        /* 14 => 44 via 44 (KEY_Z) */
+  [0xf] = 0x2d,        /* 15 => 45 via 45 (KEY_X) */
+  [0x10] = 0x2e,       /* 16 => 46 via 46 (KEY_C) */
+  [0x11] = 0x2f,       /* 17 => 47 via 47 (KEY_V) */
+  [0x12] = 0x70,       /* 18 => 112 via 170 (KEY_ISO) */
+  [0x13] = 0x30,       /* 19 => 48 via 48 (KEY_B) */
+  [0x14] = 0x10,       /* 20 => 16 via 16 (KEY_Q) */
+  [0x15] = 0x11,       /* 21 => 17 via 17 (KEY_W) */
+  [0x16] = 0x12,       /* 22 => 18 via 18 (KEY_E) */
+  [0x17] = 0x13,       /* 23 => 19 via 19 (KEY_R) */
+  [0x18] = 0x15,       /* 24 => 21 via 21 (KEY_Y) */
+  [0x19] = 0x14,       /* 25 => 20 via 20 (KEY_T) */
+  [0x1a] = 0x2,        /* 26 => 2 via 2 (KEY_1) */
+  [0x1b] = 0x3,        /* 27 => 3 via 3 (KEY_2) */
+  [0x1c] = 0x4,        /* 28 => 4 via 4 (KEY_3) */
+  [0x1d] = 0x5,        /* 29 => 5 via 5 (KEY_4) */
+  [0x1e] = 0x7,        /* 30 => 7 via 7 (KEY_6) */
+  [0x1f] = 0x6,        /* 31 => 6 via 6 (KEY_5) */
+  [0x20] = 0xd,        /* 32 => 13 via 13 (KEY_EQUAL) */
+  [0x21] = 0xa,        /* 33 => 10 via 10 (KEY_9) */
+  [0x22] = 0x8,        /* 34 => 8 via 8 (KEY_7) */
+  [0x23] = 0xc,        /* 35 => 12 via 12 (KEY_MINUS) */
+  [0x24] = 0x9,        /* 36 => 9 via 9 (KEY_8) */
+  [0x25] = 0xb,        /* 37 => 11 via 11 (KEY_0) */
+  [0x26] = 0x1b,       /* 38 => 27 via 27 (KEY_RIGHTBRACE) */
+  [0x27] = 0x18,       /* 39 => 24 via 24 (KEY_O) */
+  [0x28] = 0x16,       /* 40 => 22 via 22 (KEY_U) */
+  [0x29] = 0x1a,       /* 41 => 26 via 26 (KEY_LEFTBRACE) */
+  [0x2a] = 0x17,       /* 42 => 23 via 23 (KEY_I) */
+  [0x2b] = 0x19,       /* 43 => 25 via 25 (KEY_P) */
+  [0x2c] = 0x1c,       /* 44 => 28 via 28 (KEY_ENTER) */
+  [0x2d] = 0x26,       /* 45 => 38 via 38 (KEY_L) */
+  [0x2e] = 0x24,       /* 46 => 36 via 36 (KEY_J) */
+  [0x2f] = 0x28,       /* 47 => 40 via 40 (KEY_APOSTROPHE) */
+  [0x30] = 0x25,       /* 48 => 37 via 37 (KEY_K) */
+  [0x31] = 0x27,       /* 49 => 39 via 39 (KEY_SEMICOLON) */
+  [0x32] = 0x2b,       /* 50 => 43 via 43 (KEY_BACKSLASH) */
+  [0x33] = 0x33,       /* 51 => 51 via 51 (KEY_COMMA) */
+  [0x34] = 0x35,       /* 52 => 53 via 53 (KEY_SLASH) */
+  [0x35] = 0x31,       /* 53 => 49 via 49 (KEY_N) */
+  [0x36] = 0x32,       /* 54 => 50 via 50 (KEY_M) */
+  [0x37] = 0x34,       /* 55 => 52 via 52 (KEY_DOT) */
+  [0x38] = 0xf,        /* 56 => 15 via 15 (KEY_TAB) */
+  [0x39] = 0x39,       /* 57 => 57 via 57 (KEY_SPACE) */
+  [0x3a] = 0x29,       /* 58 => 41 via 41 (KEY_GRAVE) */
+  [0x3b] = 0xe,        /* 59 => 14 via 14 (KEY_BACKSPACE) */
+  [0x3d] = 0x1,        /* 61 => 1 via 1 (KEY_ESC) */
+  [0x3f] = 0xdb,       /* 63 => 219 via 125 (KEY_LEFTMETA) */
+  [0x40] = 0x2a,       /* 64 => 42 via 42 (KEY_LEFTSHIFT) */
+  [0x41] = 0x3a,       /* 65 => 58 via 58 (KEY_CAPSLOCK) */
+  [0x42] = 0x38,       /* 66 => 56 via 56 (KEY_LEFTALT) */
+  [0x43] = 0x1d,       /* 67 => 29 via 29 (KEY_LEFTCTRL) */
+  [0x44] = 0x36,       /* 68 => 54 via 54 (KEY_RIGHTSHIFT) */
+  [0x45] = 0xb8,       /* 69 => 184 via 100 (KEY_RIGHTALT) */
+  [0x46] = 0x9d,       /* 70 => 157 via 97 (KEY_RIGHTCTRL) */
+  [0x47] = 0xdd,       /* 71 => 221 via 127 (KEY_COMPOSE) */
+  [0x48] = 0x83,       /* 72 => 131 via 187 (KEY_F17) */
+  [0x49] = 0x53,       /* 73 => 83 via 83 (KEY_KPDOT) */
+  [0x4b] = 0x37,       /* 75 => 55 via 55 (KEY_KPASTERISK) */
+  [0x4d] = 0x4e,       /* 77 => 78 via 78 (KEY_KPPLUS) */
+  [0x4f] = 0x7e,       /* 79 => 126 via 121 (KEY_KPCOMMA) */
+  [0x50] = 0xb0,       /* 80 => 176 via 115 (KEY_VOLUMEUP) */
+  [0x51] = 0xae,       /* 81 => 174 via 114 (KEY_VOLUMEDOWN) */
+  [0x52] = 0xa0,       /* 82 => 160 via 113 (KEY_MUTE) */
+  [0x53] = 0xb5,       /* 83 => 181 via 98 (KEY_KPSLASH) */
+  [0x54] = 0x9c,       /* 84 => 156 via 96 (KEY_KPENTER) */
+  [0x56] = 0x4a,       /* 86 => 74 via 74 (KEY_KPMINUS) */
+  [0x57] = 0xf7,       /* 87 => 247 via 188 (KEY_F18) */
+  [0x58] = 0x84,       /* 88 => 132 via 189 (KEY_F19) */
+  [0x59] = 0x59,       /* 89 => 89 via 117 (KEY_KPEQUAL) */
+  [0x5a] = 0x52,       /* 90 => 82 via 82 (KEY_KP0) */
+  [0x5b] = 0x4f,       /* 91 => 79 via 79 (KEY_KP1) */
+  [0x5c] = 0x50,       /* 92 => 80 via 80 (KEY_KP2) */
+  [0x5d] = 0x51,       /* 93 => 81 via 81 (KEY_KP3) */
+  [0x5e] = 0x4b,       /* 94 => 75 via 75 (KEY_KP4) */
+  [0x5f] = 0x4c,       /* 95 => 76 via 76 (KEY_KP5) */
+  [0x60] = 0x4d,       /* 96 => 77 via 77 (KEY_KP6) */
+  [0x61] = 0x47,       /* 97 => 71 via 71 (KEY_KP7) */
+  [0x62] = 0x5a,       /* 98 => 90 via 190 (KEY_F20) */
+  [0x63] = 0x48,       /* 99 => 72 via 72 (KEY_KP8) */
+  [0x64] = 0x49,       /* 100 => 73 via 73 (KEY_KP9) */
+  [0x65] = 0x7d,       /* 101 => 125 via 124 (KEY_YEN) */
+  [0x67] = 0x5c,       /* 103 => 92 via 95 (KEY_KPJPCOMMA) */
+  [0x68] = 0x3f,       /* 104 => 63 via 63 (KEY_F5) */
+  [0x69] = 0x40,       /* 105 => 64 via 64 (KEY_F6) */
+  [0x6a] = 0x41,       /* 106 => 65 via 65 (KEY_F7) */
+  [0x6b] = 0x3d,       /* 107 => 61 via 61 (KEY_F3) */
+  [0x6c] = 0x42,       /* 108 => 66 via 66 (KEY_F8) */
+  [0x6d] = 0x43,       /* 109 => 67 via 67 (KEY_F9) */
+  [0x6f] = 0x57,       /* 111 => 87 via 87 (KEY_F11) */
+  [0x70] = 0x78,       /* 112 => 120 via 90 (KEY_KATAKANA) */
+  [0x71] = 0x5d,       /* 113 => 93 via 183 (KEY_F13) */
+  [0x72] = 0x55,       /* 114 => 85 via 186 (KEY_F16) */
+  [0x73] = 0x5e,       /* 115 => 94 via 184 (KEY_F14) */
+  [0x75] = 0x44,       /* 117 => 68 via 68 (KEY_F10) */
+  [0x77] = 0x58,       /* 119 => 88 via 88 (KEY_F12) */
+  [0x79] = 0x5f,       /* 121 => 95 via 185 (KEY_F15) */
+  [0x7b] = 0xc7,       /* 123 => 199 via 102 (KEY_HOME) */
+  [0x7c] = 0xc9,       /* 124 => 201 via 104 (KEY_PAGEUP) */
+  [0x7d] = 0xd3,       /* 125 => 211 via 111 (KEY_DELETE) */
+  [0x7e] = 0x3e,       /* 126 => 62 via 62 (KEY_F4) */
+  [0x7f] = 0xcf,       /* 127 => 207 via 107 (KEY_END) */
+  [0x80] = 0x3c,       /* 128 => 60 via 60 (KEY_F2) */
+  [0x81] = 0xd1,       /* 129 => 209 via 109 (KEY_PAGEDOWN) */
+  [0x82] = 0x3b,       /* 130 => 59 via 59 (KEY_F1) */
+  [0x83] = 0xcb,       /* 131 => 203 via 105 (KEY_LEFT) */
+  [0x84] = 0xcd,       /* 132 => 205 via 106 (KEY_RIGHT) */
+  [0x85] = 0xd0,       /* 133 => 208 via 108 (KEY_DOWN) */
+  [0x86] = 0xc8,       /* 134 => 200 via 103 (KEY_UP) */
+};
diff --git a/ui/sdl_keymap_xorgxwin2rfb.c b/ui/sdl_keymap_xorgxwin2rfb.c
new file mode 100644
index 0000000..f1c1762
--- /dev/null
+++ b/ui/sdl_keymap_xorgxwin2rfb.c
@@ -0,0 +1,112 @@
+static const guint16 keymap_xorgxwin2rfb[] = {
+  [0x9] = 0x1,         /* 9 => 1 via 1 (KEY_ESC) */
+  [0xa] = 0x2,         /* 10 => 2 via 2 (KEY_1) */
+  [0xb] = 0x3,         /* 11 => 3 via 3 (KEY_2) */
+  [0xc] = 0x4,         /* 12 => 4 via 4 (KEY_3) */
+  [0xd] = 0x5,         /* 13 => 5 via 5 (KEY_4) */
+  [0xe] = 0x6,         /* 14 => 6 via 6 (KEY_5) */
+  [0xf] = 0x7,         /* 15 => 7 via 7 (KEY_6) */
+  [0x10] = 0x8,        /* 16 => 8 via 8 (KEY_7) */
+  [0x11] = 0x9,        /* 17 => 9 via 9 (KEY_8) */
+  [0x12] = 0xa,        /* 18 => 10 via 10 (KEY_9) */
+  [0x13] = 0xb,        /* 19 => 11 via 11 (KEY_0) */
+  [0x14] = 0xc,        /* 20 => 12 via 12 (KEY_MINUS) */
+  [0x15] = 0xd,        /* 21 => 13 via 13 (KEY_EQUAL) */
+  [0x16] = 0xe,        /* 22 => 14 via 14 (KEY_BACKSPACE) */
+  [0x17] = 0xf,        /* 23 => 15 via 15 (KEY_TAB) */
+  [0x18] = 0x10,       /* 24 => 16 via 16 (KEY_Q) */
+  [0x19] = 0x11,       /* 25 => 17 via 17 (KEY_W) */
+  [0x1a] = 0x12,       /* 26 => 18 via 18 (KEY_E) */
+  [0x1b] = 0x13,       /* 27 => 19 via 19 (KEY_R) */
+  [0x1c] = 0x14,       /* 28 => 20 via 20 (KEY_T) */
+  [0x1d] = 0x15,       /* 29 => 21 via 21 (KEY_Y) */
+  [0x1e] = 0x16,       /* 30 => 22 via 22 (KEY_U) */
+  [0x1f] = 0x17,       /* 31 => 23 via 23 (KEY_I) */
+  [0x20] = 0x18,       /* 32 => 24 via 24 (KEY_O) */
+  [0x21] = 0x19,       /* 33 => 25 via 25 (KEY_P) */
+  [0x22] = 0x1a,       /* 34 => 26 via 26 (KEY_LEFTBRACE) */
+  [0x23] = 0x1b,       /* 35 => 27 via 27 (KEY_RIGHTBRACE) */
+  [0x24] = 0x1c,       /* 36 => 28 via 28 (KEY_ENTER) */
+  [0x25] = 0x1d,       /* 37 => 29 via 29 (KEY_LEFTCTRL) */
+  [0x26] = 0x1e,       /* 38 => 30 via 30 (KEY_A) */
+  [0x27] = 0x1f,       /* 39 => 31 via 31 (KEY_S) */
+  [0x28] = 0x20,       /* 40 => 32 via 32 (KEY_D) */
+  [0x29] = 0x21,       /* 41 => 33 via 33 (KEY_F) */
+  [0x2a] = 0x22,       /* 42 => 34 via 34 (KEY_G) */
+  [0x2b] = 0x23,       /* 43 => 35 via 35 (KEY_H) */
+  [0x2c] = 0x24,       /* 44 => 36 via 36 (KEY_J) */
+  [0x2d] = 0x25,       /* 45 => 37 via 37 (KEY_K) */
+  [0x2e] = 0x26,       /* 46 => 38 via 38 (KEY_L) */
+  [0x2f] = 0x27,       /* 47 => 39 via 39 (KEY_SEMICOLON) */
+  [0x30] = 0x28,       /* 48 => 40 via 40 (KEY_APOSTROPHE) */
+  [0x31] = 0x29,       /* 49 => 41 via 41 (KEY_GRAVE) */
+  [0x32] = 0x2a,       /* 50 => 42 via 42 (KEY_LEFTSHIFT) */
+  [0x33] = 0x2b,       /* 51 => 43 via 43 (KEY_BACKSLASH) */
+  [0x34] = 0x2c,       /* 52 => 44 via 44 (KEY_Z) */
+  [0x35] = 0x2d,       /* 53 => 45 via 45 (KEY_X) */
+  [0x36] = 0x2e,       /* 54 => 46 via 46 (KEY_C) */
+  [0x37] = 0x2f,       /* 55 => 47 via 47 (KEY_V) */
+  [0x38] = 0x30,       /* 56 => 48 via 48 (KEY_B) */
+  [0x39] = 0x31,       /* 57 => 49 via 49 (KEY_N) */
+  [0x3a] = 0x32,       /* 58 => 50 via 50 (KEY_M) */
+  [0x3b] = 0x33,       /* 59 => 51 via 51 (KEY_COMMA) */
+  [0x3c] = 0x34,       /* 60 => 52 via 52 (KEY_DOT) */
+  [0x3d] = 0x35,       /* 61 => 53 via 53 (KEY_SLASH) */
+  [0x3e] = 0x36,       /* 62 => 54 via 54 (KEY_RIGHTSHIFT) */
+  [0x3f] = 0x37,       /* 63 => 55 via 55 (KEY_KPASTERISK) */
+  [0x40] = 0x38,       /* 64 => 56 via 56 (KEY_LEFTALT) */
+  [0x41] = 0x39,       /* 65 => 57 via 57 (KEY_SPACE) */
+  [0x42] = 0x3a,       /* 66 => 58 via 58 (KEY_CAPSLOCK) */
+  [0x43] = 0x3b,       /* 67 => 59 via 59 (KEY_F1) */
+  [0x44] = 0x3c,       /* 68 => 60 via 60 (KEY_F2) */
+  [0x45] = 0x3d,       /* 69 => 61 via 61 (KEY_F3) */
+  [0x46] = 0x3e,       /* 70 => 62 via 62 (KEY_F4) */
+  [0x47] = 0x3f,       /* 71 => 63 via 63 (KEY_F5) */
+  [0x48] = 0x40,       /* 72 => 64 via 64 (KEY_F6) */
+  [0x49] = 0x41,       /* 73 => 65 via 65 (KEY_F7) */
+  [0x4a] = 0x42,       /* 74 => 66 via 66 (KEY_F8) */
+  [0x4b] = 0x43,       /* 75 => 67 via 67 (KEY_F9) */
+  [0x4c] = 0x44,       /* 76 => 68 via 68 (KEY_F10) */
+  [0x4d] = 0x45,       /* 77 => 69 via 69 (KEY_NUMLOCK) */
+  [0x4e] = 0x46,       /* 78 => 70 via 70 (KEY_SCROLLLOCK) */
+  [0x4f] = 0x47,       /* 79 => 71 via 71 (KEY_KP7) */
+  [0x50] = 0x48,       /* 80 => 72 via 72 (KEY_KP8) */
+  [0x51] = 0x49,       /* 81 => 73 via 73 (KEY_KP9) */
+  [0x52] = 0x4a,       /* 82 => 74 via 74 (KEY_KPMINUS) */
+  [0x53] = 0x4b,       /* 83 => 75 via 75 (KEY_KP4) */
+  [0x54] = 0x4c,       /* 84 => 76 via 76 (KEY_KP5) */
+  [0x55] = 0x4d,       /* 85 => 77 via 77 (KEY_KP6) */
+  [0x56] = 0x4e,       /* 86 => 78 via 78 (KEY_KPPLUS) */
+  [0x57] = 0x4f,       /* 87 => 79 via 79 (KEY_KP1) */
+  [0x58] = 0x50,       /* 88 => 80 via 80 (KEY_KP2) */
+  [0x59] = 0x51,       /* 89 => 81 via 81 (KEY_KP3) */
+  [0x5a] = 0x52,       /* 90 => 82 via 82 (KEY_KP0) */
+  [0x5b] = 0x53,       /* 91 => 83 via 83 (KEY_KPDOT) */
+  [0x61] = 0xc7,       /* 97 => 199 via 102 (KEY_HOME) */
+  [0x62] = 0xc8,       /* 98 => 200 via 103 (KEY_UP) */
+  [0x63] = 0xc9,       /* 99 => 201 via 104 (KEY_PAGEUP) */
+  [0x64] = 0xcb,       /* 100 => 203 via 105 (KEY_LEFT) */
+  [0x66] = 0xcd,       /* 102 => 205 via 106 (KEY_RIGHT) */
+  [0x67] = 0xcf,       /* 103 => 207 via 107 (KEY_END) */
+  [0x68] = 0xd0,       /* 104 => 208 via 108 (KEY_DOWN) */
+  [0x69] = 0xd1,       /* 105 => 209 via 109 (KEY_PAGEDOWN) */
+  [0x6a] = 0xd2,       /* 106 => 210 via 110 (KEY_INSERT) */
+  [0x6b] = 0xd3,       /* 107 => 211 via 111 (KEY_DELETE) */
+  [0x6c] = 0x9c,       /* 108 => 156 via 96 (KEY_KPENTER) */
+  [0x6d] = 0x9d,       /* 109 => 157 via 97 (KEY_RIGHTCTRL) */
+  [0x6e] = 0xc6,       /* 110 => 198 via 119 (KEY_PAUSE) */
+  [0x6f] = 0x54,       /* 111 => 84 via 99 (KEY_SYSRQ) */
+  [0x70] = 0xb5,       /* 112 => 181 via 98 (KEY_KPSLASH) */
+  [0x71] = 0xb8,       /* 113 => 184 via 100 (KEY_RIGHTALT) */
+  [0x73] = 0xdb,       /* 115 => 219 via 125 (KEY_LEFTMETA) */
+  [0x74] = 0xdc,       /* 116 => 220 via 126 (KEY_RIGHTMETA) */
+  [0x75] = 0xdd,       /* 117 => 221 via 127 (KEY_COMPOSE) */
+  [0x76] = 0x5d,       /* 118 => 93 via 183 (KEY_F13) */
+  [0x77] = 0x5e,       /* 119 => 94 via 184 (KEY_F14) */
+  [0x78] = 0x5f,       /* 120 => 95 via 185 (KEY_F15) */
+  [0x79] = 0x55,       /* 121 => 85 via 186 (KEY_F16) */
+  [0x7a] = 0x83,       /* 122 => 131 via 187 (KEY_F17) */
+  [0x7e] = 0x59,       /* 126 => 89 via 117 (KEY_KPEQUAL) */
+  [0x85] = 0x7d,       /* 133 => 125 via 124 (KEY_YEN) */
+  [0xd0] = 0x70,       /* 208 => 112 via 93 (KEY_KATAKANAHIRAGANA) */
+};
-- 
1.7.7.5

      parent reply	other threads:[~2012-01-17 19:35 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-01-17 19:35 [Qemu-devel] [PATCH 0/2] Fix SDL keymapping when run against non-Linux X11 server Daniel P. Berrange
2012-01-17 19:35 ` [Qemu-devel] [PATCH 1/2] Rewrite the way keycode conversions are performed Daniel P. Berrange
2012-01-17 19:59   ` Daniel P. Berrange
2012-01-18 16:53   ` Anthony Liguori
2012-01-18 17:07     ` Daniel P. Berrange
2012-01-18 17:47       ` Anthony Liguori
2012-01-18 18:31         ` Daniel P. Berrange
2012-01-18 18:38           ` Anthony Liguori
2012-01-17 19:35 ` Daniel P. Berrange [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1326828907-13822-3-git-send-email-berrange@redhat.com \
    --to=berrange@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.