mirror of
https://github.com/RaySollium99/libpicofe.git
synced 2025-09-04 22:47:44 -04:00
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:
parent
9b87077e93
commit
9fec8a91c9
2 changed files with 38 additions and 10 deletions
44
input.c
44
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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
4
menu.c
4
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue