X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2Fcommon%2Finput.c;h=39d678397e804911297346f8673832eb4ef6e2e6;hb=0e2e3f498456d1175916ecd69d0a9e80e701e760;hp=0b1984bd5349a947127c164db03c74ae4d15c067;hpb=1b0c513996d57548fc5df8726e21a68e5ace4f99;p=pcsx_rearmed.git diff --git a/frontend/common/input.c b/frontend/common/input.c index 0b1984bd..39d67839 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; } @@ -332,7 +344,7 @@ static int in_update_kc_async(int *dev_id_out, int *is_down_out, int timeout_ms) /* * wait for a press, always return some keycode or -1 on timeout or error */ -int in_update_keycode(int *dev_id_out, int *is_down_out, int timeout_ms) +int in_update_keycode(int *dev_id_out, int *is_down_out, char *charcode, int timeout_ms) { int result = -1, dev_id = 0, is_down, result_menu; int fds_hnds[IN_MAX_DEVS]; @@ -399,7 +411,7 @@ int in_update_keycode(int *dev_id_out, int *is_down_out, int timeout_ms) finish: /* keep track of menu key state, to allow mixing * in_update_keycode() and in_menu_wait_any() calls */ - result_menu = drv->menu_translate(in_devices[dev_id].drv_data, result); + result_menu = drv->menu_translate(in_devices[dev_id].drv_data, result, charcode); if (result_menu != 0) { if (is_down) menu_key_state |= result_menu; @@ -415,7 +427,7 @@ finish: } /* same as above, only return bitfield of PBTN_* */ -int in_menu_wait_any(int timeout_ms) +int in_menu_wait_any(char *charcode, int timeout_ms) { int keys_old = menu_key_state; @@ -423,7 +435,7 @@ int in_menu_wait_any(int timeout_ms) { int code, is_down = 0, dev_id = 0; - code = in_update_keycode(&dev_id, &is_down, timeout_ms); + code = in_update_keycode(&dev_id, &is_down, charcode, timeout_ms); if (code < 0) break; @@ -437,7 +449,7 @@ int in_menu_wait_any(int timeout_ms) } /* wait for menu input, do autorepeat */ -int in_menu_wait(int interesting, int autorep_delay_ms) +int in_menu_wait(int interesting, char *charcode, int autorep_delay_ms) { static int inp_prev = 0; static int repeats = 0; @@ -446,12 +458,12 @@ int in_menu_wait(int interesting, int autorep_delay_ms) if (repeats) wait = autorep_delay_ms; - ret = in_menu_wait_any(wait); + ret = in_menu_wait_any(charcode, wait); if (ret == inp_prev) repeats++; while (!(ret & interesting)) { - ret = in_menu_wait_any(-1); + ret = in_menu_wait_any(charcode, -1); release = 1; } @@ -528,7 +540,7 @@ static int in_set_blocking(int is_blocking) /* flush events */ do { - ret = in_update_keycode(NULL, NULL, 0); + ret = in_update_keycode(NULL, NULL, NULL, 0); } while (ret >= 0); return 0; @@ -536,8 +548,10 @@ static int in_set_blocking(int is_blocking) int in_set_config(int dev_id, int what, const void *val, int size) { + const char * const *names; const int *ival = val; in_dev_t *dev; + int count; if (what == IN_CFG_BLOCKING) return in_set_blocking(*ival); @@ -546,9 +560,10 @@ int in_set_config(int dev_id, int what, const void *val, int size) if (dev == NULL) return -1; - if (what == IN_CFG_KEY_NAMES) { - const char * const *names = val; - int count = size / sizeof(names[0]); + switch (what) { + case IN_CFG_KEY_NAMES: + names = val; + count = size / sizeof(names[0]); if (count < dev->key_count) { lprintf("input: set_key_names: not enough keys\n"); @@ -557,6 +572,12 @@ int in_set_config(int dev_id, int what, const void *val, int size) dev->key_names = names; return 0; + case IN_CFG_DEFAULT_DEV: + /* just set last used dev, for now */ + menu_last_used_dev = dev_id; + return 0; + default: + break; } if (dev->probed) @@ -622,7 +643,7 @@ const char *in_get_key_name(int dev_id, int keycode) drv = &DRV(dev->drv_id); if (keycode < 0) /* want name for menu key? */ - keycode = drv->menu_translate(dev->drv_data, keycode); + keycode = drv->menu_translate(dev->drv_data, keycode, NULL); if (dev->key_names != NULL && 0 <= keycode && keycode < dev->key_count) name = dev->key_names[keycode]; @@ -891,13 +912,12 @@ 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; } static int in_def_update_analog(void *drv_data, int axis_id, int *result) { return -1; } static int in_def_update_keycode(void *drv_data, int *is_down) { return 0; } -static int in_def_menu_translate(void *drv_data, int keycode) { return 0; } +static int in_def_menu_translate(void *drv_data, int keycode, char *ccode) { return 0; } static int in_def_get_key_code(const char *key_name) { return -1; } static const char *in_def_get_key_name(int keycode) { return NULL; } @@ -905,7 +925,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 +939,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 +947,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;