static in_drv_t in_drivers[IN_DRVID_COUNT];
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 menu_key_state = 0;
static int menu_last_used_dev = 0;
return binds;
}
-static void in_free(in_dev_t *dev)
+static void in_unprobe(in_dev_t *dev)
{
if (dev->probed)
DRV(dev->drv_id).free(dev->drv_data);
dev->probed = 0;
dev->drv_data = NULL;
+}
+
+static void in_free(in_dev_t *dev)
+{
+ in_unprobe(dev);
free(dev->name);
dev->name = NULL;
free(dev->binds);
int i;
in_have_async_devs = 0;
+ menu_key_state = 0;
+ menu_last_used_dev = 0;
+
for (i = 0; i < in_dev_count; i++)
- in_devices[i].probed = 0;
+ in_unprobe(&in_devices[i]);
for (i = 1; i < IN_DRVID_COUNT; i++)
in_drivers[i].probe();
if (result >= 0)
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) {
unsigned int ticks2 = plat_get_ticks_ms();
timeout_ms -= ticks2 - ticks;
if (in_devices[i].name == NULL)
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;
if (i + 1 > in_dev_count)
static void in_def_probe(void) {}
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 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; }
in_drivers[i].prefix = "none:";
in_drivers[i].probe = in_def_probe;
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].clean_binds = in_def_clean_binds;
in_drivers[i].get_config = in_def_get_config;
void (*probe)(void);
void (*free)(void *drv_data);
int (*get_bind_count)(void);
+ const char * const *
+ (*get_key_names)(int *count);
void (*get_def_binds)(int *binds);
int (*clean_binds)(void *drv_data, int *binds, int *def_finds);
int (*get_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 (*menu_translate)(void *drv_data, int keycode);
int (*get_key_code)(const char *key_name);
free(dev);
}
-static int in_evdev_get_bind_count(void)
+static const char * const *
+in_evdev_get_key_names(int *count)
{
- return KEY_CNT;
+ *count = KEY_CNT;
+ return in_evdev_keys;
}
static void or_binds(const int *binds, int key, int *result)
if (rd < (int) sizeof(ev)) {
if (errno != EAGAIN) {
perror("in_evdev: error reading");
- sleep(1);
+ //sleep(1);
+ ret_kc = -2;
}
goto out;
}
drv->prefix = in_evdev_prefix;
drv->probe = in_evdev_probe;
drv->free = in_evdev_free;
- drv->get_bind_count = in_evdev_get_bind_count;
+ drv->get_key_names = in_evdev_get_key_names;
drv->get_def_binds = in_evdev_get_def_binds;
drv->clean_binds = in_evdev_clean_binds;
drv->set_config = in_evdev_set_config;