diff options
author | Benjamin Tissoires <benjamin.tissoires@gmail.com> | 2017-05-19 12:57:23 +0200 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2017-05-23 15:10:10 +1000 |
commit | 8fbdef3aadfaa09dfaec50b0f67ec43ad0b55e96 (patch) | |
tree | 8aa6ffb1cba5ce2eb2d539ccb5bd00d29c6d7035 /test | |
parent | 28fcd2c6d41e972f606c60f56c6f0a94d73455ae (diff) |
lid: setup the keyboard notifier when pairing it
On unreliable LID switches, we might have the LID declared as closed
while it is actually not. We can not wait for the first switch event to setup
the keyboard listener: it will never occur.
https://bugs.freedesktop.org/show_bug.cgi?id=101099
Signed-off-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'test')
-rw-r--r-- | test/test-lid.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/test/test-lid.c b/test/test-lid.c index 1bd75cb..4bf4c05 100644 --- a/test/test-lid.c +++ b/test/test-lid.c @@ -505,6 +505,56 @@ START_TEST(lid_update_hw_on_key) } END_TEST +START_TEST(lid_update_hw_on_key_closed_on_init) +{ + struct litest_device *sw = litest_current_device(); + struct libinput *li; + struct litest_device *keyboard; + struct libevdev *evdev = sw->evdev; + struct input_event ev; + + litest_lid_action(sw, LIBINPUT_SWITCH_STATE_ON); + + /* Make sure kernel state is right */ + libevdev_next_event(evdev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev); + while (libevdev_next_event(evdev, LIBEVDEV_READ_FLAG_SYNC, &ev) >= 0) + ; + ck_assert(libevdev_get_event_value(evdev, EV_SW, SW_LID)); + + keyboard = litest_add_device(sw->libinput, LITEST_KEYBOARD); + + /* separate context for the right state on init */ + li = litest_create_context(); + libinput_path_add_device(li, + libevdev_uinput_get_devnode(sw->uinput)); + libinput_path_add_device(li, + libevdev_uinput_get_devnode(keyboard->uinput)); + + /* don't expect a switch waiting for us */ + while (libinput_next_event_type(li) != LIBINPUT_EVENT_NONE) { + ck_assert_int_ne(libinput_next_event_type(li), + LIBINPUT_EVENT_SWITCH_TOGGLE); + libinput_event_destroy(libinput_get_event(li)); + } + + litest_event(keyboard, EV_KEY, KEY_A, 1); + litest_event(keyboard, EV_SYN, SYN_REPORT, 0); + litest_event(keyboard, EV_KEY, KEY_A, 0); + litest_event(keyboard, EV_SYN, SYN_REPORT, 0); + /* No switch event, we're still in vanilla (open) state */ + litest_assert_only_typed_events(li, LIBINPUT_EVENT_KEYBOARD_KEY); + + /* Make sure kernel state has updated */ + libevdev_next_event(evdev, LIBEVDEV_READ_FLAG_FORCE_SYNC, &ev); + while (libevdev_next_event(evdev, LIBEVDEV_READ_FLAG_SYNC, &ev) >= 0) + ; + ck_assert(!libevdev_get_event_value(evdev, EV_SW, SW_LID)); + + libinput_unref(li); + litest_delete_device(keyboard); +} +END_TEST + void litest_setup_tests_lid(void) { @@ -525,4 +575,5 @@ litest_setup_tests_lid(void) litest_add_no_device("lid:disable_touchpad", lid_suspend_with_touchpad); litest_add_for_device("lid:buggy", lid_update_hw_on_key, LITEST_LID_SWITCH_SURFACE3); + litest_add_for_device("lid:buggy", lid_update_hw_on_key_closed_on_init, LITEST_LID_SWITCH_SURFACE3); } |