menu: make key config more intuitive
[libpicofe.git] / common / input.c
index a6d331e..5250535 100644 (file)
@@ -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 <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -608,6 +618,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 +677,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 */