X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=platform%2Flinux%2Fin_evdev.c;h=df4036831cf56967381267dcc70d6e825f8d5fc8;hb=d08e73261434dd37ec156d37094be98ceb6944c0;hp=4e23677e0421333a58243a1d3fff16e0409b3257;hpb=370d5805173cf2a3a3739b4245e6a27a47dd51d2;p=picodrive.git diff --git a/platform/linux/in_evdev.c b/platform/linux/in_evdev.c index 4e23677..df40368 100644 --- a/platform/linux/in_evdev.c +++ b/platform/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; @@ -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