vxKernel/kernel/src/drivers/mpu/common/sdl2/keyboard.c

232 lines
6.0 KiB
C

#include <vhex/keyboard/interface.h>
#include <vhex/driver.h>
#include <vhex/keyboard.h>
#include <SDL2/SDL.h>
//---
// fake interrupt handler
//---
static struct {
int sdl2_id;
char const * const sdl2_name;
int vhex_id;
char const * const vhex_name;
} key_translation[] = {
/* F-keys */
{
.sdl2_id = SDLK_F1, .sdl2_name = "F1",
.vhex_id = VKEY_F1, .vhex_name = "F1"
},
{
.sdl2_id = SDLK_F2, .sdl2_name = "F2",
.vhex_id = VKEY_F2, .vhex_name = "F2"
},
{
.sdl2_id = SDLK_F3, .sdl2_name = "F3",
.vhex_id = VKEY_F3, .vhex_name = "F3"
},
{
.sdl2_id = SDLK_F4, .sdl2_name = "F4",
.vhex_id = VKEY_F4, .vhex_name = "F4"
},
{
.sdl2_id = SDLK_F5, .sdl2_name = "F5",
.vhex_id = VKEY_F5, .vhex_name = "F5"
},
{
.sdl2_id = SDLK_F6, .sdl2_name = "F6",
.vhex_id = VKEY_F6, .vhex_name = "F6"
},
/* Numeric keys */
{
.sdl2_id = SDLK_1, .sdl2_name = "1",
.vhex_id = VKEY_1, .vhex_name = "1"
},
{
.sdl2_id = SDLK_2, .sdl2_name = "2",
.vhex_id = VKEY_2, .vhex_name = "2"
},
{
.sdl2_id = SDLK_3, .sdl2_name = "3",
.vhex_id = VKEY_3, .vhex_name = "3"
},
{
.sdl2_id = SDLK_4, .sdl2_name = "4",
.vhex_id = VKEY_4, .vhex_name = "4"
},
{
.sdl2_id = SDLK_5, .sdl2_name = "5",
.vhex_id = VKEY_5, .vhex_name = "5"
},
{
.sdl2_id = SDLK_6, .sdl2_name = "6",
.vhex_id = VKEY_6, .vhex_name = "6"
},
{
.sdl2_id = SDLK_7, .sdl2_name = "7",
.vhex_id = VKEY_7, .vhex_name = "7"
},
{
.sdl2_id = SDLK_8, .sdl2_name = "8",
.vhex_id = VKEY_8, .vhex_name = "8"
},
{
.sdl2_id = SDLK_9, .sdl2_name = "9",
.vhex_id = VKEY_9, .vhex_name = "9"
},
/* Arrows */
{
.sdl2_id = SDLK_RIGHT, .sdl2_name = "right arrow",
.vhex_id = VKEY_RIGHT, .vhex_name = "right arrow"
},
{
.sdl2_id = SDLK_LEFT, .sdl2_name = "left arrow",
.vhex_id = VKEY_LEFT, .vhex_name = "left arrow"
},
{
.sdl2_id = SDLK_DOWN, .sdl2_name = "down arrow",
.vhex_id = VKEY_DOWN, .vhex_name = "down arrow"
},
{
.sdl2_id = SDLK_UP, .sdl2_name = "up arrow",
.vhex_id = VKEY_UP, .vhex_name = "up arrow"
},
/* special keys */
{
.sdl2_id = SDLK_KP_ENTER, .sdl2_name = "enter",
.vhex_id = VKEY_EXE, .vhex_name = "EXE"
},
{
.sdl2_id = SDLK_LSHIFT, .sdl2_name = "left shift",
.vhex_id = VKEY_ALPHA, .vhex_name = "ALPHA"
},
{
.sdl2_id = SDLK_RSHIFT, .sdl2_name = "right shift",
.vhex_id = VKEY_SHIFT, .vhex_name = "SHIFT"
},
{
.sdl2_id = SDLK_ESCAPE, .sdl2_name = "echap",
.vhex_id = VKEY_EXIT, .vhex_name = "EXIT"
},
{
.sdl2_id = SDLK_BACKSPACE, .sdl2_name = "backspace",
.vhex_id = VKEY_DEL, .vhex_name = "DEL"
},
{
.sdl2_id = SDLK_TAB, .sdl2_name = "tab",
.vhex_id = VKEY_MENU, .vhex_name = "MENU"
},
/* end of translation table */
{
.sdl2_id = -1, .sdl2_name = NULL,
.vhex_id = -1, .vhex_name = NULL
}
};
//---
// keycache primitives
//---
static int sdl_keycache_event_pop(vkey_event_t *event)
{
SDL_Event evt;
int ret;
while (1)
{
ret = SDL_PollEvent(&evt);
if (ret == 0) {
if (event != NULL) {
event->key = VKEY_NONE;
event->type = VKEYEV_NONE;
}
return 0;
}
if (evt.type == SDL_QUIT)
exit(0);
if (evt.type != SDL_KEYDOWN && evt.type != SDL_KEYUP)
continue;
for (int i = 0; key_translation[i].sdl2_name != NULL; ++i) {
if (evt.key.keysym.sym != key_translation[i].sdl2_id)
continue;
if (event != NULL) {
event->time = 0;
event->key = key_translation[i].vhex_id;
event->type = VKEYEV_DOWN;
if (evt.type == SDL_KEYDOWN)
event->type = VKEYEV_UP;
}
return 1;
}
}
}
//---
// Internal fake driver definition
//---
/* __keysc_configure() : configure the keyboard module */
static void __keysc_configure(void)
{
printf("[drv] keyboard: keymap notes:\n");
printf(" +-------------+-------------+\n");
printf(" | OS | Vhex |\n");
printf(" +-------------+-------------+\n");
for (int i = 0; key_translation[i].sdl2_name != NULL; ++i) {
printf(
" | %-11s | %-11s |\n",
key_translation[i].sdl2_name,
key_translation[i].vhex_name
);
}
printf(" +-------------+-------------+\n");
}
/* __keysc_hsave() : save hardware information */
static void __keysc_hsave(void)
{
// Nothing to do, this is a fake driver
;
}
/* __keysc_hrestore() : restore hadware information */
static void __keysc_hrestore(void)
{
// Nothing to do, this is a fake driver
;
}
struct vhex_driver drv_keysc = {
.name = "SDL2 Keyboard",
.hsave = (void*)&__keysc_hsave,
.hrestore = (void*)&__keysc_hrestore,
.configure = (void*)&__keysc_configure,
.state_size = 4,
.flags = {
.KEYBOARD = 1,
.SHARED = 0,
.UNUSED = 0,
},
.module_data = &(struct keyboard_drv_interface){
.keycache_init = NULL,
.keycache_keydown = NULL,
.keycache_event_wait = NULL,
.keycache_event_pop = &sdl_keycache_event_pop,
.keycache_event_push = NULL,
.keycache_quit = NULL,
}
};
VHEX_DECLARE_DRIVER(03, drv_keysc);