}
hw_set_key_down(dispatch, e->code, e->value);
+
+ switch (type) {
+ case KEY_TYPE_NONE:
+ break;
+ case KEY_TYPE_KEY:
+ fallback_keyboard_notify_key(
+ dispatch,
+ device,
+ time,
+ e->code,
+ e->value ? LIBINPUT_KEY_STATE_PRESSED :
+ LIBINPUT_KEY_STATE_RELEASED);
+ break;
+ case KEY_TYPE_BUTTON:
+ break;
+ }
}
static void
if (dispatch->pending_event & EVDEV_KEY) {
bool want_debounce = false;
for (unsigned int code = 0; code <= KEY_MAX; code++) {
- bool new_state;
-
if (!hw_key_has_changed(dispatch, code))
continue;
- new_state = hw_is_key_down(dispatch, code);
-
- switch (get_key_type(code)) {
- case KEY_TYPE_NONE:
- break;
- case KEY_TYPE_KEY:
- fallback_keyboard_notify_key(
- dispatch,
- device,
- time,
- code,
- new_state ?
- LIBINPUT_KEY_STATE_PRESSED :
- LIBINPUT_KEY_STATE_RELEASED);
- break;
- case KEY_TYPE_BUTTON:
+ if (get_key_type(code) == KEY_TYPE_BUTTON) {
want_debounce = true;
break;
}
}
END_TEST
+START_TEST(keyboard_frame_order)
+{
+ struct litest_device *dev = litest_current_device();
+ struct libinput *li = dev->libinput;
+
+ if (!libevdev_has_event_code(dev->evdev, EV_KEY, KEY_A) ||
+ !libevdev_has_event_code(dev->evdev, EV_KEY, KEY_LEFTSHIFT))
+ return;
+
+ litest_drain_events(li);
+
+ litest_event(dev, EV_KEY, KEY_LEFTSHIFT, 1);
+ litest_event(dev, EV_KEY, KEY_A, 1);
+ litest_event(dev, EV_SYN, SYN_REPORT, 0);
+ libinput_dispatch(li);
+
+ litest_assert_key_event(li,
+ KEY_LEFTSHIFT,
+ LIBINPUT_KEY_STATE_PRESSED);
+ litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_PRESSED);
+
+ litest_event(dev, EV_KEY, KEY_LEFTSHIFT, 0);
+ litest_event(dev, EV_KEY, KEY_A, 0);
+ litest_event(dev, EV_SYN, SYN_REPORT, 0);
+ libinput_dispatch(li);
+
+ litest_assert_key_event(li,
+ KEY_LEFTSHIFT,
+ LIBINPUT_KEY_STATE_RELEASED);
+ litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_RELEASED);
+
+ litest_event(dev, EV_KEY, KEY_A, 1);
+ litest_event(dev, EV_KEY, KEY_LEFTSHIFT, 1);
+ litest_event(dev, EV_SYN, SYN_REPORT, 0);
+ libinput_dispatch(li);
+
+ litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_PRESSED);
+ litest_assert_key_event(li,
+ KEY_LEFTSHIFT,
+ LIBINPUT_KEY_STATE_PRESSED);
+
+ litest_event(dev, EV_KEY, KEY_A, 0);
+ litest_event(dev, EV_KEY, KEY_LEFTSHIFT, 0);
+ litest_event(dev, EV_SYN, SYN_REPORT, 0);
+ libinput_dispatch(li);
+
+ litest_assert_key_event(li, KEY_A, LIBINPUT_KEY_STATE_RELEASED);
+ litest_assert_key_event(li,
+ KEY_LEFTSHIFT,
+ LIBINPUT_KEY_STATE_RELEASED);
+
+ libinput_dispatch(li);
+}
+END_TEST
+
START_TEST(keyboard_leds)
{
struct litest_device *dev = litest_current_device();
litest_add("keyboard:time", keyboard_time_usec, LITEST_KEYS, LITEST_ANY);
litest_add("keyboard:events", keyboard_no_buttons, LITEST_KEYS, LITEST_ANY);
+ litest_add("keyboard:events", keyboard_frame_order, LITEST_KEYS, LITEST_ANY);
litest_add("keyboard:leds", keyboard_leds, LITEST_ANY, LITEST_ANY);