configure.ac                                 |    4 
 doc/palm-detection.dox                       |    5 
 doc/svg/edge-scrolling.svg                   |    2 
 doc/svg/twofinger-scrolling.svg              |    2 
 src/evdev-mt-touchpad-gestures.c             |    2 
 src/evdev-mt-touchpad.c                      |    3 
 src/evdev.c                                  |   62 +++--
 src/libinput.c                               |    2 
 test/Makefile.am                             |    2 
 test/gestures.c                              |    8 
 test/litest-device-asus-rog-gladius.c        |  334 +++++++++++++++++++++++++++
 test/litest-device-mouse-wheel-click-angle.c |   74 +++++
 test/litest.c                                |   25 +-
 test/litest.h                                |    2 
 test/pointer.c                               |   34 ++
 test/touchpad.c                              |   77 ++++++
 tools/event-debug.c                          |   18 -
 17 files changed, 613 insertions(+), 43 deletions(-)

New commits:
commit f5d0b9b99b16c3e72b2a6851a14b49a30106cbb9
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Wed Dec 9 09:08:10 2015 +1000

    configure.ac: libinput 1.1.2
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/configure.ac b/configure.ac
index c841a5f..51350bb 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@ AC_PREREQ([2.64])
 
 m4_define([libinput_major_version], [1])
 m4_define([libinput_minor_version], [1])
-m4_define([libinput_micro_version], [1])
+m4_define([libinput_micro_version], [2])
 m4_define([libinput_version],
           
[libinput_major_version.libinput_minor_version.libinput_micro_version])
 
@@ -31,7 +31,7 @@ AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz])
 # b) If interfaces have been changed or added, but binary compatibility has
 #    been preserved, change to C+1:0:A+1
 # c) If the interface is the same as the previous version, change to C:R+1:A
-LIBINPUT_LT_VERSION=16:1:6
+LIBINPUT_LT_VERSION=16:2:6
 AC_SUBST(LIBINPUT_LT_VERSION)
 
 AM_SILENT_RULES([yes])

commit 147162da696715fbe7f9c19b31472c090cedc721
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Fri Dec 4 15:52:17 2015 +1000

    touchpad: don't set the axis for a 0.0 value in a scroll event
    
    Once we trigger diagonal scrolling, the device's scroll direction is set as
    horiz+vert. From then on, both axes will be set on every subsequent scroll
    event, even when the actual delta for an axis is 0.
    
    This causes continuous scroll stop events in clients that care about these
    things.
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
    Reviewed-by: Hans de Goede <hdego...@redhat.com>

diff --git a/src/evdev.c b/src/evdev.c
index 4933185..55641c5 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -2548,9 +2548,16 @@ evdev_post_scroll(struct evdev_device *device,
 
        if (!normalized_is_zero(event)) {
                const struct discrete_coords zero_discrete = { 0.0, 0.0 };
+               uint32_t axes = device->scroll.direction;
+
+               if (event.y == 0.0)
+                       axes &= ~AS_MASK(LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
+               if (event.x == 0.0)
+                       axes &= 
~AS_MASK(LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
+
                evdev_notify_axis(device,
                                  time,
-                                 device->scroll.direction,
+                                 axes,
                                  source,
                                  &event,
                                  &zero_discrete);
diff --git a/test/touchpad.c b/test/touchpad.c
index e024ace..7bc99e9 100644
--- a/test/touchpad.c
+++ b/test/touchpad.c
@@ -144,6 +144,54 @@ START_TEST(touchpad_2fg_scroll)
 }
 END_TEST
 
+START_TEST(touchpad_2fg_scroll_diagonal)
+{
+       struct litest_device *dev = litest_current_device();
+       struct libinput *li = dev->libinput;
+       struct libinput_event *event;
+       struct libinput_event_pointer *ptrev;
+       int i;
+
+       if (!litest_has_2fg_scroll(dev))
+               return;
+
+       litest_enable_2fg_scroll(dev);
+       litest_drain_events(li);
+
+       litest_touch_down(dev, 0, 45, 30);
+       litest_touch_down(dev, 1, 55, 30);
+
+       litest_touch_move_two_touches(dev, 45, 30, 55, 30, 10, 10, 10, 0);
+       libinput_dispatch(li);
+       litest_wait_for_event_of_type(li,
+                                     LIBINPUT_EVENT_POINTER_AXIS,
+                                     -1);
+       litest_drain_events(li);
+
+       /* get rid of any touch history still adding x deltas sideways */
+       for (i = 0; i < 5; i++)
+               litest_touch_move(dev, 0, 55, 41 + i);
+       litest_drain_events(li);
+
+       for (i = 6; i < 10; i++) {
+               litest_touch_move(dev, 0, 55, 41 + i);
+               libinput_dispatch(li);
+
+               event = libinput_get_event(li);
+               ptrev = litest_is_axis_event(event,
+                               LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL,
+                               LIBINPUT_POINTER_AXIS_SOURCE_FINGER);
+               ck_assert(!libinput_event_pointer_has_axis(ptrev,
+                               LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL));
+               libinput_event_destroy(event);
+       }
+
+       litest_touch_up(dev, 1);
+       litest_touch_up(dev, 0);
+       libinput_dispatch(li);
+}
+END_TEST
+
 START_TEST(touchpad_2fg_scroll_slow_distance)
 {
        struct litest_device *dev = litest_current_device();
@@ -3500,6 +3548,7 @@ litest_setup_tests(void)
        litest_add("touchpad:motion", touchpad_2fg_no_motion, LITEST_TOUCHPAD, 
LITEST_SINGLE_TOUCH);
 
        litest_add("touchpad:scroll", touchpad_2fg_scroll, LITEST_TOUCHPAD, 
LITEST_SINGLE_TOUCH);
+       litest_add("touchpad:scroll", touchpad_2fg_scroll_diagonal, 
LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH|LITEST_SEMI_MT);
        litest_add("touchpad:scroll", touchpad_2fg_scroll_slow_distance, 
LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
        litest_add("touchpad:scroll", touchpad_2fg_scroll_return_to_motion, 
LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);
        litest_add("touchpad:scroll", touchpad_2fg_scroll_source, 
LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH);

commit e8f2eb18f0093795a9041fdcbe649abddfce4171
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Mon Dec 7 11:39:52 2015 +1000

    test: always call libinput_dispatch after moving touches
    
    We dont' want to fill up the event queue and cause SYN_DROPPED events.
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
    Reviewed-by: Hans de Goede <hdego...@redhat.com>

diff --git a/test/litest.c b/test/litest.c
index ba3a308..cf9b534 100644
--- a/test/litest.c
+++ b/test/litest.c
@@ -1502,8 +1502,8 @@ litest_touch_move_two_touches(struct litest_device *d,
                if (sleep_ms) {
                        libinput_dispatch(d->libinput);
                        msleep(sleep_ms);
-                       libinput_dispatch(d->libinput);
                }
+               libinput_dispatch(d->libinput);
        }
        litest_touch_move(d, 0, x0 + dx, y0 + dy);
        litest_touch_move(d, 1, x1 + dx, y1 + dy);

commit 3d39dbc3f29fb8727a32a11deca52fcc2902b200
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Fri Dec 4 15:58:16 2015 +1000

    tools: print which scroll axis we have in event-debug
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
    Reviewed-by: Hans de Goede <hdego...@redhat.com>

diff --git a/tools/event-debug.c b/tools/event-debug.c
index c603296..23e6cf9 100644
--- a/tools/event-debug.c
+++ b/tools/event-debug.c
@@ -270,17 +270,23 @@ print_axis_event(struct libinput_event *ev)
 {
        struct libinput_event_pointer *p = libinput_event_get_pointer_event(ev);
        double v = 0, h = 0;
+       const char *have_vert = "",
+                  *have_horiz = "";
 
        if (libinput_event_pointer_has_axis(p,
-                                   LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL))
+                               LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL)) {
                v = libinput_event_pointer_get_axis_value(p,
                              LIBINPUT_POINTER_AXIS_SCROLL_VERTICAL);
+               have_vert = "*";
+       }
        if (libinput_event_pointer_has_axis(p,
-                                   LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL))
+                               LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL)) {
                h = libinput_event_pointer_get_axis_value(p,
                              LIBINPUT_POINTER_AXIS_SCROLL_HORIZONTAL);
+               have_horiz = "*";
+       }
        print_event_time(libinput_event_pointer_get_time(p));
-       printf("vert %.2f horiz %.2f\n", v, h);
+       printf("vert %.2f%s horiz %.2f%s\n", v, have_vert, h, have_horiz);
 }
 
 static void

commit eb1197899e87c51e8c5eb7711659302175732b64
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Wed Dec 2 10:36:30 2015 +1000

    touchpad: don't try to position fake touches when no fingers are down
    
    If all fingers are released in the same frame, we won't be able to find the
    top-most touch.
    
    https://bugs.freedesktop.org/show_bug.cgi?id=93204
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
    Reviewed-by: Hans de Goede <hdego...@redhat.com>

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 8804658..4fba147 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -832,7 +832,8 @@ tp_position_fake_touches(struct tp_dispatch *tp)
        struct tp_touch *topmost = NULL;
        unsigned int start, i;
 
-       if (tp_fake_finger_count(tp) <= tp->num_slots)
+       if (tp_fake_finger_count(tp) <= tp->num_slots ||
+           tp->nfingers_down == 0)
                return;
 
        /* We have at least one fake touch down. Find the top-most real
diff --git a/test/touchpad.c b/test/touchpad.c
index 9f5e5a9..e024ace 100644
--- a/test/touchpad.c
+++ b/test/touchpad.c
@@ -1703,6 +1703,31 @@ START_TEST(touchpad_semi_mt_hover_2fg_1fg_down)
 }
 END_TEST
 
+START_TEST(touchpad_semi_mt_hover_2fg_up)
+{
+       struct litest_device *dev = litest_current_device();
+       struct libinput *li = dev->libinput;
+
+       litest_touch_down(dev, 0, 70, 50);
+       litest_touch_down(dev, 1, 50, 50);
+
+       litest_push_event_frame(dev);
+       litest_touch_move(dev, 0, 72, 50);
+       litest_touch_move(dev, 1, 52, 50);
+       litest_event(dev, EV_KEY, BTN_TOUCH, 0);
+       litest_pop_event_frame(dev);
+
+       litest_event(dev, EV_ABS, ABS_MT_SLOT, 0);
+       litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
+       litest_event(dev, EV_ABS, ABS_MT_SLOT, 1);
+       litest_event(dev, EV_ABS, ABS_MT_TRACKING_ID, -1);
+       litest_event(dev, EV_KEY, BTN_TOOL_DOUBLETAP, 0);
+       litest_event(dev, EV_SYN, SYN_REPORT, 0);
+
+       litest_drain_events(li);
+}
+END_TEST
+
 START_TEST(touchpad_hover_noevent)
 {
        struct litest_device *dev = litest_current_device();
@@ -3521,6 +3546,7 @@ litest_setup_tests(void)
        litest_add_for_device("touchpad:semi-mt-hover", 
touchpad_semi_mt_hover_down_hover_down, LITEST_SYNAPTICS_HOVER_SEMI_MT);
        litest_add_for_device("touchpad:semi-mt-hover", 
touchpad_semi_mt_hover_2fg_noevent, LITEST_SYNAPTICS_HOVER_SEMI_MT);
        litest_add_for_device("touchpad:semi-mt-hover", 
touchpad_semi_mt_hover_2fg_1fg_down, LITEST_SYNAPTICS_HOVER_SEMI_MT);
+       litest_add_for_device("touchpad:semi-mt-hover", 
touchpad_semi_mt_hover_2fg_up, LITEST_SYNAPTICS_HOVER_SEMI_MT);
 
        litest_add("touchpad:hover", touchpad_hover_noevent, 
LITEST_TOUCHPAD|LITEST_HOVER, LITEST_ANY);
        litest_add("touchpad:hover", touchpad_hover_down, 
LITEST_TOUCHPAD|LITEST_HOVER, LITEST_ANY);

commit c42dfb9caddd5088dd5299a762c65de523a5e00e
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Wed Dec 2 09:48:01 2015 +1000

    test: if we're hovering, don't send BTN_TOUCH
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
    Reviewed-by: Hans de Goede <hdego...@redhat.com>

diff --git a/test/litest.c b/test/litest.c
index e235bc9..ba3a308 100644
--- a/test/litest.c
+++ b/test/litest.c
@@ -1317,9 +1317,9 @@ litest_auto_assign_value(struct litest_device *d,
 }
 
 static void
-send_btntool(struct litest_device *d)
+send_btntool(struct litest_device *d, bool hover)
 {
-       litest_event(d, EV_KEY, BTN_TOUCH, d->ntouches_down != 0);
+       litest_event(d, EV_KEY, BTN_TOUCH, d->ntouches_down != 0 && !hover);
        litest_event(d, EV_KEY, BTN_TOOL_FINGER, d->ntouches_down == 1);
        litest_event(d, EV_KEY, BTN_TOOL_DOUBLETAP, d->ntouches_down == 2);
        litest_event(d, EV_KEY, BTN_TOOL_TRIPLETAP, d->ntouches_down == 3);
@@ -1340,7 +1340,7 @@ litest_slot_start(struct litest_device *d,
        assert(d->ntouches_down >= 0);
        d->ntouches_down++;
 
-       send_btntool(d);
+       send_btntool(d, !touching);
 
        if (d->interface->touch_down) {
                d->interface->touch_down(d, slot, x, y);
@@ -1395,7 +1395,7 @@ litest_touch_up(struct litest_device *d, unsigned int 
slot)
        litest_assert_int_gt(d->ntouches_down, 0);
        d->ntouches_down--;
 
-       send_btntool(d);
+       send_btntool(d, false);
 
        if (d->interface->touch_up) {
                d->interface->touch_up(d, slot);
@@ -1559,7 +1559,7 @@ litest_hover_end(struct litest_device *d, unsigned int 
slot)
        litest_assert_int_gt(d->ntouches_down, 0);
        d->ntouches_down--;
 
-       send_btntool(d);
+       send_btntool(d, true);
 
        if (d->interface->touch_up) {
                d->interface->touch_up(d, slot);

commit 26c305d04416ff30b0e88818f8f56c6f42146643
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Wed Dec 2 09:27:22 2015 +1000

    test: abort if we have a test that doesn't run for any devices
    
    If the test is filtered out and we never run it generates a false positive.
    Though it isn't listed in the "Checks" summary this is a bit hard to tell 
when
    you're running >700 tests.
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
    Reviewed-by: Hans de Goede <hdego...@redhat.com>

diff --git a/test/litest.c b/test/litest.c
index 65be6b5..e235bc9 100644
--- a/test/litest.c
+++ b/test/litest.c
@@ -590,6 +590,7 @@ litest_add_tcase(const char *suite_name,
 {
        struct litest_test_device **dev = devices;
        struct suite *suite;
+       bool added = false;
 
        assert(required >= LITEST_DISABLE_DEVICE);
        assert(excluded >= LITEST_DISABLE_DEVICE);
@@ -607,6 +608,7 @@ litest_add_tcase(const char *suite_name,
        if (required == LITEST_DISABLE_DEVICE &&
            excluded == LITEST_DISABLE_DEVICE) {
                litest_add_tcase_no_device(suite, func, range);
+               added = true;
        } else if (required != LITEST_ANY || excluded != LITEST_ANY) {
                for (; *dev; dev++) {
                        if (filter_device &&
@@ -621,6 +623,7 @@ litest_add_tcase(const char *suite_name,
                                                    func,
                                                    *dev,
                                                    range);
+                       added = true;
                }
        } else {
                for (; *dev; dev++) {
@@ -633,8 +636,14 @@ litest_add_tcase(const char *suite_name,
                                                    func,
                                                    *dev,
                                                    range);
+                       added = true;
                }
        }
+
+       if (!added) {
+               fprintf(stderr, "Test '%s' does not match any devices. 
Aborting.\n", funcname);
+               abort();
+       }
 }
 
 void

commit 61b2ec3159015b05a59875fc79e09245c0c68c7b
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Thu Nov 26 11:51:20 2015 +1000

    Ignore BTN_TOOL_* events when posting button events
    
    These aren't real button events and they are handled elsewhere, either 
through
    proper touch events on touchscreen or through custom handling in the 
touchpad
    case.
    
    https://bugs.freedesktop.org/show_bug.cgi?id=93165
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
    Reviewed-by: Hans de Goede <hdego...@redhat.com>

diff --git a/src/evdev.c b/src/evdev.c
index ec3abc6..4933185 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -439,8 +439,22 @@ evdev_flush_pending_event(struct evdev_device *device, 
uint64_t time)
 static enum evdev_key_type
 get_key_type(uint16_t code)
 {
-       if (code == BTN_TOUCH)
+       switch (code) {
+       case BTN_TOOL_PEN:
+       case BTN_TOOL_RUBBER:
+       case BTN_TOOL_BRUSH:
+       case BTN_TOOL_PENCIL:
+       case BTN_TOOL_AIRBRUSH:
+       case BTN_TOOL_MOUSE:
+       case BTN_TOOL_LENS:
+       case BTN_TOOL_QUINTTAP:
+       case BTN_TOOL_DOUBLETAP:
+       case BTN_TOOL_TRIPLETAP:
+       case BTN_TOOL_QUADTAP:
+       case BTN_TOOL_FINGER:
+       case BTN_TOUCH:
                return EVDEV_KEY_TYPE_NONE;
+       }
 
        if (code >= KEY_ESC && code <= KEY_MICMUTE)
                return EVDEV_KEY_TYPE_KEY;

commit 5d191d10e7d08422ed1497f78422b26cb1d6ea4d
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Wed Dec 2 10:12:48 2015 +1000

    Add a missing closing ) in a comment
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/test/touchpad.c b/test/touchpad.c
index 8bff5a9..9f5e5a9 100644
--- a/test/touchpad.c
+++ b/test/touchpad.c
@@ -3514,7 +3514,7 @@ litest_setup_tests(void)
        litest_add("touchpad:left-handed", 
touchpad_left_handed_clickpad_delayed, LITEST_CLICKPAD, LITEST_APPLE_CLICKPAD);
 
        /* Semi-MT hover tests aren't generic, they only work on this device and
-        * ignore the semi-mt capability (it doesn't matter for the tests */
+        * ignore the semi-mt capability (it doesn't matter for the tests) */
        litest_add_for_device("touchpad:semi-mt-hover", 
touchpad_semi_mt_hover_noevent, LITEST_SYNAPTICS_HOVER_SEMI_MT);
        litest_add_for_device("touchpad:semi-mt-hover", 
touchpad_semi_mt_hover_down, LITEST_SYNAPTICS_HOVER_SEMI_MT);
        litest_add_for_device("touchpad:semi-mt-hover", 
touchpad_semi_mt_hover_down_up, LITEST_SYNAPTICS_HOVER_SEMI_MT);

commit 09a296708aa291e0dd5ada2db14f288a3095b61e
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Mon Nov 9 16:21:36 2015 +1000

    touchpad: reduced the 2fg scroll threshold to 1mm
    
    At least on the t440, this is enough to trigger correct detection between
    pinch and scroll 90% of the time. Since scrolling is significantly more
    prevalent than gesturing, erring on the side of scrolling at the cost of
    misdetecting some gestures is acceptable.
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
    Reviewed-by: Hans de Goede <hdego...@redhat.com>

diff --git a/src/evdev-mt-touchpad-gestures.c b/src/evdev-mt-touchpad-gestures.c
index cc26e2a..80aa89f 100644
--- a/src/evdev-mt-touchpad-gestures.c
+++ b/src/evdev-mt-touchpad-gestures.c
@@ -195,7 +195,7 @@ tp_gesture_get_direction(struct tp_dispatch *tp, struct 
tp_touch *touch)
            (tp->device->model_flags & EVDEV_MODEL_ELANTECH_TOUCHPAD) == 0)
                move_threshold = TP_MM_TO_DPI_NORMALIZED(4);
        else
-               move_threshold = TP_MM_TO_DPI_NORMALIZED(2);
+               move_threshold = TP_MM_TO_DPI_NORMALIZED(1);
 
        delta = device_delta(touch->point, touch->gesture.initial);
 
diff --git a/test/gestures.c b/test/gestures.c
index 9e44724..9fc73b9 100644
--- a/test/gestures.c
+++ b/test/gestures.c
@@ -294,13 +294,13 @@ START_TEST(gestures_spread)
        for (i = 0; i < 15; i++) {
                litest_push_event_frame(dev);
                if (dir_x > 0.0)
-                       dir_x += 2;
+                       dir_x += 1;
                else if (dir_x < 0.0)
-                       dir_x -= 2;
+                       dir_x -= 1;
                if (dir_y > 0.0)
-                       dir_y += 2;
+                       dir_y += 1;
                else if (dir_y < 0.0)
-                       dir_y -= 2;
+                       dir_y -= 1;
                litest_touch_move(dev,
                                  0,
                                  50 + dir_x,

commit 12e9a940b3ead32a6489170c1f234e66eb781147
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Mon Nov 16 08:36:23 2015 +1000

    configure.ac: libinput 1.1.1
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/configure.ac b/configure.ac
index 0703dd8..c841a5f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@ AC_PREREQ([2.64])
 
 m4_define([libinput_major_version], [1])
 m4_define([libinput_minor_version], [1])
-m4_define([libinput_micro_version], [0])
+m4_define([libinput_micro_version], [1])
 m4_define([libinput_version],
           
[libinput_major_version.libinput_minor_version.libinput_micro_version])
 
@@ -31,7 +31,7 @@ AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz])
 # b) If interfaces have been changed or added, but binary compatibility has
 #    been preserved, change to C+1:0:A+1
 # c) If the interface is the same as the previous version, change to C:R+1:A
-LIBINPUT_LT_VERSION=16:0:6
+LIBINPUT_LT_VERSION=16:1:6
 AC_SUBST(LIBINPUT_LT_VERSION)
 
 AM_SILENT_RULES([yes])

commit 334c3faa7b20d510f36faed4aa12ba2f8c7b078c
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Mon Nov 16 07:44:12 2015 +1000

    doc: add a link to the dwt config call to the doc
    
    And link the software buttons sentence to the t440 page.
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/doc/palm-detection.dox b/doc/palm-detection.dox
index d30a207..73c81b2 100644
--- a/doc/palm-detection.dox
+++ b/doc/palm-detection.dox
@@ -78,7 +78,10 @@ Notable behaviors of libinput's disable-while-typing feature:
   has stopped, it is thus possible to rest the palm on the touchpad while
   typing.
 - Physical buttons work even while the touchpad is disabled. This includes
-  software-emulated buttons.
+  @ref t440_support "software-emulated buttons".
+
+Disable-while-typing can be enabled and disabled by calling
+libinput_device_config_dwt_set_enabled().
 
 @section thumb-detection Thumb detection
 

commit acfff361a7d0b7b86ccd68caede78187c1b8d474
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Mon Nov 9 15:42:06 2015 +1000

    tools: take the start time before initializing the context
    
    Otherwise events that are already queued before the first 
libinput_dispatch()
    have a negative timestamp.
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/tools/event-debug.c b/tools/event-debug.c
index 1ac0086..c603296 100644
--- a/tools/event-debug.c
+++ b/tools/event-debug.c
@@ -471,6 +471,9 @@ main(int argc, char **argv)
        struct libinput *li;
        struct timespec tp;
 
+       clock_gettime(CLOCK_MONOTONIC, &tp);
+       start_time = tp.tv_sec * 1000 + tp.tv_nsec / 1000000;
+
        tools_init_context(&context);
 
        if (tools_parse_args(argc, argv, &context))
@@ -480,9 +483,6 @@ main(int argc, char **argv)
        if (!li)
                return 1;
 
-       clock_gettime(CLOCK_MONOTONIC, &tp);
-       start_time = tp.tv_sec * 1000 + tp.tv_nsec / 1000000;
-
        mainloop(li);
 
        libinput_unref(li);

commit c9149562113ee3121862995511adf6c122f130f5
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Mon Nov 9 10:18:17 2015 +1000

    test: add a device to check MOUSE_WHEEL_CLICK_ANGLE handling
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/test/Makefile.am b/test/Makefile.am
index ff1acda..e4ed8e5 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -28,6 +28,7 @@ liblitest_la_SOURCES = \
        litest-device-mouse.c \
        litest-device-mouse-roccat.c \
        litest-device-mouse-low-dpi.c \
+       litest-device-mouse-wheel-click-angle.c \
        litest-device-ms-surface-cover.c \
        litest-device-protocol-a-touch-screen.c \
        litest-device-qemu-usb-tablet.c \
diff --git a/test/litest-device-mouse-wheel-click-angle.c 
b/test/litest-device-mouse-wheel-click-angle.c
new file mode 100644
index 0000000..1460ee3
--- /dev/null
+++ b/test/litest-device-mouse-wheel-click-angle.c
@@ -0,0 +1,74 @@
+/*
+ * Copyright © 2015 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "litest.h"
+#include "litest-int.h"
+
+static void litest_mouse_setup(void)
+{
+       struct litest_device *d = 
litest_create_device(LITEST_MOUSE_WHEEL_CLICK_ANGLE);
+       litest_set_current_device(d);
+}
+
+static struct input_id input_id = {
+       .bustype = 0x3,
+       .vendor = 0x1234,
+       .product = 0x5678,
+};
+
+static int events[] = {
+       EV_KEY, BTN_LEFT,
+       EV_KEY, BTN_RIGHT,
+       EV_KEY, BTN_MIDDLE,
+       EV_REL, REL_X,
+       EV_REL, REL_Y,
+       EV_REL, REL_WHEEL,
+       -1 , -1,
+};
+
+static const char udev_rule[] =
+"ACTION==\"remove\", GOTO=\"wheel_click_angle_end\"\n"
+"KERNEL!=\"event*\", GOTO=\"wheel_click_angle_end\"\n"
+"\n"
+"ATTRS{name}==\"litest Wheel Click Angle Mouse*\",\\\n"
+"    ENV{MOUSE_WHEEL_CLICK_ANGLE}=\"-7\"\n"
+"\n"
+"LABEL=\"wheel_click_angle_end\"";
+
+struct litest_test_device litest_mouse_wheel_click_angle_device = {
+       .type = LITEST_MOUSE_WHEEL_CLICK_ANGLE,
+       .features = LITEST_RELATIVE | LITEST_BUTTON | LITEST_WHEEL,
+       .shortname = "mouse-wheelclickangle",
+       .setup = litest_mouse_setup,
+       .interface = NULL,
+
+       .name = "Wheel Click Angle Mouse",
+       .id = &input_id,
+       .absinfo = NULL,
+       .events = events,
+       .udev_rule = udev_rule,
+};
diff --git a/test/litest.c b/test/litest.c
index c7cb274..65be6b5 100644
--- a/test/litest.c
+++ b/test/litest.c
@@ -366,6 +366,7 @@ extern struct litest_test_device litest_nexus4_device;
 extern struct litest_test_device litest_magicpad_device;
 extern struct litest_test_device litest_elantech_touchpad_device;
 extern struct litest_test_device litest_mouse_gladius_device;
+extern struct litest_test_device litest_mouse_wheel_click_angle_device;
 
 struct litest_test_device* devices[] = {
        &litest_synaptics_clickpad_device,
@@ -398,6 +399,7 @@ struct litest_test_device* devices[] = {
        &litest_magicpad_device,
        &litest_elantech_touchpad_device,
        &litest_mouse_gladius_device,
+       &litest_mouse_wheel_click_angle_device,
        NULL,
 };
 
diff --git a/test/litest.h b/test/litest.h
index 058057e..ed23c8a 100644
--- a/test/litest.h
+++ b/test/litest.h
@@ -143,6 +143,7 @@ enum litest_device_type {
        LITEST_MAGIC_TRACKPAD = -29,
        LITEST_ELANTECH_TOUCHPAD = -30,
        LITEST_MOUSE_GLADIUS = -31,
+       LITEST_MOUSE_WHEEL_CLICK_ANGLE = -32,
 };
 
 enum litest_device_feature {
diff --git a/test/pointer.c b/test/pointer.c
index e12034a..ba15815 100644
--- a/test/pointer.c
+++ b/test/pointer.c
@@ -473,6 +473,30 @@ START_TEST(pointer_button_auto_release)
 }
 END_TEST
 
+static inline int
+wheel_click_angle(struct litest_device *dev)
+{
+       struct udev_device *d;
+       const char *prop;
+       const int default_angle = 15;
+       int angle = default_angle;
+
+       d = libinput_device_get_udev_device(dev->libinput_device);
+       litest_assert_ptr_notnull(d);
+
+       prop = udev_device_get_property_value(d, "MOUSE_WHEEL_CLICK_ANGLE");
+       if (!prop)
+               goto out;
+
+       angle = parse_mouse_wheel_click_angle_property(prop);
+       if (angle == 0)
+               angle = default_angle;
+
+out:
+       udev_device_unref(d);
+       return angle;
+}
+
 static void
 test_wheel_event(struct litest_device *dev, int which, int amount)
 {
@@ -481,11 +505,11 @@ test_wheel_event(struct litest_device *dev, int which, 
int amount)
        struct libinput_event_pointer *ptrev;
        enum libinput_pointer_axis axis;
 
-       /* the current evdev implementation scales the scroll wheel events
-          up by a factor 15 */
-       const int scroll_step = 15;
-       int expected = amount * scroll_step;
-       int discrete = amount;
+       int scroll_step, expected, discrete;;
+
+       scroll_step = wheel_click_angle(dev);
+       expected = amount * scroll_step;
+       discrete = amount;
 
        if 
(libinput_device_config_scroll_get_natural_scroll_enabled(dev->libinput_device))
 {
                expected *= -1;

commit e68598855a93e2ff71c11a3088d5f5a097de70dc
Author: Tomi Leppänen <tomi.leppa...@telemail.fi>
Date:   Thu Sep 17 15:05:25 2015 +0300

    Documentation fixes to arrows in svg files
    
    There were two files (doc/svg/{edge,twofinger}-scrolling.svg) that had both
    arrow heads pointing to wrong direction. Those arrow heads used markers but
    their ids were defined wrong and therefore they displayed weirdly. On 
Firefox
    the arrow head that should have pointed to left pointed actually to right.
    
    This commit fixes that problem by defining the marker ids correctly.
    
    I tested on Firefox 40.0.3 that the arrow heads are now displayed correctly.
    
    Reviewed-by: Bryce Harrington <br...@osg.samsung.com>
    Tested-by: Bryce Harrington <br...@osg.samsung.com>
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/doc/svg/edge-scrolling.svg b/doc/svg/edge-scrolling.svg
index cba72c5..c768e80 100644
--- a/doc/svg/edge-scrolling.svg
+++ b/doc/svg/edge-scrolling.svg
@@ -105,7 +105,7 @@
     <path
        d="m 455.56456,762.87232 c 0,0 -235.01231,1.01015 -235.01231,1.01015"
        id="path3702"
-       
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lstart)"
 />
+       
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart-4);marker-end:url(#Arrow1Lend-2)"
 />
     <g
        
transform="matrix(0.98314313,0.18283763,-0.18283763,0.98314313,132.81621,-12.620089)"
        id="g3663-9">
diff --git a/doc/svg/twofinger-scrolling.svg b/doc/svg/twofinger-scrolling.svg
index e182a7f..7830c25 100644
--- a/doc/svg/twofinger-scrolling.svg
+++ b/doc/svg/twofinger-scrolling.svg
@@ -127,7 +127,7 @@
       <path
          d="m 400.17949,657.93904 c 0,0 -235.01231,1.01015 -235.01231,1.01015"
          id="path3702"
-         
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart);marker-end:url(#Arrow1Lstart)"
 />
+         
style="fill:none;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker-start:url(#Arrow1Lstart-4);marker-end:url(#Arrow1Lend-2)"
 />
       <g
          
transform="matrix(0.98196551,0.12493315,-0.14261338,1.1209308,78.621186,-191.74129)"
          id="g3663">

commit 9949d4ee0859ef8361afc00363a941ff3d133d88
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Mon Nov 2 08:46:25 2015 +1000

    Fix libinput_device_group_find_group() to return NULL on failure
    
    struct list isn't a null-terminated list, list_for_each() causes 'g' to be 
set
    to the list head at the end of the loop. Returning that as group caused 
random
    memory to be overwritten.
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>

diff --git a/src/libinput.c b/src/libinput.c
index f5c75b0..24f2b69 100644
--- a/src/libinput.c
+++ b/src/libinput.c
@@ -2011,7 +2011,7 @@ libinput_device_group_find_group(struct libinput 
*libinput,
                }
        }
 
-       return g;
+       return NULL;
 }
 
 void

commit 38f20850e1d81b6636db093287f6d6209d1ca7ab
Author: Peter Hutterer <peter.hutte...@who-t.net>
Date:   Wed Oct 28 09:13:24 2015 +1000

    evdev: init pointer acceleration for any device with pointer cap and rel x/y
    
    The Asus RoG Gladius exposes two event nodes, one mouse, one keyboard. The
    keyboard node has REL_X/Y and REL_HWHEEL on top of the various key bits and
    ABS_VOLUME.
    
    The keyboard node does not have BTN_* set, udev tags this device as a
    keyboard only, not as a pointer but we still initialize the pointer caps for
    it because of the wheel.
    
    When moving this mouse, some deltas (ca "1 in every 20") are sent through 
the
    keyboard node, causing a crash because we never initialized pointer
    acceleration.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=1275407
    
    Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net>
    Reviewed-by: Hans de Goede <hdego...@redhat.com>

diff --git a/src/evdev.c b/src/evdev.c
index ba1b568..ec3abc6 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -2062,11 +2062,6 @@ evdev_configure_device(struct evdev_device *device)
                evdev_tag_trackpoint(device, device->udev_device);
                device->dpi = evdev_read_dpi_prop(device);
 
-               if (libevdev_has_event_code(evdev, EV_REL, REL_X) &&
-                   libevdev_has_event_code(evdev, EV_REL, REL_Y) &&
-                   evdev_init_accel(device, 
LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE) == -1)
-                       return -1;
-
                device->seat_caps |= EVDEV_DEVICE_POINTER;
 
                log_info(libinput,
@@ -2104,6 +2099,16 @@ evdev_configure_device(struct evdev_device *device)
                         device->devname, devnode);
        }
 
+       if (device->seat_caps & EVDEV_DEVICE_POINTER &&
+           libevdev_has_event_code(evdev, EV_REL, REL_X) &&
+           libevdev_has_event_code(evdev, EV_REL, REL_Y) &&
+           evdev_init_accel(device, LIBINPUT_CONFIG_ACCEL_PROFILE_ADAPTIVE) == 
-1) {
+               log_error(libinput,
+                         "failed to initialize pointer acceleration for %s\n",
+                         device->devname);
+               return -1;
+       }
+
        return 0;
 }
 
diff --git a/test/Makefile.am b/test/Makefile.am
index cde93b3..ff1acda 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -15,6 +15,7 @@ liblitest_la_SOURCES = \
        litest-int.h \
        litest-device-alps-semi-mt.c \
        litest-device-alps-dualpoint.c \
+       litest-device-asus-rog-gladius.c \
        litest-device-atmel-hover.c \
        litest-device-bcm5974.c \
        litest-device-elantech-touchpad.c \
diff --git a/test/litest-device-asus-rog-gladius.c 
b/test/litest-device-asus-rog-gladius.c
new file mode 100644
index 0000000..a44396f
--- /dev/null
+++ b/test/litest-device-asus-rog-gladius.c
@@ -0,0 +1,334 @@
+/*
+ * Copyright © 2015 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+#if HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "litest.h"
+#include "litest-int.h"
+
+/* Note: this is the second event node of this mouse only, the first event
+ * node is just a normal mouse */
+
+static void litest_mouse_gladius_setup(void)
+{
+       struct litest_device *d = litest_create_device(LITEST_MOUSE_GLADIUS);
+       litest_set_current_device(d);
+}
+
+static struct input_id input_id = {
+       .bustype = 0x3,
+       .vendor = 0x0b05,
+       .product = 0x181a,
+};
+
+static int events[] = {
+       EV_REL, REL_X,
+       EV_REL, REL_Y,
+       EV_REL, REL_HWHEEL,
+       EV_KEY, KEY_ESC,
+       EV_KEY, KEY_1,
+       EV_KEY, KEY_2,

Reply via email to