X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=common%2Finput.c;h=c5130c4d2e86254caace99d6278bcee3e7c4554f;hb=bde5dcbb2c2e10c5cf999d65295e768d027144c4;hp=a6d331e09da02ca233350ec8d6d2375056467777;hpb=74065be8cdfbcccb7e12d7e19f0a7cb35538db06;p=libpicofe.git diff --git a/common/input.c b/common/input.c index a6d331e..c5130c4 100644 --- a/common/input.c +++ b/common/input.c @@ -1,3 +1,13 @@ +/* + * (C) Gražvydas "notaz" Ignotas, 2008-2010 + * + * This work is licensed under the terms of any of these licenses + * (at your option): + * - GNU GPL, version 2 or later. + * - GNU LGPL, version 2.1 or later. + * See the COPYING file in the top-level directory. + */ + #include #include #include @@ -213,8 +223,14 @@ void in_probe(void) int i; in_have_async_devs = 0; - for (i = 0; i < in_dev_count; i++) - in_devices[i].probed = 0; + for (i = 0; i < in_dev_count; i++) { + in_dev_t *dev = &in_devices[i]; + if (dev->probed) { + DRV(dev->drv_id).free(dev->drv_data); + dev->drv_data = NULL; + dev->probed = 0; + } + } for (i = 1; i < IN_DRVID_COUNT; i++) in_drivers[i].probe(); @@ -608,6 +624,28 @@ const char *in_get_key_name(int dev_id, int keycode) return xname; } +int in_get_key_code(int dev_id, const char *key_name) +{ + in_dev_t *dev; + int i; + + if (dev_id < 0) /* want last used dev? */ + dev_id = menu_last_used_dev; + + if (dev_id < 0 || dev_id >= IN_MAX_DEVS) + return -1; + + dev = &in_devices[dev_id]; + if (dev->key_names == NULL) + return -1; + + for (i = 0; i < dev->key_count; i++) + if (dev->key_names[i] && strcasecmp(dev->key_names[i], key_name) == 0) + return i; + + return -1; +} + int in_bind_key(int dev_id, int keycode, int mask, int bind_type, int force_unbind) { int ret, count; @@ -645,22 +683,39 @@ int in_bind_key(int dev_id, int keycode, int mask, int bind_type, int force_unbi return 0; } -void in_unbind_all(int dev_id, int act_mask, int bind_type) +/* + * Unbind act_mask on binds with type bind_type + * - if dev_id_ < 0, affects all devices + * else only affects dev_id_ + * - if act_mask == -1, unbind all keys + * else only actions in mask + */ +void in_unbind_all(int dev_id_, int act_mask, int bind_type) { + int dev_id = 0, dev_last = IN_MAX_DEVS - 1; int i, count; in_dev_t *dev; - if (dev_id < 0 || dev_id >= IN_MAX_DEVS || bind_type >= IN_BINDTYPE_COUNT) + if (dev_id_ >= 0) + dev_id = dev_last = dev_id_; + + if (bind_type >= IN_BINDTYPE_COUNT) return; - dev = &in_devices[dev_id]; - count = dev->key_count; + for (; dev_id <= dev_last; dev_id++) { + dev = &in_devices[dev_id]; + count = dev->key_count; - if (dev->binds == NULL) - return; + if (dev->binds == NULL) + continue; - for (i = 0; i < count; i++) - dev->binds[IN_BIND_OFFS(i, bind_type)] &= ~act_mask; + if (act_mask != -1) { + for (i = 0; i < count; i++) + dev->binds[IN_BIND_OFFS(i, bind_type)] &= ~act_mask; + } + else + memset(dev->binds, 0, sizeof(dev->binds[0]) * count * IN_BINDTYPE_COUNT); + } } /* returns device id, or -1 on error */