input: only set default binds when probing

otherwise if device is missing, but it's config is loaded,
binds get messed up
This commit is contained in:
notaz 2015-02-03 01:31:41 +02:00
parent 9b87077e93
commit 9fec8a91c9
2 changed files with 38 additions and 10 deletions

44
input.c
View file

@ -50,26 +50,26 @@ static int menu_last_used_dev = 0;
static int *in_alloc_binds(int drv_id, int key_count) static int *in_alloc_binds(int drv_id, int key_count)
{ {
const struct in_default_bind *defbinds; const struct in_default_bind *defbinds;
int *binds; int *binds, *binds_d;
int i; int i;
binds = calloc(key_count * IN_BINDTYPE_COUNT * 2, sizeof(binds[0])); binds = calloc(key_count * IN_BINDTYPE_COUNT * 2, sizeof(binds[0]));
if (binds == NULL) if (binds == NULL)
return NULL; return NULL;
binds_d = binds + key_count * IN_BINDTYPE_COUNT;
/* always have a copy of defbinds */
defbinds = DRV(drv_id).defbinds; defbinds = DRV(drv_id).defbinds;
if (defbinds != NULL) { if (defbinds != NULL) {
for (i = 0; ; i++) { for (i = 0; ; i++) {
if (defbinds[i].bit == 0 && defbinds[i].btype == 0 if (defbinds[i].bit == 0 && defbinds[i].btype == 0
&& defbinds[i].bit == 0) && defbinds[i].bit == 0)
break; 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; 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; return binds;
@ -141,6 +141,9 @@ void in_register(const char *nname, int drv_fd_hnd, void *drv_data,
return; 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].name = tmp;
in_devices[i].binds = binds; in_devices[i].binds = binds;
in_devices[i].key_count = key_count; 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); in_dev_t *dev = get_dev(dev_id);
if (dev == NULL) if (dev == NULL)
return NULL; return NULL;
if (dev->binds == NULL)
return NULL;
return dev->binds + dev->key_count * IN_BINDTYPE_COUNT; 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) { if (drv_id < 0) {
lprintf("input: missing driver for %s\n", name); lprintf("input: missing driver for '%s'\n", name);
return -1; return -1;
} }
@ -797,7 +802,8 @@ int in_config_parse_dev(const char *name)
for (i = 0; i < IN_MAX_DEVS; i++) for (i = 0; i < IN_MAX_DEVS; i++)
if (in_devices[i].name == NULL) break; if (in_devices[i].name == NULL) break;
if (i >= IN_MAX_DEVS) { 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; 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) { 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; return -1;
} }
@ -912,8 +919,25 @@ void in_debug_dump(void)
in_dev_t *d = &in_devices[i]; in_dev_t *d = &in_devices[i];
if (!d->probed && d->name == NULL && d->binds == NULL) if (!d->probed && d->name == NULL && d->binds == NULL)
continue; 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); 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
} }
} }

4
menu.c
View file

@ -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_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); 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;
} }
} }