From b07c18e8645a17be916266820ae564e0d320cc1a Mon Sep 17 00:00:00 2001 From: notaz Date: Tue, 24 Apr 2012 01:48:17 +0300 Subject: frontend: input: pass default binds as argument allows to get rid of some hacks --- frontend/common/in_sdl.c | 4 ++-- frontend/common/in_sdl.h | 4 +++- frontend/common/input.c | 24 ++++++++++++++++++------ frontend/common/input.h | 5 +++-- 4 files changed, 26 insertions(+), 11 deletions(-) (limited to 'frontend/common') diff --git a/frontend/common/in_sdl.c b/frontend/common/in_sdl.c index 27c183b..ed13610 100644 --- a/frontend/common/in_sdl.c +++ b/frontend/common/in_sdl.c @@ -302,8 +302,8 @@ static const in_drv_t in_sdl_drv = { .menu_translate = in_sdl_menu_translate, }; -void in_sdl_init(void) +void in_sdl_init(const struct in_default_bind *defbinds) { - in_register_driver(&in_sdl_drv); + in_register_driver(&in_sdl_drv, defbinds); } diff --git a/frontend/common/in_sdl.h b/frontend/common/in_sdl.h index 9c9d406..47f7a83 100644 --- a/frontend/common/in_sdl.h +++ b/frontend/common/in_sdl.h @@ -1 +1,3 @@ -void in_sdl_init(void); +struct in_default_bind; + +void in_sdl_init(const struct in_default_bind *defbinds); diff --git a/frontend/common/input.c b/frontend/common/input.c index 0b1984b..2f8a867 100644 --- a/frontend/common/input.c +++ b/frontend/common/input.c @@ -52,15 +52,27 @@ static int menu_last_used_dev = 0; static int *in_alloc_binds(int drv_id, int key_count) { + const struct in_default_bind *defbinds; int *binds; + int i; binds = calloc(key_count * IN_BINDTYPE_COUNT * 2, sizeof(binds[0])); if (binds == NULL) return NULL; - DRV(drv_id).get_def_binds(binds + key_count * IN_BINDTYPE_COUNT); - memcpy(binds, binds + key_count * IN_BINDTYPE_COUNT, - sizeof(binds[0]) * key_count * IN_BINDTYPE_COUNT); + defbinds = DRV(drv_id).defbinds; + if (defbinds != NULL) { + for (i = 0; ; i++) { + if (defbinds[i].bit == 0 && defbinds[i].code == 0) + break; + binds[IN_BIND_OFFS(defbinds[i].code, defbinds[i].btype)] = + 1 << defbinds[i].bit; + } + + /* always have a copy of defbinds */ + memcpy(binds + key_count * IN_BINDTYPE_COUNT, binds, + sizeof(binds[0]) * key_count * IN_BINDTYPE_COUNT); + } return binds; } @@ -891,7 +903,6 @@ void in_debug_dump(void) /* stubs for drivers that choose not to implement something */ static void in_def_free(void *drv_data) {} -static void in_def_get_def_binds(int *binds) {} static int in_def_clean_binds(void *drv_data, int *b, int *db) { return 1; } static int in_def_get_config(void *drv_data, int what, int *val) { return -1; } static int in_def_set_config(void *drv_data, int what, int val) { return -1; } @@ -905,7 +916,7 @@ static const char *in_def_get_key_name(int keycode) { return NULL; } if (d.f == NULL) d.f = in_def_##f /* to be called by drivers */ -int in_register_driver(const in_drv_t *drv) +int in_register_driver(const in_drv_t *drv, const struct in_default_bind *defbinds) { int count_new = in_driver_count + 1; in_drv_t *new_drivers; @@ -919,7 +930,6 @@ int in_register_driver(const in_drv_t *drv) memcpy(&new_drivers[in_driver_count], drv, sizeof(new_drivers[0])); CHECK_ADD_STUB(new_drivers[in_driver_count], free); - CHECK_ADD_STUB(new_drivers[in_driver_count], get_def_binds); CHECK_ADD_STUB(new_drivers[in_driver_count], clean_binds); CHECK_ADD_STUB(new_drivers[in_driver_count], get_config); CHECK_ADD_STUB(new_drivers[in_driver_count], set_config); @@ -928,6 +938,8 @@ int in_register_driver(const in_drv_t *drv) CHECK_ADD_STUB(new_drivers[in_driver_count], menu_translate); CHECK_ADD_STUB(new_drivers[in_driver_count], get_key_code); CHECK_ADD_STUB(new_drivers[in_driver_count], get_key_name); + if (defbinds != NULL) + new_drivers[in_driver_count].defbinds = defbinds; in_drivers = new_drivers; in_driver_count = count_new; diff --git a/frontend/common/input.h b/frontend/common/input.h index 524366f..1f90425 100644 --- a/frontend/common/input.h +++ b/frontend/common/input.h @@ -79,7 +79,6 @@ typedef struct { void (*free)(void *drv_data); const char * const * (*get_key_names)(int *count); - void (*get_def_binds)(int *binds); int (*clean_binds)(void *drv_data, int *binds, int *def_finds); int (*get_config)(void *drv_data, int what, int *val); int (*set_config)(void *drv_data, int what, int val); @@ -90,6 +89,8 @@ typedef struct { int (*menu_translate)(void *drv_data, int keycode); int (*get_key_code)(const char *key_name); const char * (*get_key_name)(int keycode); + + const struct in_default_bind *defbinds; } in_drv_t; struct in_default_bind { @@ -99,7 +100,7 @@ struct in_default_bind { }; /* to be called by drivers */ -int in_register_driver(const in_drv_t *drv); +int in_register_driver(const in_drv_t *drv, const struct in_default_bind *defbinds); void in_register(const char *nname, int drv_fd_hnd, void *drv_data, int key_count, const char * const *key_names, int combos); void in_combos_find(const int *binds, int last_key, int *combo_keys, int *combo_acts); -- cgit v1.2.3