summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJosé Expósito <jose.exposito89@gmail.com>2021-12-29 18:17:02 +0100
committerJosé Expósito <jose.exposito89@gmail.com>2021-12-30 08:32:40 +0100
commitcf6c97119fa7e076db9b8525313c61bf698d4bee (patch)
tree374dac89e55bf441c9e7c6e431133745246be4e7
parentcddf956990e8af386ee417d69982698108537cf8 (diff)
downloadlibinput-cf6c97119fa7e076db9b8525313c61bf698d4bee.tar.gz
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 <jose.exposito89@gmail.com>
-rw-r--r--src/evdev-fallback.c2
-rw-r--r--src/evdev-fallback.h8
-rw-r--r--src/evdev-wheel.c71
-rw-r--r--test/test-pointer.c50
4 files changed, 0 insertions, 131 deletions
diff --git a/src/evdev-fallback.c b/src/evdev-fallback.c
index 28d5de99..97cf487d 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 0c2f65cb..48be42a1 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 36db2812..69984c9b 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 4e383858..e5043edf 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);