notaz.gp2x.de
/
picodrive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
bugfixes
[picodrive.git]
/
platform
/
linux
/
in_evdev.c
diff --git
a/platform/linux/in_evdev.c
b/platform/linux/in_evdev.c
index
6eea20a
..
df40368
100644
(file)
--- 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)
{
static void in_evdev_probe(void)
{
+ long keybits[KEY_CNT / sizeof(long) / 8];
+ long absbits[(ABS_MAX+1) / sizeof(long) / 8];
int i;
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++)
{
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;
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) {
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;
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;
}
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
if (y)
flags &= ~O_NONBLOCK;
else