evdev: write EV_SYN input_event along with led events to device
authorRolf Morel <rolfmorel@gmail.com>
Fri, 9 Aug 2013 14:32:17 +0000 (16:32 +0200)
committerKristian Høgsberg <krh@bitplanet.net>
Tue, 13 Aug 2013 05:23:13 +0000 (22:23 -0700)
Other clients of an evdev device need to have the events they receive
be separated, in moment in time, from other events by an EV_SYN/
SYN_REPORT. This is the responsibility of the client who writes events
into the stream.

src/evdev.c

index 2018e2a..2966b61 100644 (file)
@@ -45,7 +45,7 @@ evdev_led_update(struct evdev_device *device, enum weston_led leds)
                { LED_CAPS_LOCK, LED_CAPSL },
                { LED_SCROLL_LOCK, LED_SCROLLL },
        };
-       struct input_event ev[ARRAY_LENGTH(map)];
+       struct input_event ev[ARRAY_LENGTH(map) + 1];
        unsigned int i;
 
        if (!device->caps & EVDEV_KEYBOARD)
@@ -57,6 +57,8 @@ evdev_led_update(struct evdev_device *device, enum weston_led leds)
                ev[i].code = map[i].evdev;
                ev[i].value = !!(leds & map[i].weston);
        }
+       ev[i].type = EV_SYN;
+       ev[i].code = SYN_REPORT;
 
        i = write(device->fd, ev, sizeof ev);
        (void)i; /* no, we really don't care about the return value */