X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=linux%2Fin_evdev.c;h=8a002960c17f74f80ef75cb8d6f7ca11fa63b420;hb=f6eaae4f09c6abab99692900a31c1df2a06b99af;hp=6eea20a8d6c02f70940704f98af66056c386ac5d;hpb=0d6fbb2c33a0b9eee5fcc1162f5c799bdae9e89a;p=libpicofe.git diff --git a/linux/in_evdev.c b/linux/in_evdev.c index 6eea20a..8a00296 100644 --- a/linux/in_evdev.c +++ b/linux/in_evdev.c @@ -126,11 +126,17 @@ static const char * const in_evdev_keys[KEY_CNT] = { static void in_evdev_probe(void) { + long keybits[KEY_CNT / sizeof(long) / 8]; + long absbits[(ABS_MAX+1) / sizeof(long) / 8]; int i; + // the kernel might support and return less keys then we know about, + // so make sure the buffers are clear. + memset(keybits, 0, sizeof(keybits)); + memset(absbits, 0, sizeof(absbits)); + for (i = 0;; i++) { - int keybits[KEY_CNT / sizeof(int)], absbits[(ABS_MAX+1)/sizeof(int)]; int support = 0, count = 0; in_evdev_t *dev; int u, ret, fd; @@ -256,7 +262,7 @@ int in_evdev_update(void *drv_data, const int *binds, int *result) int rd, ret, u; if (dev->kbits == NULL) { - ret = ioctl(dev->fd, EVIOCGKEY(sizeof(keybits)), keybits); + ret = ioctl(dev->fd, EVIOCGKEY(sizeof(keybits_)), keybits_); if (ret == -1) { perror("in_evdev: ioctl failed"); return -1; @@ -317,6 +323,16 @@ static void in_evdev_set_blocking(void *drv_data, int y) perror("in_evdev: F_GETFL fcntl failed"); return; } + + if (flags & O_NONBLOCK) { + /* flush the event queue */ + struct input_event ev; + do { + ret = read(dev->fd, &ev, sizeof(ev)); + } + while (ret == sizeof(ev)); + } + if (y) flags &= ~O_NONBLOCK; else @@ -395,16 +411,20 @@ static const struct { { KEY_LEFT, PBTN_LEFT }, { KEY_RIGHT, PBTN_RIGHT }, { KEY_ENTER, PBTN_MOK }, - { BTN_A, PBTN_MOK }, + { KEY_END, PBTN_MOK }, { BTN_TRIGGER, PBTN_MOK }, { KEY_ESC, PBTN_MBACK }, - { BTN_B, PBTN_MBACK }, + { KEY_PAGEDOWN, PBTN_MBACK }, { BTN_THUMB, PBTN_MBACK }, { KEY_A, PBTN_MA2 }, + { KEY_HOME, PBTN_MA2 }, { KEY_S, PBTN_MA3 }, + { KEY_PAGEUP, PBTN_MA3 }, { KEY_BACKSLASH, PBTN_MENU }, - { KEY_MENU, PBTN_MENU }, + { KEY_LEFTCTRL, PBTN_MENU }, + { KEY_RIGHTSHIFT, PBTN_L }, { KEY_LEFTBRACE, PBTN_L }, + { KEY_RIGHTCTRL, PBTN_R }, { KEY_RIGHTBRACE, PBTN_R }, }; @@ -467,15 +487,16 @@ static const struct { { KEY_LEFT, IN_BINDTYPE_PLAYER12, 2 }, { KEY_RIGHT, IN_BINDTYPE_PLAYER12, 3 }, { KEY_S, IN_BINDTYPE_PLAYER12, 4 }, /* B */ - { BTN_B, IN_BINDTYPE_PLAYER12, 4 }, + { KEY_PAGEDOWN, IN_BINDTYPE_PLAYER12, 4 }, { KEY_D, IN_BINDTYPE_PLAYER12, 5 }, /* C */ - { BTN_A, IN_BINDTYPE_PLAYER12, 5 }, + { KEY_END, IN_BINDTYPE_PLAYER12, 5 }, { KEY_A, IN_BINDTYPE_PLAYER12, 6 }, /* A */ - { BTN_Y, IN_BINDTYPE_PLAYER12, 6 }, + { KEY_HOME, IN_BINDTYPE_PLAYER12, 6 }, { KEY_ENTER, IN_BINDTYPE_PLAYER12, 7 }, - { BTN_START, IN_BINDTYPE_PLAYER12, 7 }, - { BTN_TL, IN_BINDTYPE_EMU, PEVB_STATE_LOAD }, - { BTN_TR, IN_BINDTYPE_EMU, PEVB_STATE_SAVE }, + { KEY_LEFTALT, IN_BINDTYPE_PLAYER12, 7 }, + { KEY_RIGHTSHIFT,IN_BINDTYPE_EMU, PEVB_STATE_SAVE }, + { KEY_RIGHTCTRL, IN_BINDTYPE_EMU, PEVB_STATE_LOAD }, + { KEY_LEFTCTRL, IN_BINDTYPE_EMU, PEVB_MENU }, }; #define DEF_BIND_COUNT (sizeof(in_evdev_def_binds) / sizeof(in_evdev_def_binds[0]))