mirror of
https://gitlab.freedesktop.org/libinput/libinput.git
synced 2025-12-20 16:10:06 +01:00
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>
This commit is contained in:
parent
28fcd2c6d4
commit
8fbdef3aad
2 changed files with 56 additions and 2 deletions
|
|
@ -224,8 +224,11 @@ lid_switch_pair_keyboard(struct evdev_device *lid_switch,
|
||||||
lid_switch->devname,
|
lid_switch->devname,
|
||||||
keyboard->devname);
|
keyboard->devname);
|
||||||
|
|
||||||
/* We don't init the event listener yet - we don't care
|
/* We need to init the event listener now only if the reported state
|
||||||
* about keyboard events until the lid is closed */
|
* is closed. */
|
||||||
|
if (dispatch->lid_is_closed)
|
||||||
|
lid_switch_toggle_keyboard_listener(dispatch,
|
||||||
|
dispatch->lid_is_closed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -505,6 +505,56 @@ START_TEST(lid_update_hw_on_key)
|
||||||
}
|
}
|
||||||
END_TEST
|
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
|
void
|
||||||
litest_setup_tests_lid(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_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, LITEST_LID_SWITCH_SURFACE3);
|
||||||
|
litest_add_for_device("lid:buggy", lid_update_hw_on_key_closed_on_init, LITEST_LID_SWITCH_SURFACE3);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue