]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
kvm tools, ui: Add some missing key codes
authorAlessandro Guido <ag@alessandroguido.name>
Mon, 26 Sep 2011 11:12:12 +0000 (13:12 +0200)
committerPekka Enberg <penberg@kernel.org>
Mon, 26 Sep 2011 20:37:09 +0000 (23:37 +0300)
Add some missing keys to the SDL ui. This needed a bit of rework of
keyboard event handling since some of the new codes are multi-byte,
so I had to introduce a struct that keeps that information alongside
the code itself. Peculiar cases like PAUSE or PRNT SCRN are special
cased, however they aren't wired yet since I couldn't test them (I think
input grabbing is required to make them work).

Acked-by: Sasha Levin <levinsasha928@gmail.com>
Signed-off-by: Alessandro Guido <ag@alessandroguido.name>
Signed-off-by: Pekka Enberg <penberg@kernel.org>
tools/kvm/ui/sdl.c

index a9e7cc73fc522a9ff59ff9091307f88d6a78ce5d..d6000ae4bbc56c2ffa4c5f200306df7296fa0fd1 100644 (file)
 
 #define FRAME_RATE             25
 
-static u8 keymap[255] = {
-       [10]            = 0x16,         /* 1 */
-       [11]            = 0x1e,         /* 2 */
-       [12]            = 0x26,         /* 3 */
-       [13]            = 0x25,         /* 4 */
-       [14]            = 0x27,         /* 5 */
-       [15]            = 0x36,         /* 6 */
-       [16]            = 0x3d,         /* 7 */
-       [17]            = 0x3e,         /* 8 */
-       [18]            = 0x46,         /* 9 */
-       [19]            = 0x45,         /* 9 */
-       [20]            = 0x4e,         /* - */
-       [21]            = 0x55,         /* + */
-       [22]            = 0x66,         /* <backspace> */
-
-       [24]            = 0x15,         /* q */
-       [25]            = 0x1d,         /* w */
-       [26]            = 0x24,         /* e */
-       [27]            = 0x2d,         /* r */
-       [28]            = 0x2c,         /* t */
-       [29]            = 0x35,         /* y */
-       [30]            = 0x3c,         /* u */
-       [31]            = 0x43,         /* i */
-       [32]            = 0x44,         /* o */
-       [33]            = 0x4d,         /* p */
-
-       [36]            = 0x5a,         /* <enter> */
-
-       [38]            = 0x1c,         /* a */
-       [39]            = 0x1b,         /* s */
-       [40]            = 0x23,         /* d */
-       [41]            = 0x2b,         /* f */
-       [42]            = 0x34,         /* g */
-       [43]            = 0x33,         /* h */
-       [44]            = 0x3b,         /* j */
-       [45]            = 0x42,         /* k */
-       [46]            = 0x4b,         /* l */
-
-       [50]            = 0x12,         /* <left shift> */
-       [51]            = 0x5d,         /* | */
-
-
-       [52]            = 0x1a,         /* z */
-       [53]            = 0x22,         /* x */
-       [54]            = 0x21,         /* c */
-       [55]            = 0x2a,         /* v */
-       [56]            = 0x32,         /* b */
-       [57]            = 0x31,         /* n */
-       [58]            = 0x3a,         /* m */
-       [59]            = 0x41,         /* < */
-       [60]            = 0x49,         /* > */
-       [61]            = 0x4a,         /* / */
-       [62]            = 0x59,         /* <right shift> */
-       [65]            = 0x29,         /* <space> */
+#define SCANCODE_UNKNOWN      0
+#define SCANCODE_NORMAL       1
+#define SCANCODE_ESCAPED      2
+#define SCANCODE_KEY_PAUSE    3
+#define SCANCODE_KEY_PRNTSCRN 4
+
+struct set2_scancode {
+       u8 code;
+       u8 type;
+};
+
+#define DEFINE_SC(_code) {\
+       .code = _code,\
+       .type = SCANCODE_NORMAL,\
+}
+
+/* escaped scancodes */
+#define DEFINE_ESC(_code) {\
+       .code = _code,\
+       .type = SCANCODE_ESCAPED,\
+}
+
+static const struct set2_scancode const keymap[255] = {
+       [9]     = DEFINE_SC(0x76),      /* <esc> */
+       [10]    = DEFINE_SC(0x16),      /* 1 */
+       [11]    = DEFINE_SC(0x1e),      /* 2 */
+       [12]    = DEFINE_SC(0x26),      /* 3 */
+       [13]    = DEFINE_SC(0x25),      /* 4 */
+       [14]    = DEFINE_SC(0x27),      /* 5 */
+       [15]    = DEFINE_SC(0x36),      /* 6 */
+       [16]    = DEFINE_SC(0x3d),      /* 7 */
+       [17]    = DEFINE_SC(0x3e),      /* 8 */
+       [18]    = DEFINE_SC(0x46),      /* 9 */
+       [19]    = DEFINE_SC(0x45),      /* 9 */
+       [20]    = DEFINE_SC(0x4e),      /* - */
+       [21]    = DEFINE_SC(0x55),      /* + */
+       [22]    = DEFINE_SC(0x66),      /* <backspace> */
+       [23]    = DEFINE_SC(0x0d),      /* <tab> */
+       [24]    = DEFINE_SC(0x15),      /* q */
+       [25]    = DEFINE_SC(0x1d),      /* w */
+       [26]    = DEFINE_SC(0x24),      /* e */
+       [27]    = DEFINE_SC(0x2d),      /* r */
+       [28]    = DEFINE_SC(0x2c),      /* t */
+       [29]    = DEFINE_SC(0x35),      /* y */
+       [30]    = DEFINE_SC(0x3c),      /* u */
+       [31]    = DEFINE_SC(0x43),      /* i */
+       [32]    = DEFINE_SC(0x44),      /* o */
+       [33]    = DEFINE_SC(0x4d),      /* p */
+       [34]    = DEFINE_SC(0x54),      /* [ */
+       [35]    = DEFINE_SC(0x5b),      /* ] */
+       [36]    = DEFINE_SC(0x5a),      /* <enter> */
+       [37]    = DEFINE_SC(0x14),      /* <left ctrl> */
+       [38]    = DEFINE_SC(0x1c),      /* a */
+       [39]    = DEFINE_SC(0x1b),      /* s */
+       [40]    = DEFINE_SC(0x23),      /* d */
+       [41]    = DEFINE_SC(0x2b),      /* f */
+       [42]    = DEFINE_SC(0x34),      /* g */
+       [43]    = DEFINE_SC(0x33),      /* h */
+       [44]    = DEFINE_SC(0x3b),      /* j */
+       [45]    = DEFINE_SC(0x42),      /* k */
+       [46]    = DEFINE_SC(0x4b),      /* l */
+       [47]    = DEFINE_SC(0x4c),      /* ; */
+       [48]    = DEFINE_SC(0x52),      /* ' */
+       [49]    = DEFINE_SC(0x0e),      /* ` */
+       [50]    = DEFINE_SC(0x12),      /* <left shift> */
+       [51]    = DEFINE_SC(0x5d),      /* \ */
+       [52]    = DEFINE_SC(0x1a),      /* z */
+       [53]    = DEFINE_SC(0x22),      /* x */
+       [54]    = DEFINE_SC(0x21),      /* c */
+       [55]    = DEFINE_SC(0x2a),      /* v */
+       [56]    = DEFINE_SC(0x32),      /* b */
+       [57]    = DEFINE_SC(0x31),      /* n */
+       [58]    = DEFINE_SC(0x3a),      /* m */
+       [59]    = DEFINE_SC(0x41),      /* < */
+       [60]    = DEFINE_SC(0x49),      /* > */
+       [61]    = DEFINE_SC(0x4a),      /* / */
+       [62]    = DEFINE_SC(0x59),      /* <right shift> */
+       [63]    = DEFINE_SC(0x7c),      /* keypad * */
+       [64]    = DEFINE_SC(0x11),      /* <left alt> */
+       [65]    = DEFINE_SC(0x29),      /* <space> */
+
+       [67]    = DEFINE_SC(0x05),      /* <F1> */
+       [68]    = DEFINE_SC(0x06),      /* <F2> */
+       [69]    = DEFINE_SC(0x04),      /* <F3> */
+       [70]    = DEFINE_SC(0x0c),      /* <F4> */
+       [71]    = DEFINE_SC(0x03),      /* <F5> */
+       [72]    = DEFINE_SC(0x0b),      /* <F6> */
+       [73]    = DEFINE_SC(0x83),      /* <F7> */
+       [74]    = DEFINE_SC(0x0a),      /* <F8> */
+       [75]    = DEFINE_SC(0x01),      /* <F9> */
+       [76]    = DEFINE_SC(0x09),      /* <F10> */
+
+       [79]    = DEFINE_SC(0x6c),      /* keypad 7 */
+       [80]    = DEFINE_SC(0x75),      /* keypad 8 */
+       [81]    = DEFINE_SC(0x7d),      /* keypad 9 */
+       [82]    = DEFINE_SC(0x7b),      /* keypad - */
+       [83]    = DEFINE_SC(0x6b),      /* keypad 4 */
+       [84]    = DEFINE_SC(0x73),      /* keypad 5 */
+       [85]    = DEFINE_SC(0x74),      /* keypad 6 */
+       [86]    = DEFINE_SC(0x79),      /* keypad + */
+       [87]    = DEFINE_SC(0x69),      /* keypad 1 */
+       [88]    = DEFINE_SC(0x72),      /* keypad 2 */
+       [89]    = DEFINE_SC(0x7a),      /* keypad 3 */
+       [90]    = DEFINE_SC(0x70),      /* keypad 0 */
+       [91]    = DEFINE_SC(0x71),      /* keypad . */
+
+       [94]    = DEFINE_SC(0x61),      /* <INT 1> */
+       [95]    = DEFINE_SC(0x78),      /* <F11> */
+       [96]    = DEFINE_SC(0x07),      /* <F12> */
+
+       [104]   = DEFINE_ESC(0x5a),     /* keypad <enter> */
+       [105]   = DEFINE_ESC(0x14),     /* <right ctrl> */
+       [106]   = DEFINE_ESC(0x4a),     /* keypad / */
+       [108]   = DEFINE_ESC(0x11),     /* <right alt> */
+       [110]   = DEFINE_ESC(0x6c),     /* <home> */
+       [111]   = DEFINE_ESC(0x75),     /* <up> */
+       [112]   = DEFINE_ESC(0x7d),     /* <pag up> */
+       [113]   = DEFINE_ESC(0x6b),     /* <left> */
+       [114]   = DEFINE_ESC(0x74),     /* <right> */
+       [115]   = DEFINE_ESC(0x69),     /* <end> */
+       [116]   = DEFINE_ESC(0x72),     /* <down> */
+       [117]   = DEFINE_ESC(0x7a),     /* <pag down> */
+       [118]   = DEFINE_ESC(0x70),     /* <ins> */
+       [119]   = DEFINE_ESC(0x71),     /* <delete> */
 };
 
-static u8 to_code(u8 scancode)
+static const struct set2_scancode *to_code(u8 scancode)
 {
-       return keymap[scancode];
+       return &keymap[scancode];
+}
+
+static void key_press(const struct set2_scancode *sc)
+{
+       switch (sc->type) {
+       case SCANCODE_ESCAPED:
+               kbd_queue(0xe0);
+               /* fallthrough */
+       case SCANCODE_NORMAL:
+               kbd_queue(sc->code);
+               break;
+       case SCANCODE_KEY_PAUSE:
+               kbd_queue(0xe1);
+               kbd_queue(0x14);
+               kbd_queue(0x77);
+               kbd_queue(0xe1);
+               kbd_queue(0xf0);
+               kbd_queue(0x14);
+               kbd_queue(0x77);
+               break;
+       case SCANCODE_KEY_PRNTSCRN:
+               kbd_queue(0xe0);
+               kbd_queue(0x12);
+               kbd_queue(0xe0);
+               kbd_queue(0x7c);
+               break;
+       }
+}
+
+static void key_release(const struct set2_scancode *sc)
+{
+       switch (sc->type) {
+       case SCANCODE_ESCAPED:
+               kbd_queue(0xe0);
+               /* fallthrough */
+       case SCANCODE_NORMAL:
+               kbd_queue(0xf0);
+               kbd_queue(sc->code);
+               break;
+       case SCANCODE_KEY_PAUSE:
+               /* nothing to do */
+               break;
+       case SCANCODE_KEY_PRNTSCRN:
+               kbd_queue(0xe0);
+               kbd_queue(0xf0);
+               kbd_queue(0x7c);
+               kbd_queue(0xe0);
+               kbd_queue(0xf0);
+               kbd_queue(0x12);
+               break;
+       }
 }
 
 static void *sdl__thread(void *p)
@@ -110,19 +231,19 @@ static void *sdl__thread(void *p)
                while (SDL_PollEvent(&ev)) {
                        switch (ev.type) {
                        case SDL_KEYDOWN: {
-                               u8 code = to_code(ev.key.keysym.scancode);
-                               if (code)
-                                       kbd_queue(code);
-                               else
+                               const struct set2_scancode *sc = to_code(ev.key.keysym.scancode);
+                               if (sc->type == SCANCODE_UNKNOWN) {
                                        pr_warning("key '%d' not found in keymap", ev.key.keysym.scancode);
+                                       break;
+                               }
+                               key_press(sc);
                                break;
                        }
                        case SDL_KEYUP: {
-                               u8 code = to_code(ev.key.keysym.scancode);
-                               if (code) {
-                                       kbd_queue(0xf0);
-                                       kbd_queue(code);
-                               }
+                               const struct set2_scancode *sc = to_code(ev.key.keysym.scancode);
+                               if (sc->type == SCANCODE_UNKNOWN)
+                                       break;
+                               key_release(sc);
                                break;
                        }
                        case SDL_QUIT: