From 15837ff4e1434a63b3756376d6b71a32e25d3703 Mon Sep 17 00:00:00 2001 From: Andrew Pamment Date: Sun, 14 Feb 2016 14:27:50 +1000 Subject: [PATCH] Added Keymap support --- src/video/quinn/SDL_quinnevents.c | 70 ++++++++++++++++++++++++------- 1 file changed, 55 insertions(+), 15 deletions(-) diff --git a/src/video/quinn/SDL_quinnevents.c b/src/video/quinn/SDL_quinnevents.c index b27b73d..039b17d 100644 --- a/src/video/quinn/SDL_quinnevents.c +++ b/src/video/quinn/SDL_quinnevents.c @@ -30,7 +30,7 @@ #include "quinn.h" -static const int sdl_unicode_shift[] = { +static const int SDLK_unicode_shift[] = { 0, 0, 0x21, 0x40, 0x23, 0x24, 0x25, 0x5e, 0x26, 0x2a, 0x28, 0x29, @@ -55,7 +55,7 @@ static const int sdl_unicode_shift[] = { 0, 0, 0, 0, 0 }; -static const int sdl_unicode[] = { +static const int SDLK_unicode[] = { 0, 0, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x30, @@ -80,7 +80,7 @@ static const int sdl_unicode[] = { 0, 0, 0, 0, 0 }; -static const int sdl_keyset[] = { +static const int SDLK_keyset[] = { 0, SDLK_ESCAPE, SDLK_1, SDLK_2, SDLK_3, SDLK_4, SDLK_5, SDLK_6, SDLK_7, SDLK_8, SDLK_9, SDLK_0, @@ -94,17 +94,43 @@ static const int sdl_keyset[] = { SDLK_QUOTE, SDLK_BACKQUOTE, SDLK_LSHIFT, SDLK_BACKSLASH, SDLK_z, SDLK_x, SDLK_c, SDLK_v, SDLK_b, SDLK_n, SDLK_m, SDLK_COMMA, - SDLK_PERIOD, SDLK_SLASH, SDLK_RSHIFT, 0, + SDLK_PERIOD, SDLK_SLASH, SDLK_RSHIFT, SDLK_KP_MULTIPLY, SDLK_LALT, SDLK_SPACE, SDLK_CAPSLOCK, SDLK_F1, SDLK_F2, SDLK_F3, SDLK_F4, SDLK_F5, SDLK_F6, SDLK_F7, SDLK_F8, SDLK_F9, - SDLK_F10, 0, 0, SDLK_HOME, - SDLK_UP, SDLK_PAGEUP, 0, SDLK_LEFT, - 0, SDLK_RIGHT, 0, SDLK_END, - SDLK_DOWN, SDLK_PAGEDOWN, SDLK_INSERT, SDLK_DELETE, + SDLK_F10, 0, 0, SDLK_KP7, + SDLK_KP8, SDLK_KP9, SDLK_KP_MINUS, SDLK_KP4, + SDLK_KP5, SDLK_KP6, SDLK_KP_PLUS, SDLK_KP1, + SDLK_KP2, SDLK_KP3, SDLK_KP0, SDLK_KP_PERIOD, 0, 0, 0, SDLK_F11, SDLK_F12 }; +static const int SDLK_keyset_e0[] = { + 0, 0, 0, 0, //3 + 0, 0, 0, 0, //7 + 0, 0, 0, 0, //0b + 0, 0, 0, 0, //0f + 0, 0, 0, 0, //13 + 0, 0, 0, 0, //17 + 0, 0, 0, 0, //1b + SDLK_KP_ENTER, SDLK_RCTRL, 0, 0, //1f + 0, 0, 0, 0, //23 + 0, 0, 0, 0, //27 + 0, 0, 0, 0, //2b + 0, 0, 0, 0, //2f + 0, 0, 0, 0, //33 + 0, SDLK_KP_DIVIDE, 0, 0, //37 + SDLK_RALT, 0, 0, 0, //3b + 0, 0, 0, 0, //3f + 0, 0, 0, 0, //43 + 0, 0, 0, SDLK_HOME, //47 + SDLK_UP, SDLK_PAGEUP, 0, SDLK_LEFT, //4b + 0, SDLK_RIGHT, 0, SDLK_END, //4f + SDLK_DOWN, SDLK_PAGEDOWN, SDLK_INSERT, SDLK_DELETE, //53 + 0, 0, 0, 0, //57 + 0 +}; + static SDLKey keymap[256]; static SDLMod modstate = KMOD_NONE; @@ -130,7 +156,7 @@ static int _mmstate = 0; static char _k_last_state[256]; - +static int _k_e0 = 0; void QUINN_recv_event(struct window_update_req *req) { memcpy(¤t_req, req, sizeof(struct window_update_req)); @@ -142,7 +168,7 @@ void QUINN_PumpEvents(_THIS) { int i; int l; if (this->hidden->doexit == 1) { - SDL_PrivateQuit(); + SDLK_PrivateQuit(); } if (current_req_current) { @@ -151,24 +177,38 @@ void QUINN_PumpEvents(_THIS) { // keyboard SDL_keysym keysym; + if (_k_e0 == 0 && current_req.event_msgs[l].code == 0xe0) { + _k_e0 = 1; + continue; + } + if (_k_last_state[current_req.event_msgs[l].code] != current_req.event_msgs[l].state) { keysym.scancode = current_req.event_msgs[l].code; if (_k_last_state[42] == 1 || _k_last_state[54] == 1) { - keysym.unicode = sdl_unicode_shift[current_req.event_msgs[l].code]; + keysym.unicode = SDLK_unicode_shift[current_req.event_msgs[l].code]; } else { - keysym.unicode = sdl_unicode[current_req.event_msgs[l].code]; + keysym.unicode = SDLK_unicode[current_req.event_msgs[l].code]; } keysym.mod = make_mod(_k_last_state); if (current_req.event_msgs[l].state == 1) { - keysym.sym = sdl_keyset[current_req.event_msgs[l].code]; + if (_k_e0) { + keysym.sym = SDLK_keyset_e0[current_req.event_msgs[l].code]; + } else { + keysym.sym = SDLK_keyset[current_req.event_msgs[l].code]; + } SDL_PrivateKeyboard(SDL_PRESSED, &keysym); } else { // key up - keysym.sym = sdl_keyset[current_req.event_msgs[l].code]; + if (_k_e0) { + keysym.sym = SDLK_keyset_e0[current_req.event_msgs[l].code]; + } else { + keysym.sym = SDLK_keyset[current_req.event_msgs[l].code]; + } SDL_PrivateKeyboard(SDL_RELEASED, &keysym); } } + _k_e0 = 0; _k_last_state[current_req.event_msgs[l].code] = current_req.event_msgs[l].state; } else if (current_req.event_msgs[l].type == 2) { // mouse @@ -218,4 +258,4 @@ void QUINN_InitOSKeymap(_THIS) memset(_k_last_state, 0, 256); } -/* end of SDL_nullevents.c ... */ +/* end of SDLK_nullevents.c ... */