mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-05 15:27:46 -04:00
input: detect dead devices, always set keynames
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@924 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
eb564311ce
commit
cb906f692a
2 changed files with 25 additions and 13 deletions
|
@ -41,7 +41,7 @@ typedef struct
|
||||||
|
|
||||||
static in_drv_t in_drivers[IN_DRVID_COUNT];
|
static in_drv_t in_drivers[IN_DRVID_COUNT];
|
||||||
static in_dev_t in_devices[IN_MAX_DEVS];
|
static in_dev_t in_devices[IN_MAX_DEVS];
|
||||||
static int in_dev_count = 0;
|
static int in_dev_count = 0; /* probed + bind devices */
|
||||||
static int in_have_async_devs = 0;
|
static int in_have_async_devs = 0;
|
||||||
static int menu_key_state = 0;
|
static int menu_key_state = 0;
|
||||||
static int menu_last_used_dev = 0;
|
static int menu_last_used_dev = 0;
|
||||||
|
@ -64,12 +64,17 @@ static int *in_alloc_binds(int drv_id, int key_count)
|
||||||
return binds;
|
return binds;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void in_free(in_dev_t *dev)
|
static void in_unprobe(in_dev_t *dev)
|
||||||
{
|
{
|
||||||
if (dev->probed)
|
if (dev->probed)
|
||||||
DRV(dev->drv_id).free(dev->drv_data);
|
DRV(dev->drv_id).free(dev->drv_data);
|
||||||
dev->probed = 0;
|
dev->probed = 0;
|
||||||
dev->drv_data = NULL;
|
dev->drv_data = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void in_free(in_dev_t *dev)
|
||||||
|
{
|
||||||
|
in_unprobe(dev);
|
||||||
free(dev->name);
|
free(dev->name);
|
||||||
dev->name = NULL;
|
dev->name = NULL;
|
||||||
free(dev->binds);
|
free(dev->binds);
|
||||||
|
@ -223,14 +228,11 @@ void in_probe(void)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
in_have_async_devs = 0;
|
in_have_async_devs = 0;
|
||||||
for (i = 0; i < in_dev_count; i++) {
|
menu_key_state = 0;
|
||||||
in_dev_t *dev = &in_devices[i];
|
menu_last_used_dev = 0;
|
||||||
if (dev->probed) {
|
|
||||||
DRV(dev->drv_id).free(dev->drv_data);
|
for (i = 0; i < in_dev_count; i++)
|
||||||
dev->drv_data = NULL;
|
in_unprobe(&in_devices[i]);
|
||||||
dev->probed = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 1; i < IN_DRVID_COUNT; i++)
|
for (i = 1; i < IN_DRVID_COUNT; i++)
|
||||||
in_drivers[i].probe();
|
in_drivers[i].probe();
|
||||||
|
@ -374,6 +376,12 @@ int in_update_keycode(int *dev_id_out, int *is_down_out, int timeout_ms)
|
||||||
if (result >= 0)
|
if (result >= 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (result == -2) {
|
||||||
|
lprintf("input: \"%s\" errored out, removing.\n", in_devices[dev_id].name);
|
||||||
|
in_unprobe(&in_devices[dev_id]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (timeout_ms >= 0) {
|
if (timeout_ms >= 0) {
|
||||||
unsigned int ticks2 = plat_get_ticks_ms();
|
unsigned int ticks2 = plat_get_ticks_ms();
|
||||||
timeout_ms -= ticks2 - ticks;
|
timeout_ms -= ticks2 - ticks;
|
||||||
|
@ -761,7 +769,7 @@ int in_config_parse_dev(const char *name)
|
||||||
if (in_devices[i].name == NULL)
|
if (in_devices[i].name == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
in_devices[i].key_count = DRV(drv_id).get_bind_count();
|
in_devices[i].key_names = DRV(drv_id).get_key_names(&in_devices[i].key_count);
|
||||||
in_devices[i].drv_id = drv_id;
|
in_devices[i].drv_id = drv_id;
|
||||||
|
|
||||||
if (i + 1 > in_dev_count)
|
if (i + 1 > in_dev_count)
|
||||||
|
@ -873,7 +881,8 @@ void in_debug_dump(void)
|
||||||
|
|
||||||
static void in_def_probe(void) {}
|
static void in_def_probe(void) {}
|
||||||
static void in_def_free(void *drv_data) {}
|
static void in_def_free(void *drv_data) {}
|
||||||
static int in_def_get_bind_count(void) { return 0; }
|
static const char * const *
|
||||||
|
in_def_get_key_names(int *count) { return NULL; }
|
||||||
static void in_def_get_def_binds(int *binds) {}
|
static void in_def_get_def_binds(int *binds) {}
|
||||||
static int in_def_clean_binds(void *drv_data, int *b, int *db) { return 0; }
|
static int in_def_clean_binds(void *drv_data, int *b, int *db) { return 0; }
|
||||||
static int in_def_get_config(void *drv_data, int what, int *val) { return -1; }
|
static int in_def_get_config(void *drv_data, int what, int *val) { return -1; }
|
||||||
|
@ -895,7 +904,7 @@ void in_init(void)
|
||||||
in_drivers[i].prefix = "none:";
|
in_drivers[i].prefix = "none:";
|
||||||
in_drivers[i].probe = in_def_probe;
|
in_drivers[i].probe = in_def_probe;
|
||||||
in_drivers[i].free = in_def_free;
|
in_drivers[i].free = in_def_free;
|
||||||
in_drivers[i].get_bind_count = in_def_get_bind_count;
|
in_drivers[i].get_key_names = in_def_get_key_names;
|
||||||
in_drivers[i].get_def_binds = in_def_get_def_binds;
|
in_drivers[i].get_def_binds = in_def_get_def_binds;
|
||||||
in_drivers[i].clean_binds = in_def_clean_binds;
|
in_drivers[i].clean_binds = in_def_clean_binds;
|
||||||
in_drivers[i].get_config = in_def_get_config;
|
in_drivers[i].get_config = in_def_get_config;
|
||||||
|
|
|
@ -80,10 +80,13 @@ typedef struct {
|
||||||
void (*probe)(void);
|
void (*probe)(void);
|
||||||
void (*free)(void *drv_data);
|
void (*free)(void *drv_data);
|
||||||
int (*get_bind_count)(void);
|
int (*get_bind_count)(void);
|
||||||
|
const char * const *
|
||||||
|
(*get_key_names)(int *count);
|
||||||
void (*get_def_binds)(int *binds);
|
void (*get_def_binds)(int *binds);
|
||||||
int (*clean_binds)(void *drv_data, int *binds, int *def_finds);
|
int (*clean_binds)(void *drv_data, int *binds, int *def_finds);
|
||||||
int (*get_config)(void *drv_data, int what, int *val);
|
int (*get_config)(void *drv_data, int what, int *val);
|
||||||
int (*set_config)(void *drv_data, int what, int val);
|
int (*set_config)(void *drv_data, int what, int val);
|
||||||
|
/* return -1 on no event, -2 on error */
|
||||||
int (*update_keycode)(void *drv_data, int *is_down);
|
int (*update_keycode)(void *drv_data, int *is_down);
|
||||||
int (*menu_translate)(void *drv_data, int keycode);
|
int (*menu_translate)(void *drv_data, int keycode);
|
||||||
int (*get_key_code)(const char *key_name);
|
int (*get_key_code)(const char *key_name);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue