summaryrefslogtreecommitdiff
path: root/libevdev/libevdev.c
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2013-07-03 14:58:22 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2013-07-03 15:53:50 +1000
commit1527c0056f995aed473524888e79e0dbbdef3bda (patch)
tree8e24eeb632f0e71e65354664454113a4821b44d0 /libevdev/libevdev.c
parent2fa2d4f0d0cd9435158e5704f1e2e955370257c7 (diff)
downloadlibevdev-1527c0056f995aed473524888e79e0dbbdef3bda.tar.gz
Sync the initial slot state from the device
libevdev_get_slot_value() needs to return the correct value from the outset. Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'libevdev/libevdev.c')
-rw-r--r--libevdev/libevdev.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c
index 8d339f4..525f2de 100644
--- a/libevdev/libevdev.c
+++ b/libevdev/libevdev.c
@@ -35,6 +35,8 @@
#define MAXEVENTS 64
+static int sync_mt_state(struct libevdev *dev, int create_events);
+
static int
init_event_queue(struct libevdev *dev)
{
@@ -249,17 +251,20 @@ libevdev_set_fd(struct libevdev* dev, int fd)
}
}
+ dev->fd = fd;
+ sync_mt_state(dev, 0);
+
rc = init_event_queue(dev);
- if (rc < 0)
+ if (rc < 0) {
+ dev->fd = -1;
return -rc;
+ }
/* not copying key state because we won't know when we'll start to
* use this fd and key's are likely to change state by then.
* Same with the valuators, really, but they may not change.
*/
- dev->fd = fd;
-
out:
return rc ? -errno : 0;
}
@@ -339,7 +344,7 @@ out:
}
static int
-sync_mt_state(struct libevdev *dev)
+sync_mt_state(struct libevdev *dev, int create_events)
{
int rc;
int i;
@@ -367,8 +372,11 @@ sync_mt_state(struct libevdev *dev)
int j;
struct input_event *ev;
- ev = queue_push(dev);
- init_event(dev, ev, EV_ABS, ABS_MT_SLOT, i);
+ if (create_events) {
+ ev = queue_push(dev);
+ init_event(dev, ev, EV_ABS, ABS_MT_SLOT, i);
+ }
+
for (j = ABS_MT_MIN; j < ABS_MT_MAX; j++) {
int jdx = j - ABS_MT_MIN;
@@ -381,8 +389,10 @@ sync_mt_state(struct libevdev *dev)
if (dev->mt_slot_vals[i][jdx] == mt_state[jdx].val[i])
continue;
- ev = queue_push(dev);
- init_event(dev, ev, EV_ABS, j, mt_state[jdx].val[i]);
+ if (create_events) {
+ ev = queue_push(dev);
+ init_event(dev, ev, EV_ABS, j, mt_state[jdx].val[i]);
+ }
dev->mt_slot_vals[i][jdx] = mt_state[jdx].val[i];
}
}
@@ -424,7 +434,7 @@ sync_state(struct libevdev *dev)
if (rc == 0 && libevdev_has_event_type(dev, EV_ABS))
rc = sync_abs_state(dev);
if (rc == 0 && libevdev_has_event_code(dev, EV_ABS, ABS_MT_SLOT))
- rc = sync_mt_state(dev);
+ rc = sync_mt_state(dev, 1);
dev->queue_nsync = queue_num_elements(dev);