Added Keymap support

This commit is contained in:
Andrew Pamment 2016-02-14 14:27:50 +10:00
parent 896d6a14da
commit 15837ff4e1

View File

@ -30,7 +30,7 @@
#include "quinn.h" #include "quinn.h"
static const int sdl_unicode_shift[] = { static const int SDLK_unicode_shift[] = {
0, 0, 0x21, 0x40, 0, 0, 0x21, 0x40,
0x23, 0x24, 0x25, 0x5e, 0x23, 0x24, 0x25, 0x5e,
0x26, 0x2a, 0x28, 0x29, 0x26, 0x2a, 0x28, 0x29,
@ -55,7 +55,7 @@ static const int sdl_unicode_shift[] = {
0, 0, 0, 0, 0 0, 0, 0, 0, 0
}; };
static const int sdl_unicode[] = { static const int SDLK_unicode[] = {
0, 0, 0x31, 0x32, 0, 0, 0x31, 0x32,
0x33, 0x34, 0x35, 0x36, 0x33, 0x34, 0x35, 0x36,
0x37, 0x38, 0x39, 0x30, 0x37, 0x38, 0x39, 0x30,
@ -80,7 +80,7 @@ static const int sdl_unicode[] = {
0, 0, 0, 0, 0 0, 0, 0, 0, 0
}; };
static const int sdl_keyset[] = { static const int SDLK_keyset[] = {
0, SDLK_ESCAPE, SDLK_1, SDLK_2, 0, SDLK_ESCAPE, SDLK_1, SDLK_2,
SDLK_3, SDLK_4, SDLK_5, SDLK_6, SDLK_3, SDLK_4, SDLK_5, SDLK_6,
SDLK_7, SDLK_8, SDLK_9, SDLK_0, 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_QUOTE, SDLK_BACKQUOTE, SDLK_LSHIFT, SDLK_BACKSLASH,
SDLK_z, SDLK_x, SDLK_c, SDLK_v, SDLK_z, SDLK_x, SDLK_c, SDLK_v,
SDLK_b, SDLK_n, SDLK_m, SDLK_COMMA, 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_LALT, SDLK_SPACE, SDLK_CAPSLOCK, SDLK_F1,
SDLK_F2, SDLK_F3, SDLK_F4, SDLK_F5, SDLK_F2, SDLK_F3, SDLK_F4, SDLK_F5,
SDLK_F6, SDLK_F7, SDLK_F8, SDLK_F9, SDLK_F6, SDLK_F7, SDLK_F8, SDLK_F9,
SDLK_F10, 0, 0, SDLK_HOME, SDLK_F10, 0, 0, SDLK_KP7,
SDLK_UP, SDLK_PAGEUP, 0, SDLK_LEFT, SDLK_KP8, SDLK_KP9, SDLK_KP_MINUS, SDLK_KP4,
0, SDLK_RIGHT, 0, SDLK_END, SDLK_KP5, SDLK_KP6, SDLK_KP_PLUS, SDLK_KP1,
SDLK_DOWN, SDLK_PAGEDOWN, SDLK_INSERT, SDLK_DELETE, SDLK_KP2, SDLK_KP3, SDLK_KP0, SDLK_KP_PERIOD,
0, 0, 0, SDLK_F11, SDLK_F12 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 SDLKey keymap[256];
static SDLMod modstate = KMOD_NONE; static SDLMod modstate = KMOD_NONE;
@ -130,7 +156,7 @@ static int _mmstate = 0;
static char _k_last_state[256]; static char _k_last_state[256];
static int _k_e0 = 0;
void QUINN_recv_event(struct window_update_req *req) { void QUINN_recv_event(struct window_update_req *req) {
memcpy(&current_req, req, sizeof(struct window_update_req)); memcpy(&current_req, req, sizeof(struct window_update_req));
@ -142,7 +168,7 @@ void QUINN_PumpEvents(_THIS) {
int i; int i;
int l; int l;
if (this->hidden->doexit == 1) { if (this->hidden->doexit == 1) {
SDL_PrivateQuit(); SDLK_PrivateQuit();
} }
if (current_req_current) { if (current_req_current) {
@ -151,24 +177,38 @@ void QUINN_PumpEvents(_THIS) {
// keyboard // keyboard
SDL_keysym keysym; 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) { if (_k_last_state[current_req.event_msgs[l].code] != current_req.event_msgs[l].state) {
keysym.scancode = current_req.event_msgs[l].code; keysym.scancode = current_req.event_msgs[l].code;
if (_k_last_state[42] == 1 || _k_last_state[54] == 1) { 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 { } 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); keysym.mod = make_mod(_k_last_state);
if (current_req.event_msgs[l].state == 1) { 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); SDL_PrivateKeyboard(SDL_PRESSED, &keysym);
} else { } else {
// key up // 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); SDL_PrivateKeyboard(SDL_RELEASED, &keysym);
} }
} }
_k_e0 = 0;
_k_last_state[current_req.event_msgs[l].code] = current_req.event_msgs[l].state; _k_last_state[current_req.event_msgs[l].code] = current_req.event_msgs[l].state;
} else if (current_req.event_msgs[l].type == 2) { } else if (current_req.event_msgs[l].type == 2) {
// mouse // mouse
@ -218,4 +258,4 @@ void QUINN_InitOSKeymap(_THIS)
memset(_k_last_state, 0, 256); memset(_k_last_state, 0, 256);
} }
/* end of SDL_nullevents.c ... */ /* end of SDLK_nullevents.c ... */