From 9fec8a91c9b19856ac0b51de53b847b38ed8dc61 Mon Sep 17 00:00:00 2001 From: notaz Date: Tue, 3 Feb 2015 01:31:41 +0200 Subject: [PATCH] input: only set default binds when probing otherwise if device is missing, but it's config is loaded, binds get messed up --- input.c | 44 ++++++++++++++++++++++++++++++++++---------- menu.c | 4 ++++ 2 files changed, 38 insertions(+), 10 deletions(-) diff --git a/input.c b/input.c index 2c34a79..783ed1e 100644 --- a/input.c +++ b/input.c @@ -50,26 +50,26 @@ 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 *binds, *binds_d; int i; binds = calloc(key_count * IN_BINDTYPE_COUNT * 2, sizeof(binds[0])); if (binds == NULL) return NULL; + binds_d = binds + key_count * IN_BINDTYPE_COUNT; + + /* always have a copy of defbinds */ defbinds = DRV(drv_id).defbinds; if (defbinds != NULL) { for (i = 0; ; i++) { if (defbinds[i].bit == 0 && defbinds[i].btype == 0 && defbinds[i].bit == 0) break; - binds[IN_BIND_OFFS(defbinds[i].code, defbinds[i].btype)] |= + + binds_d[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; @@ -141,6 +141,9 @@ void in_register(const char *nname, int drv_fd_hnd, void *drv_data, return; } + memcpy(binds, binds + key_count * IN_BINDTYPE_COUNT, + sizeof(binds[0]) * key_count * IN_BINDTYPE_COUNT); + in_devices[i].name = tmp; in_devices[i].binds = binds; in_devices[i].key_count = key_count; @@ -494,6 +497,8 @@ const int *in_get_dev_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->binds + dev->key_count * IN_BINDTYPE_COUNT; } @@ -779,7 +784,7 @@ int in_config_parse_dev(const char *name) } if (drv_id < 0) { - lprintf("input: missing driver for %s\n", name); + lprintf("input: missing driver for '%s'\n", name); return -1; } @@ -797,7 +802,8 @@ int in_config_parse_dev(const char *name) for (i = 0; i < IN_MAX_DEVS; i++) if (in_devices[i].name == NULL) break; if (i >= IN_MAX_DEVS) { - lprintf("input: too many devices, can't add %s\n", name); + lprintf("input: too many devices, can't add '%s'\n", + name); return -1; } } @@ -862,7 +868,8 @@ int in_config_bind_key(int dev_id, const char *key, int acts, int bind_type) } if (kc < 0 || kc >= dev->key_count) { - lprintf("input: bad key: %s\n", key); + lprintf("input: bad key: '%s' for device '%s'\n", + key, dev->name); return -1; } @@ -912,8 +919,25 @@ void in_debug_dump(void) in_dev_t *d = &in_devices[i]; if (!d->probed && d->name == NULL && d->binds == NULL) continue; - lprintf("%d %3d %6c %5c %s\n", i, d->drv_id, d->probed ? 'y' : 'n', + lprintf("%d %3d %6c %5c %s\n", i, d->drv_id, + d->probed ? 'y' : 'n', d->binds ? 'y' : 'n', d->name); +#if 0 + if (d->binds) { + int kc, o, t, h; + for (kc = 0; kc < d->key_count; kc++) { + o = IN_BIND_OFFS(kc, 0); + for (t = h = 0; t < IN_BINDTYPE_COUNT; t++) + h |= d->binds[o + t]; + if (h == 0) + continue; + lprintf(" [%3d] =", kc); + for (t = 0; t < IN_BINDTYPE_COUNT; t++) + printf(" %x", d->binds[o + t]); + printf("\n"); + } + } +#endif } } diff --git a/menu.c b/menu.c index 7d2b14e..b40a5df 100644 --- a/menu.c +++ b/menu.c @@ -1507,6 +1507,10 @@ static void key_config_loop(const me_bind_action *opts, int opt_cnt, int player_ in_unbind_all(bind_dev_id, opts[sel].mask << mask_shift, bindtype); in_bind_key(bind_dev_id, kc, opts[sel].mask << mask_shift, bindtype, 0); + + // make sure bind change is displayed + if (dev_id != -1) + dev_id = bind_dev_id; } } -- 2.39.2