more keyboard support
authorkub <derkub@gmail.com>
Thu, 9 Jan 2025 22:52:53 +0000 (23:52 +0100)
committerkub <derkub@gmail.com>
Thu, 9 Jan 2025 22:52:53 +0000 (23:52 +0100)
in_sdl.c
input.c
input.h

index a9ab1fb..f0b5264 100644 (file)
--- 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 (file)
--- 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 (file)
--- 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);