From: Alessandro Guido Date: Mon, 26 Sep 2011 11:12:12 +0000 (+0200) Subject: kvm tools, ui: Add some missing key codes X-Git-Tag: next-20110927~2^2 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=2f68a89e6175ab0f466d107b52a8a1adccfdf662;p=karo-tx-linux.git kvm tools, ui: Add some missing key codes 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 Signed-off-by: Alessandro Guido Signed-off-by: Pekka Enberg --- diff --git a/tools/kvm/ui/sdl.c b/tools/kvm/ui/sdl.c index a9e7cc73fc52..d6000ae4bbc5 100644 --- a/tools/kvm/ui/sdl.c +++ b/tools/kvm/ui/sdl.c @@ -11,65 +11,186 @@ #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, /* */ - - [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, /* */ - - [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, /* */ - [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, /* */ - [65] = 0x29, /* */ +#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), /* */ + [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), /* */ + [23] = DEFINE_SC(0x0d), /* */ + [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), /* */ + [37] = DEFINE_SC(0x14), /* */ + [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), /* */ + [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), /* */ + [63] = DEFINE_SC(0x7c), /* keypad * */ + [64] = DEFINE_SC(0x11), /* */ + [65] = DEFINE_SC(0x29), /* */ + + [67] = DEFINE_SC(0x05), /* */ + [68] = DEFINE_SC(0x06), /* */ + [69] = DEFINE_SC(0x04), /* */ + [70] = DEFINE_SC(0x0c), /* */ + [71] = DEFINE_SC(0x03), /* */ + [72] = DEFINE_SC(0x0b), /* */ + [73] = DEFINE_SC(0x83), /* */ + [74] = DEFINE_SC(0x0a), /* */ + [75] = DEFINE_SC(0x01), /* */ + [76] = DEFINE_SC(0x09), /* */ + + [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), /* */ + [95] = DEFINE_SC(0x78), /* */ + [96] = DEFINE_SC(0x07), /* */ + + [104] = DEFINE_ESC(0x5a), /* keypad */ + [105] = DEFINE_ESC(0x14), /* */ + [106] = DEFINE_ESC(0x4a), /* keypad / */ + [108] = DEFINE_ESC(0x11), /* */ + [110] = DEFINE_ESC(0x6c), /* */ + [111] = DEFINE_ESC(0x75), /* */ + [112] = DEFINE_ESC(0x7d), /* */ + [113] = DEFINE_ESC(0x6b), /* */ + [114] = DEFINE_ESC(0x74), /* */ + [115] = DEFINE_ESC(0x69), /* */ + [116] = DEFINE_ESC(0x72), /* */ + [117] = DEFINE_ESC(0x7a), /* */ + [118] = DEFINE_ESC(0x70), /* */ + [119] = DEFINE_ESC(0x71), /* */ }; -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: