Hello community,

here is the log from the commit of package libinput for openSUSE:Factory 
checked in at 2016-04-11 09:13:45
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libinput (Old)
 and      /work/SRC/openSUSE:Factory/.libinput.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libinput"

Changes:
--------
--- /work/SRC/openSUSE:Factory/libinput/libinput.changes        2016-03-26 
15:09:35.000000000 +0100
+++ /work/SRC/openSUSE:Factory/.libinput.new/libinput.changes   2016-04-11 
09:14:25.000000000 +0200
@@ -1,0 +2,7 @@
+Thu Apr  7 16:07:03 UTC 2016 - [email protected]
+
+- Add libinput-touchpad-fixes.patch: Fix left-handed top software
+  trackpoint buttons (fdo#94733), and only post motion events if
+  we have motion.
+
+-------------------------------------------------------------------

New:
----
  libinput-touchpad-fixes.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ libinput.spec ++++++
--- /var/tmp/diff_new_pack.i82Tty/_old  2016-04-11 09:14:25.000000000 +0200
+++ /var/tmp/diff_new_pack.i82Tty/_new  2016-04-11 09:14:25.000000000 +0200
@@ -33,6 +33,8 @@
 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 
[email protected] -- 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 @@
 
 %prep
 %setup -qn %name-%rversion
+%patch -p1
 
 %build
 if [ ! -e configure ]; then


++++++ libinput-touchpad-fixes.patch ++++++
>From 915cd9d9999373aecf3285cba7ead3126c1fdb3d Mon Sep 17 00:00:00 2001
From: Peter Hutterer <[email protected]>
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 <[email protected]>
Reviewed-by: Hans de Goede <[email protected]>
(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 <[email protected]>
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 <[email protected]>
Reviewed-by: Hans de Goede <[email protected]>
(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


Reply via email to