From e0d65e9409c43c6863988d049d7902dc93a2ec15 Mon Sep 17 00:00:00 2001 From: kub Date: Thu, 9 Jan 2025 23:52:53 +0100 Subject: [PATCH] more keyboard support --- in_sdl.c | 1 + input.c | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++----- input.h | 4 +++ 3 files changed, 85 insertions(+), 7 deletions(-) diff --git a/in_sdl.c b/in_sdl.c index a9ab1fb..f0b5264 100644 --- a/in_sdl.c +++ b/in_sdl.c @@ -189,6 +189,7 @@ static void in_sdl_probe(const in_drv_t *drv) state->drv = drv; in_register(IN_SDL_PREFIX "keys", -1, state, SDLK_LAST, key_names, 0); + //SDL_EnableUNICODE(1); /* joysticks go here too */ SDL_InitSubSystem(SDL_INIT_JOYSTICK); diff --git a/input.c b/input.c index 785c3c1..3ff94e3 100644 --- a/input.c +++ b/input.c @@ -542,6 +542,13 @@ const int *in_get_dev_binds(int dev_id) return dev ? dev->binds : NULL; } +const int *in_get_dev_ps2_binds(int dev_id) +{ + in_dev_t *dev = get_dev(dev_id); + + return dev ? dev->pico_ps2_binds : NULL; +} + const int *in_get_dev_def_binds(int dev_id) { in_dev_t *dev = get_dev(dev_id); @@ -553,6 +560,17 @@ const int *in_get_dev_def_binds(int dev_id) return dev->binds + dev->key_count * IN_BINDTYPE_COUNT; } +const int *in_get_dev_ps2_def_binds(int dev_id) +{ + in_dev_t *dev = get_dev(dev_id); + if (dev == NULL) + return NULL; + if (dev->binds == NULL) + return NULL; + + return dev->pico_ps2_binds; +} + int in_get_config(int dev_id, int what, void *val) { int *ival = val; @@ -785,6 +803,30 @@ int in_bind_key(int dev_id, int keycode, int mask, int bind_type, int force_unbi return 0; } +int in_bind_ps2_key(int dev_id, int keycode, int ps2_key) +{ + int count; + in_dev_t *dev; + + dev = get_dev(dev_id); + if (dev == NULL) + return -1; + + count = dev->key_count; + + if (dev->pico_ps2_binds == NULL) { + dev->pico_ps2_binds = in_alloc_pico_ps2_binds(dev->drv_id, count); + if (dev->pico_ps2_binds == NULL) + return -1; + } + + if (keycode < 0 || keycode >= count) + return -1; + + dev->pico_ps2_binds[keycode] = ps2_key; + return 0; +} + /* * Unbind act_mask on binds with type bind_type * - if dev_id_ < 0, affects all devices @@ -874,14 +916,9 @@ int in_config_parse_dev(const char *name) return i; } -int in_config_bind_key(int dev_id, const char *key, int acts, int bind_type) +static int parse_key(in_dev_t *dev, const char *key) { - in_dev_t *dev; - int i, offs, kc; - - dev = get_dev(dev_id); - if (dev == NULL || bind_type >= IN_BINDTYPE_COUNT) - return -1; + int kc, i; /* maybe a raw code? */ if (key[0] == '\\' && key[1] == 'x') { @@ -917,6 +954,20 @@ int in_config_bind_key(int dev_id, const char *key, int acts, int bind_type) } } + return kc; +} + +int in_config_bind_key(int dev_id, const char *key, int acts, int bind_type) +{ + in_dev_t *dev; + int i, offs, kc; + + dev = get_dev(dev_id); + if (dev == NULL || bind_type >= IN_BINDTYPE_COUNT) + return -1; + + kc = parse_key(dev, key); + if (kc < 0 || kc >= dev->key_count) { lprintf("input: bad key: '%s' for device '%s'\n", key, dev->name); @@ -936,6 +987,28 @@ int in_config_bind_key(int dev_id, const char *key, int acts, int bind_type) return 0; } +int in_config_bind_ps2_key(int dev_id, const char *key, int ps2_key) +{ + in_dev_t *dev; + int kc; + + dev = get_dev(dev_id); + if (dev == NULL) + return -1; + + kc = parse_key(dev, key); + + if (kc < 0 || kc >= dev->key_count) { + lprintf("input: bad key: '%s' for device '%s'\n", + key, dev->name); + return -1; + } + + dev->pico_ps2_binds[kc] = ps2_key; + + return 0; +} + void in_clean_binds(void) { int i; diff --git a/input.h b/input.h index 9dbcc36..6817e13 100644 --- a/input.h +++ b/input.h @@ -141,17 +141,21 @@ int in_menu_wait_any(char *charcode, int timeout_ms); int in_menu_wait(int interesting, char *charcode, int autorep_delay_ms); int in_config_parse_dev(const char *dev_name); int in_config_bind_key(int dev_id, const char *key, int binds, int bind_type); +int in_config_bind_ps2_key(int dev_id, const char *key, int ps2_key); int in_get_config(int dev_id, int what, void *val); int in_set_config(int dev_id, int what, const void *val, int size); int in_get_key_code(int dev_id, const char *key_name); int in_name_to_id(const char *dev_name); int in_bind_key(int dev_id, int keycode, int mask, int bind_type, int force_unbind); +int in_bind_ps2_key(int dev_id, int keycode, int ps2_key); void in_unbind_all(int dev_id, int act_mask, int bind_type); void in_clean_binds(void); void in_debug_dump(void); const int *in_get_dev_binds(int dev_id); +const int *in_get_dev_ps2_binds(int dev_id); const int *in_get_dev_def_binds(int dev_id); +const int *in_get_dev_ps2_def_binds(int dev_id); const char *in_get_dev_name(int dev_id, int must_be_active, int skip_pfix); const char *in_get_key_name(int dev_id, int keycode); -- 2.39.5