From 160e4a4d8a05850e279520b18e02b1d1a99fa8dba330e73b3d7c6a52f9dcaf2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Lie?= Date: Thu, 7 Apr 2016 22:35:39 +0000 Subject: [PATCH] Accepting request 386037 from home:Zaitor:branches:GNOME:Next Add 2 bugfix commits from the stable branch upstream. OBS-URL: https://build.opensuse.org/request/show/386037 OBS-URL: https://build.opensuse.org/package/show/X11:Wayland/libinput?expand=0&rev=70 --- libinput-touchpad-fixes.patch | 259 ++++++++++++++++++++++++++++++++++ libinput.changes | 7 + libinput.spec | 3 + 3 files changed, 269 insertions(+) create mode 100644 libinput-touchpad-fixes.patch diff --git a/libinput-touchpad-fixes.patch b/libinput-touchpad-fixes.patch new file mode 100644 index 0000000..9252883 --- /dev/null +++ b/libinput-touchpad-fixes.patch @@ -0,0 +1,259 @@ +From 915cd9d9999373aecf3285cba7ead3126c1fdb3d Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Wed, 30 Mar 2016 15:31:07 +1000 +Subject: touchpad: fix left-handed top software trackpoint buttons + +The previous code would swap the top software buttons depending on the +touchpad's left-handed setting, not the trackpoint setting. Changing both +devices to left-handed resulted in a double-swap, i.e. the trackpoint was +always right-handed. + +https://bugs.freedesktop.org/show_bug.cgi?id=94733 + +Signed-off-by: Peter Hutterer +Reviewed-by: Hans de Goede +(cherry picked from commit 1ecf6d7a607c5f481eb9b3b6365d7b55a0f18c53) + +diff --git a/src/evdev-mt-touchpad-buttons.c b/src/evdev-mt-touchpad-buttons.c +index 82c99c7..076eab0 100644 +--- a/src/evdev-mt-touchpad-buttons.c ++++ b/src/evdev-mt-touchpad-buttons.c +@@ -963,6 +963,7 @@ tp_post_clickpadbutton_buttons(struct tp_dispatch *tp, uint64_t time) + uint32_t current, old, button, is_top; + enum libinput_button_state state; + enum { AREA = 0x01, LEFT = 0x02, MIDDLE = 0x04, RIGHT = 0x08 }; ++ bool want_left_handed = true; + + current = tp->buttons.state; + old = tp->buttons.old_state; +@@ -1008,14 +1009,22 @@ tp_post_clickpadbutton_buttons(struct tp_dispatch *tp, uint64_t time) + return 0; + } + +- if ((area & MIDDLE) || ((area & LEFT) && (area & RIGHT))) +- button = evdev_to_left_handed(tp->device, BTN_MIDDLE); +- else if (area & RIGHT) +- button = evdev_to_left_handed(tp->device, BTN_RIGHT); +- else if (area & LEFT) +- button = evdev_to_left_handed(tp->device, BTN_LEFT); +- else /* main or no area (for clickfinger) is always BTN_LEFT */ ++ if ((area & MIDDLE) || ((area & LEFT) && (area & RIGHT))) { ++ button = BTN_MIDDLE; ++ } else if (area & RIGHT) { ++ button = BTN_RIGHT; ++ } else if (area & LEFT) { + button = BTN_LEFT; ++ } else { /* main or no area (for clickfinger) is always BTN_LEFT */ ++ button = BTN_LEFT; ++ want_left_handed = false; ++ } ++ ++ if (is_top) ++ want_left_handed = false; ++ ++ if (want_left_handed) ++ button = evdev_to_left_handed(tp->device, button); + + tp->buttons.active = button; + tp->buttons.active_is_topbutton = is_top; +diff --git a/test/trackpoint.c b/test/trackpoint.c +index 567fba8..5a68b19 100644 +--- a/test/trackpoint.c ++++ b/test/trackpoint.c +@@ -150,6 +150,135 @@ START_TEST(trackpoint_scroll_source) + } + END_TEST + ++START_TEST(trackpoint_topsoftbuttons_left_handed_trackpoint) ++{ ++ struct litest_device *touchpad = litest_current_device(); ++ struct litest_device *trackpoint; ++ struct libinput *li = touchpad->libinput; ++ enum libinput_config_status status; ++ struct libinput_event *event; ++ struct libinput_device *device; ++ ++ trackpoint = litest_add_device(li, LITEST_TRACKPOINT); ++ litest_drain_events(li); ++ /* touchpad right-handed, trackpoint left-handed */ ++ status = libinput_device_config_left_handed_set( ++ trackpoint->libinput_device, 1); ++ ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); ++ ++ litest_touch_down(touchpad, 0, 5, 5); ++ libinput_dispatch(li); ++ litest_button_click(touchpad, BTN_LEFT, true); ++ libinput_dispatch(li); ++ ++ event = libinput_get_event(li); ++ litest_is_button_event(event, ++ BTN_RIGHT, ++ LIBINPUT_BUTTON_STATE_PRESSED); ++ device = libinput_event_get_device(event); ++ ck_assert(device == trackpoint->libinput_device); ++ libinput_event_destroy(event); ++ ++ litest_button_click(touchpad, BTN_LEFT, false); ++ libinput_dispatch(li); ++ event = libinput_get_event(li); ++ litest_is_button_event(event, ++ BTN_RIGHT, ++ LIBINPUT_BUTTON_STATE_RELEASED); ++ device = libinput_event_get_device(event); ++ ck_assert(device == trackpoint->libinput_device); ++ libinput_event_destroy(event); ++ ++ litest_delete_device(trackpoint); ++} ++END_TEST ++ ++START_TEST(trackpoint_topsoftbuttons_left_handed_touchpad) ++{ ++ struct litest_device *touchpad = litest_current_device(); ++ struct litest_device *trackpoint; ++ struct libinput *li = touchpad->libinput; ++ enum libinput_config_status status; ++ struct libinput_event *event; ++ struct libinput_device *device; ++ ++ trackpoint = litest_add_device(li, LITEST_TRACKPOINT); ++ litest_drain_events(li); ++ /* touchpad left-handed, trackpoint right-handed */ ++ status = libinput_device_config_left_handed_set( ++ touchpad->libinput_device, 1); ++ ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); ++ ++ litest_touch_down(touchpad, 0, 5, 5); ++ libinput_dispatch(li); ++ litest_button_click(touchpad, BTN_LEFT, true); ++ libinput_dispatch(li); ++ ++ event = libinput_get_event(li); ++ litest_is_button_event(event, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED); ++ device = libinput_event_get_device(event); ++ ck_assert(device == trackpoint->libinput_device); ++ libinput_event_destroy(event); ++ ++ litest_button_click(touchpad, BTN_LEFT, false); ++ libinput_dispatch(li); ++ event = libinput_get_event(li); ++ litest_is_button_event(event, ++ BTN_LEFT, ++ LIBINPUT_BUTTON_STATE_RELEASED); ++ device = libinput_event_get_device(event); ++ ck_assert(device == trackpoint->libinput_device); ++ libinput_event_destroy(event); ++ ++ litest_delete_device(trackpoint); ++} ++END_TEST ++ ++START_TEST(trackpoint_topsoftbuttons_left_handed_both) ++{ ++ struct litest_device *touchpad = litest_current_device(); ++ struct litest_device *trackpoint; ++ struct libinput *li = touchpad->libinput; ++ enum libinput_config_status status; ++ struct libinput_event *event; ++ struct libinput_device *device; ++ ++ trackpoint = litest_add_device(li, LITEST_TRACKPOINT); ++ litest_drain_events(li); ++ /* touchpad left-handed, trackpoint left-handed */ ++ status = libinput_device_config_left_handed_set( ++ touchpad->libinput_device, 1); ++ ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); ++ status = libinput_device_config_left_handed_set( ++ trackpoint->libinput_device, 1); ++ ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); ++ ++ litest_touch_down(touchpad, 0, 5, 5); ++ libinput_dispatch(li); ++ litest_button_click(touchpad, BTN_LEFT, true); ++ libinput_dispatch(li); ++ ++ event = libinput_get_event(li); ++ litest_is_button_event(event, ++ BTN_RIGHT, ++ LIBINPUT_BUTTON_STATE_PRESSED); ++ device = libinput_event_get_device(event); ++ ck_assert(device == trackpoint->libinput_device); ++ libinput_event_destroy(event); ++ ++ litest_button_click(touchpad, BTN_LEFT, false); ++ libinput_dispatch(li); ++ event = libinput_get_event(li); ++ litest_is_button_event(event, ++ BTN_RIGHT, ++ LIBINPUT_BUTTON_STATE_RELEASED); ++ device = libinput_event_get_device(event); ++ ck_assert(device == trackpoint->libinput_device); ++ libinput_event_destroy(event); ++ ++ litest_delete_device(trackpoint); ++} ++END_TEST + void + litest_setup_tests(void) + { +@@ -157,4 +286,7 @@ litest_setup_tests(void) + litest_add("trackpoint:middlebutton", trackpoint_middlebutton_noscroll, LITEST_POINTINGSTICK, LITEST_ANY); + litest_add("trackpoint:scroll", trackpoint_scroll, LITEST_POINTINGSTICK, LITEST_ANY); + litest_add("trackpoint:scroll", trackpoint_scroll_source, LITEST_POINTINGSTICK, LITEST_ANY); ++ litest_add("trackpoint:left-handed", trackpoint_topsoftbuttons_left_handed_trackpoint, LITEST_TOPBUTTONPAD, LITEST_ANY); ++ litest_add("trackpoint:left-handed", trackpoint_topsoftbuttons_left_handed_touchpad, LITEST_TOPBUTTONPAD, LITEST_ANY); ++ litest_add("trackpoint:left-handed", trackpoint_topsoftbuttons_left_handed_both, LITEST_TOPBUTTONPAD, LITEST_ANY); + } +-- +cgit v0.10.2 + + +From 2253cf69cbf6861003c2c8396bf0cc11fbd83612 Mon Sep 17 00:00:00 2001 +From: Peter Hutterer +Date: Tue, 29 Mar 2016 13:34:00 +1000 +Subject: touchpad: only post motion events if we have motion + +Because our delta calculation factors in previous events on touchpads (to +reduce jitter) we may get a nonzero delta if we have an event that doesn't +actually change x or y. + +Drop the t->dirty workaround introduced in a608d9d, an event that virtually +disappears can mess up our state machines. + +Signed-off-by: Peter Hutterer +Reviewed-by: Hans de Goede +(cherry picked from commit bc17185f426dae7a1ea4df6ba3459083c2d51f9b) + +diff --git a/src/evdev-mt-touchpad-gestures.c b/src/evdev-mt-touchpad-gestures.c +index 3c8f5a7..7bbd3b8 100644 +--- a/src/evdev-mt-touchpad-gestures.c ++++ b/src/evdev-mt-touchpad-gestures.c +@@ -500,7 +500,8 @@ tp_gesture_post_events(struct tp_dispatch *tp, uint64_t time) + + switch (tp->gesture.finger_count) { + case 1: +- tp_gesture_post_pointer_motion(tp, time); ++ if (tp->queued & TOUCHPAD_EVENT_MOTION) ++ tp_gesture_post_pointer_motion(tp, time); + break; + case 2: + case 3: +diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c +index d0a8e27..082493c 100644 +--- a/src/evdev-mt-touchpad.c ++++ b/src/evdev-mt-touchpad.c +@@ -904,10 +904,7 @@ tp_need_motion_history_reset(struct tp_dispatch *tp, uint64_t time) + if (tp->device->model_flags & EVDEV_MODEL_LENOVO_T450_TOUCHPAD) { + if (tp->queued & TOUCHPAD_EVENT_MOTION) { + if (tp->quirks.nonmotion_event_count > 10) { +- struct tp_touch *t; +- +- tp_for_each_touch(tp, t) +- t->dirty = false; ++ tp->queued &= ~TOUCHPAD_EVENT_MOTION; + rc = true; + } + tp->quirks.nonmotion_event_count = 0; +-- +cgit v0.10.2 + diff --git a/libinput.changes b/libinput.changes index ff46e0c..b4be95e 100644 --- a/libinput.changes +++ b/libinput.changes @@ -1,3 +1,10 @@ +------------------------------------------------------------------- +Thu Apr 7 16:07:03 UTC 2016 - zaitor@opensuse.org + +- Add libinput-touchpad-fixes.patch: Fix left-handed top software + trackpoint buttons (fdo#94733), and only post motion events if + we have motion. + ------------------------------------------------------------------- Fri Mar 18 20:05:35 UTC 2016 - zaitor@opensuse.org diff --git a/libinput.spec b/libinput.spec index be253eb..18c4434 100644 --- a/libinput.spec +++ b/libinput.spec @@ -33,6 +33,8 @@ Source: http://freedesktop.org/software/libinput/%name-%rversion.tar.xz Source2: http://freedesktop.org/software/libinput/%name-%rversion.tar.xz.sig Source3: baselibs.conf Source4: %name.keyring +# PATCH-FIX-UPSTREAM libinput-touchpad-fixes.patch fdo#94733 zaitor@opensuse.org -- Add 2 upstream touchpad fixes. +Patch: libinput-touchpad-fixes.patch #git#BuildRequires: autoconf >= 2.64 #git#BuildRequires: automake >= 1.11 #git#BuildRequires: libtool >= 2.2 @@ -100,6 +102,7 @@ to develop applications that require libinput. %prep %setup -qn %name-%rversion +%patch -p1 %build if [ ! -e configure ]; then