From: José Expósito Date: Wed, 29 Dec 2021 17:17:02 +0000 (+0100) Subject: wheel: allow to scroll while middle button is pressed X-Git-Tag: 1.19.901~7 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=cf6c97119fa7e076db9b8525313c61bf698d4bee;p=platform%2Fupstream%2Flibinput.git wheel: allow to scroll while middle button is pressed Since cd4f2f32b57a ("fallback: disable mouse scroll wheel while middle button is pressed") the mouse wheel is inhibited while the mouse wheel is pressed. The original intention of this feature was to avoid unintended scroll while pressing the scroll wheel. However, now that high-resolution scroll is fully integrated in libinput we can improve this feature and filter unintended scroll (below half a detent) and allow it when it is intended (over half a detent). Remove the "WHEEL_STATE_PRESSED" state from the wheel state machine and let the general heuristics handle this case. Also, remove the specific tests for this feature as now it is covered by the general test cases. Signed-off-by: José Expósito --- diff --git a/src/evdev-fallback.c b/src/evdev-fallback.c index 28d5de9..97cf487 100644 --- a/src/evdev-fallback.c +++ b/src/evdev-fallback.c @@ -68,8 +68,6 @@ fallback_notify_physical_button(struct fallback_dispatch *dispatch, int button, enum libinput_button_state state) { - fallback_wheel_notify_physical_button(dispatch, device, time, - button, state); evdev_pointer_notify_physical_button(device, time, button, state); } diff --git a/src/evdev-fallback.h b/src/evdev-fallback.h index 0c2f65c..48be42a 100644 --- a/src/evdev-fallback.h +++ b/src/evdev-fallback.h @@ -61,7 +61,6 @@ enum palm_state { enum wheel_state { WHEEL_STATE_NONE, - WHEEL_STATE_PRESSED, WHEEL_STATE_ACCUMULATING_SCROLL, WHEEL_STATE_SCROLLING, }; @@ -281,13 +280,6 @@ fallback_init_wheel(struct fallback_dispatch *dispatch, struct evdev_device *device); void -fallback_wheel_notify_physical_button(struct fallback_dispatch *dispatch, - struct evdev_device *device, - uint64_t time, - int button, - enum libinput_button_state state); - -void fallback_wheel_process_relative(struct fallback_dispatch *dispatch, struct evdev_device *device, struct input_event *e, uint64_t time); diff --git a/src/evdev-wheel.c b/src/evdev-wheel.c index 36db281..69984c9 100644 --- a/src/evdev-wheel.c +++ b/src/evdev-wheel.c @@ -34,8 +34,6 @@ #define WHEEL_SCROLL_TIMEOUT ms2us(500) enum wheel_event { - WHEEL_EVENT_PRESS, - WHEEL_EVENT_RELEASE, WHEEL_EVENT_SCROLL_ACCUMULATED, WHEEL_EVENT_SCROLL, WHEEL_EVENT_SCROLL_TIMEOUT, @@ -47,7 +45,6 @@ wheel_state_to_str(enum wheel_state state) { switch(state) { CASE_RETURN_STRING(WHEEL_STATE_NONE); - CASE_RETURN_STRING(WHEEL_STATE_PRESSED); CASE_RETURN_STRING(WHEEL_STATE_ACCUMULATING_SCROLL); CASE_RETURN_STRING(WHEEL_STATE_SCROLLING); } @@ -58,8 +55,6 @@ static inline const char* wheel_event_to_str(enum wheel_event event) { switch(event) { - CASE_RETURN_STRING(WHEEL_EVENT_PRESS); - CASE_RETURN_STRING(WHEEL_EVENT_RELEASE); CASE_RETURN_STRING(WHEEL_EVENT_SCROLL_ACCUMULATED); CASE_RETURN_STRING(WHEEL_EVENT_SCROLL); CASE_RETURN_STRING(WHEEL_EVENT_SCROLL_TIMEOUT); @@ -96,36 +91,11 @@ wheel_handle_event_on_state_none(struct fallback_dispatch *dispatch, uint64_t time) { switch (event) { - case WHEEL_EVENT_PRESS: - dispatch->wheel.state = WHEEL_STATE_PRESSED; - break; case WHEEL_EVENT_SCROLL: dispatch->wheel.state = WHEEL_STATE_ACCUMULATING_SCROLL; break; case WHEEL_EVENT_SCROLL_DIR_CHANGED: break; - case WHEEL_EVENT_RELEASE: - case WHEEL_EVENT_SCROLL_ACCUMULATED: - case WHEEL_EVENT_SCROLL_TIMEOUT: - log_wheel_bug(dispatch, event); - break; - } -} - -static void -wheel_handle_event_on_state_pressed(struct fallback_dispatch *dispatch, - enum wheel_event event, - uint64_t time) -{ - switch (event) { - case WHEEL_EVENT_RELEASE: - dispatch->wheel.state = WHEEL_STATE_NONE; - break; - case WHEEL_EVENT_SCROLL: - case WHEEL_EVENT_SCROLL_DIR_CHANGED: - /* Ignore scroll while the wheel is pressed */ - break; - case WHEEL_EVENT_PRESS: case WHEEL_EVENT_SCROLL_ACCUMULATED: case WHEEL_EVENT_SCROLL_TIMEOUT: log_wheel_bug(dispatch, event); @@ -139,9 +109,6 @@ wheel_handle_event_on_state_accumulating_scroll(struct fallback_dispatch *dispat uint64_t time) { switch (event) { - case WHEEL_EVENT_PRESS: - dispatch->wheel.state = WHEEL_STATE_PRESSED; - break; case WHEEL_EVENT_SCROLL_ACCUMULATED: dispatch->wheel.state = WHEEL_STATE_SCROLLING; wheel_set_scroll_timer(dispatch, time); @@ -152,7 +119,6 @@ wheel_handle_event_on_state_accumulating_scroll(struct fallback_dispatch *dispat case WHEEL_EVENT_SCROLL_DIR_CHANGED: dispatch->wheel.state = WHEEL_STATE_NONE; break; - case WHEEL_EVENT_RELEASE: case WHEEL_EVENT_SCROLL_TIMEOUT: log_wheel_bug(dispatch, event); break; @@ -165,10 +131,6 @@ wheel_handle_event_on_state_scrolling(struct fallback_dispatch *dispatch, uint64_t time) { switch (event) { - case WHEEL_EVENT_PRESS: - dispatch->wheel.state = WHEEL_STATE_PRESSED; - wheel_cancel_scroll_timer(dispatch); - break; case WHEEL_EVENT_SCROLL: wheel_cancel_scroll_timer(dispatch); wheel_set_scroll_timer(dispatch, time); @@ -180,7 +142,6 @@ wheel_handle_event_on_state_scrolling(struct fallback_dispatch *dispatch, wheel_cancel_scroll_timer(dispatch); dispatch->wheel.state = WHEEL_STATE_NONE; break; - case WHEEL_EVENT_RELEASE: case WHEEL_EVENT_SCROLL_ACCUMULATED: log_wheel_bug(dispatch, event); break; @@ -198,9 +159,6 @@ wheel_handle_event(struct fallback_dispatch *dispatch, case WHEEL_STATE_NONE: wheel_handle_event_on_state_none(dispatch, event, time); break; - case WHEEL_STATE_PRESSED: - wheel_handle_event_on_state_pressed(dispatch, event, time); - break; case WHEEL_STATE_ACCUMULATING_SCROLL: wheel_handle_event_on_state_accumulating_scroll(dispatch, event, @@ -310,17 +268,6 @@ wheel_handle_state_none(struct fallback_dispatch *dispatch, } static void -wheel_handle_state_pressed(struct fallback_dispatch *dispatch, - struct evdev_device *device, - uint64_t time) -{ - dispatch->wheel.hi_res.x = 0; - dispatch->wheel.hi_res.y = 0; - dispatch->wheel.lo_res.x = 0; - dispatch->wheel.lo_res.y = 0; -} - -static void wheel_handle_state_accumulating_scroll(struct fallback_dispatch *dispatch, struct evdev_device *device, uint64_t time) @@ -404,21 +351,6 @@ fallback_wheel_process_relative(struct fallback_dispatch *dispatch, } void -fallback_wheel_notify_physical_button(struct fallback_dispatch *dispatch, - struct evdev_device *device, - uint64_t time, - int button, - enum libinput_button_state state) -{ - if (button == BTN_MIDDLE) { - if (state == LIBINPUT_BUTTON_STATE_PRESSED) - wheel_handle_event(dispatch, WHEEL_EVENT_PRESS, time); - else - wheel_handle_event(dispatch, WHEEL_EVENT_RELEASE, time); - } -} - -void fallback_wheel_handle_state(struct fallback_dispatch *dispatch, struct evdev_device *device, uint64_t time) @@ -442,9 +374,6 @@ fallback_wheel_handle_state(struct fallback_dispatch *dispatch, case WHEEL_STATE_NONE: wheel_handle_state_none(dispatch, device, time); break; - case WHEEL_STATE_PRESSED: - wheel_handle_state_pressed(dispatch, device, time); - break; case WHEEL_STATE_ACCUMULATING_SCROLL: wheel_handle_state_accumulating_scroll(dispatch, device, time); break; diff --git a/test/test-pointer.c b/test/test-pointer.c index 4e38385..e5043ed 100644 --- a/test/test-pointer.c +++ b/test/test-pointer.c @@ -701,54 +701,6 @@ START_TEST(pointer_scroll_wheel) } END_TEST -START_TEST(pointer_scroll_wheel_pressed_noscroll) -{ - struct litest_device *dev = litest_current_device(); - struct libinput *li = dev->libinput; - - litest_drain_events(li); - - litest_button_click_debounced(dev, li, BTN_MIDDLE, true); - litest_drain_events(li); - - for (int i = 0; i < 10; i++) { - litest_event(dev, EV_REL, REL_WHEEL, 1); - litest_event(dev, EV_REL, REL_HWHEEL, 1); - litest_event(dev, EV_SYN, SYN_REPORT, 0); - } - - libinput_dispatch(li); - - litest_assert_empty_queue(li); - - litest_button_click_debounced(dev, li, BTN_MIDDLE, false); -} -END_TEST - -START_TEST(pointer_scroll_hi_res_wheel_pressed_noscroll) -{ - struct litest_device *dev = litest_current_device(); - struct libinput *li = dev->libinput; - - litest_drain_events(li); - - litest_button_click_debounced(dev, li, BTN_MIDDLE, true); - litest_drain_events(li); - - for (int i = 0; i < 10; i++) { - litest_event(dev, EV_REL, REL_WHEEL_HI_RES, 12); - litest_event(dev, EV_REL, REL_HWHEEL_HI_RES, 12); - litest_event(dev, EV_SYN, SYN_REPORT, 0); - } - - libinput_dispatch(li); - - litest_assert_empty_queue(li); - - litest_button_click_debounced(dev, li, BTN_MIDDLE, false); -} -END_TEST - static void test_hi_res_wheel_event(struct litest_device *dev, int which, int v120_amount) { @@ -3575,8 +3527,6 @@ TEST_COLLECTION(pointer) litest_add_for_device(pointer_button_has_no_button, LITEST_KEYBOARD); litest_add(pointer_recover_from_lost_button_count, LITEST_BUTTON, LITEST_CLICKPAD); litest_add(pointer_scroll_wheel, LITEST_WHEEL, LITEST_TABLET); - litest_add_for_device(pointer_scroll_wheel_pressed_noscroll, LITEST_MOUSE); - litest_add_for_device(pointer_scroll_hi_res_wheel_pressed_noscroll, LITEST_MOUSE); litest_add(pointer_scroll_wheel_hires, LITEST_WHEEL, LITEST_TABLET); litest_add(pointer_scroll_wheel_hires_send_only_lores_vertical, LITEST_WHEEL, LITEST_TABLET); litest_add(pointer_scroll_wheel_hires_send_only_lores_horizontal, LITEST_WHEEL, LITEST_TABLET);