input: hack: get alt/ctrl picked up as start/select by jsdev
authorGrazvydas Ignotas <notasas@gmail.com>
Sun, 7 Jun 2009 16:43:03 +0000 (19:43 +0300)
committerGrazvydas Ignotas <notasas@gmail.com>
Sun, 7 Jun 2009 16:43:03 +0000 (19:43 +0300)
drivers/input/joydev.c

index cee8df3..36b0e00 100644 (file)
@@ -72,6 +72,16 @@ struct joydev_client {
 static struct joydev *joydev_table[JOYDEV_MINORS];
 static DEFINE_MUTEX(joydev_table_mutex);
 
+/* pandora hack: convert some normal keys to joystick keys */
+static const struct {
+       __u16 from;
+       __u16 to;
+} converted_keys[] = {
+       { KEY_LEFTCTRL, BTN_SELECT },
+       { KEY_LEFTALT,  BTN_START },
+       { KEY_MENU,     BTN_MODE },
+};
+
 static int joydev_correct(int value, struct js_corr *corr)
 {
        switch (corr->type) {
@@ -122,10 +132,17 @@ static void joydev_event(struct input_handle *handle,
        struct joydev *joydev = handle->private;
        struct joydev_client *client;
        struct js_event event;
+       int i;
 
        switch (type) {
 
        case EV_KEY:
+               for (i = 0; i < ARRAY_SIZE(converted_keys); i++)
+                       if (code == converted_keys[i].from) {
+                               code = converted_keys[i].to;
+                               break;
+                       }
+
                if (code < BTN_MISC || value == 2)
                        return;
                event.type = JS_EVENT_BUTTON;
@@ -777,6 +794,13 @@ static int joydev_connect(struct input_handler *handler, struct input_dev *dev,
                        joydev->nkey++;
                }
 
+       for (i = 0; i < ARRAY_SIZE(converted_keys); i++)
+               if (test_bit(converted_keys[i].from, dev->keybit)) {
+                       joydev->keymap[converted_keys[i].to - BTN_MISC] = joydev->nkey;
+                       joydev->keypam[joydev->nkey] = converted_keys[i].to;
+                       joydev->nkey++;
+               }
+
        for (i = 0; i < joydev->nabs; i++) {
                j = joydev->abspam[i];
                if (dev->absmax[j] == dev->absmin[j]) {