X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=in_sdl.c;h=af8d636cd7cf55713eb473340c09a8ba2f2968ca;hb=c19e28f62660cdaed26698234cff9c084517b34c;hp=45a0276bd68acf46ed4f7155efa1bd0d072f213a;hpb=18306c325f0d24fc7232dff055e814432e06d5d1;p=libpicofe.git diff --git a/in_sdl.c b/in_sdl.c index 45a0276..af8d636 100644 --- a/in_sdl.c +++ b/in_sdl.c @@ -20,6 +20,7 @@ typedef unsigned long keybits_t; #define KEYBITS_WORD_BITS (sizeof(keybits_t) * 8) struct in_sdl_state { + const in_drv_t *drv; SDL_Joystick *joy; int joy_id; int axis_keydown[2]; @@ -162,7 +163,7 @@ static const char * const in_sdl_keys[SDLK_LAST] = { [SDLK_COMPOSE] = "compose", }; -static void in_sdl_probe(void) +static void in_sdl_probe(const in_drv_t *drv) { struct in_sdl_state *state; SDL_Joystick *joy; @@ -175,6 +176,7 @@ static void in_sdl_probe(void) return; } + state->drv = drv; in_register(IN_SDL_PREFIX "keys", -1, state, SDLK_LAST, in_sdl_keys, 0); @@ -194,6 +196,7 @@ static void in_sdl_probe(void) } state->joy = joy; state->joy_id = i; + state->drv = drv; snprintf(name, sizeof(name), IN_SDL_PREFIX "%s", SDL_JoystickName(i)); in_register(name, -1, state, SDLK_LAST, in_sdl_keys, 0); @@ -406,52 +409,22 @@ static int in_sdl_update_keycode(void *drv_data, int *is_down) return ret_kc; } -struct menu_keymap { - short key; - short pbtn; -}; - -static const struct menu_keymap key_pbtn_map[] = -{ - { SDLK_UP, PBTN_UP }, - { SDLK_DOWN, PBTN_DOWN }, - { SDLK_LEFT, PBTN_LEFT }, - { SDLK_RIGHT, PBTN_RIGHT }, - /* XXX: maybe better set this from it's plat code somehow */ - { SDLK_RETURN, PBTN_MOK }, - { SDLK_ESCAPE, PBTN_MBACK }, - { SDLK_SEMICOLON, PBTN_MA2 }, - { SDLK_QUOTE, PBTN_MA3 }, - { SDLK_BACKSLASH, PBTN_MENU }, - { SDLK_LEFTBRACKET, PBTN_L }, - { SDLK_RIGHTBRACKET, PBTN_R }, -}; -#define KEY_PBTN_MAP_SIZE (sizeof(key_pbtn_map) / sizeof(key_pbtn_map[0])) - -static const struct menu_keymap joybtn_pbtn_map[] = -{ - { SDLK_UP, PBTN_UP }, - { SDLK_DOWN, PBTN_DOWN }, - { SDLK_LEFT, PBTN_LEFT }, - { SDLK_RIGHT, PBTN_RIGHT }, - /* joystick */ - { SDLK_WORLD_0, PBTN_MOK }, - { SDLK_WORLD_1, PBTN_MBACK }, - { SDLK_WORLD_2, PBTN_MA2 }, - { SDLK_WORLD_3, PBTN_MA3 }, -}; -#define JOYBTN_PBTN_MAP_SIZE (sizeof(joybtn_pbtn_map) / sizeof(joybtn_pbtn_map[0])) - static int in_sdl_menu_translate(void *drv_data, int keycode, char *charcode) { struct in_sdl_state *state = drv_data; + const struct in_pdata *pdata = state->drv->pdata; const struct menu_keymap *map; int map_len; int ret = 0; int i; - map = state->joy ? joybtn_pbtn_map : key_pbtn_map; - map_len = state->joy ? JOYBTN_PBTN_MAP_SIZE : KEY_PBTN_MAP_SIZE; + if (state->joy) { + map = pdata->joy_map; + map_len = pdata->jmap_size; + } else { + map = pdata->key_map; + map_len = pdata->kmap_size; + } if (keycode < 0) { @@ -491,9 +464,14 @@ static const in_drv_t in_sdl_drv = { .menu_translate = in_sdl_menu_translate, }; -void in_sdl_init(const struct in_default_bind *defbinds, - void (*handler)(void *event)) +int in_sdl_init(const struct in_pdata *pdata, void (*handler)(void *event)) { - in_register_driver(&in_sdl_drv, defbinds); + if (!pdata) { + fprintf(stderr, "in_sdl: Missing input platform data\n"); + return -1; + } + + in_register_driver(&in_sdl_drv, pdata->defbinds, pdata); ext_event_handler = handler; + return 0; }