[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

libinput: Changes to 'ubuntu'



 .gitignore                                                        |    1 
 configure.ac                                                      |   17 
 debian/changelog                                                  |   33 
 debian/control                                                    |    1 
 debian/libinput10.symbols                                         |   52 
 debian/patches/fix-premature-flushing-of-evdev-event-on-mx4.patch |    2 
 debian/patches/touch-point-orientation-size.patch                 |   58 
 doc/Makefile.am                                                   |    1 
 doc/absolute-axes.dox                                             |   18 
 doc/device-configuration-via-udev.dox                             |    4 
 doc/gestures.dox                                                  |   38 
 doc/normalization-of-relative-motion.dox                          |    8 
 doc/page-hierarchy.dox                                            |    4 
 doc/pointer-acceleration.dox                                      |    6 
 doc/svg/gesture-2fg-ambiguity.svg                                 |  496 +
 doc/svg/pinch-gestures-softbuttons.svg                            |  365 
 doc/svg/tablet-axes.svg                                           |  564 +
 doc/svg/tablet-out-of-bounds.svg                                  |  271 
 doc/svg/tablet.svg                                                |  199 
 doc/tablet-support.dox                                            |  211 
 doc/tapping.dox                                                   |    6 
 doc/touchpad-tap-state-machine.svg                                | 1467 ++-
 src/Makefile.am                                                   |    4 
 src/evdev-mt-touchpad-buttons.c                                   |   27 
 src/evdev-mt-touchpad-edge-scroll.c                               |    5 
 src/evdev-mt-touchpad-gestures.c                                  |  395 -
 src/evdev-mt-touchpad-tap.c                                       |   57 
 src/evdev-mt-touchpad.c                                           |  237 
 src/evdev-mt-touchpad.h                                           |   51 
 src/evdev-tablet.c                                                | 1691 ++++
 src/evdev-tablet.h                                                |  204 
 src/evdev.c                                                       |   95 
 src/evdev.h                                                       |   26 
 src/filter.c                                                      |   94 
 src/filter.h                                                      |    3 
 src/libinput-private.h                                            |  100 
 src/libinput-util.h                                               |   56 
 src/libinput.c                                                    |  826 ++
 src/libinput.h                                                    | 1011 ++
 src/libinput.sym                                                  |   55 
 test/Makefile.am                                                  |   18 
 test/device.c                                                     |  103 
 test/gestures.c                                                   |  892 ++
 test/litest-device-anker-mouse-kbd.c                              |  225 
 test/litest-device-apple-internal-keyboard.c                      |  239 
 test/litest-device-cyborg-rat-5.c                                 |   71 
 test/litest-device-huion-pentablet.c                              |  113 
 test/litest-device-synaptics-hover.c                              |    2 
 test/litest-device-synaptics-i2c.c                                |  102 
 test/litest-device-wacom-bamboo-tablet.c                          |  119 
 test/litest-device-wacom-cintiq-24hd.c                            |  147 
 test/litest-device-wacom-cintiq-tablet.c                          |  158 
 test/litest-device-wacom-intuos-tablet.c                          |  163 
 test/litest-device-wacom-isdv4-tablet.c                           |  112 
 test/litest-device-waltop-tablet.c                                |  241 
 test/litest-device-yubikey.c                                      |  169 
 test/litest-int.h                                                 |    8 
 test/litest-selftest.c                                            |    4 
 test/litest.c                                                     |  188 
 test/litest.h                                                     |  597 +
 test/misc.c                                                       |  114 
 test/path.c                                                       |   60 
 test/pointer.c                                                    |   10 
 test/tablet.c                                                     | 3680 ++++++++++
 test/touchpad-tap.c                                               |  296 
 test/touchpad.c                                                   |  485 +
 test/udev.c                                                       |    5 
 test/valgrind.suppressions                                        |   18 
 tools/event-debug.c                                               |  234 
 tools/event-gui.c                                                 |  236 
 tools/libinput-list-devices.c                                     |   16 
 tools/shared.c                                                    |   16 
 tools/shared.h                                                    |    1 
 udev/90-libinput-model-quirks.hwdb                                |   28 
 udev/90-libinput-model-quirks.rules.in                            |    4 
 udev/libinput-model-quirks.c                                      |    6 
 76 files changed, 16196 insertions(+), 1443 deletions(-)

New commits:
commit f06b99ba73bf0f8d801d0167e0c29f9717a99541
Author: Timo Aaltonen <tjaalton@debian.org>
Date:   Thu Mar 17 11:14:12 2016 +0200

    refresh patches, release to xenial

diff --git a/debian/changelog b/debian/changelog
index bb23bdb..a5d26d9 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,10 @@
+libinput (1.2.2-1ubuntu1) xenial; urgency=medium
+
+  * Merge from debian.
+  * patches: Refreshed.
+
+ -- Timo Aaltonen <tjaalton@debian.org>  Thu, 17 Mar 2016 11:12:01 +0200
+
 libinput (1.2.2-1) unstable; urgency=medium
 
   * New upstream release.
diff --git a/debian/patches/fix-premature-flushing-of-evdev-event-on-mx4.patch b/debian/patches/fix-premature-flushing-of-evdev-event-on-mx4.patch
index e1fb1d6..0473fdf 100644
--- a/debian/patches/fix-premature-flushing-of-evdev-event-on-mx4.patch
+++ b/debian/patches/fix-premature-flushing-of-evdev-event-on-mx4.patch
@@ -17,7 +17,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
 
 --- a/src/evdev.c
 +++ b/src/evdev.c
-@@ -654,16 +654,16 @@ evdev_process_key(struct evdev_device *d
+@@ -665,16 +665,16 @@ evdev_process_key(struct evdev_device *d
  	if (e->value == 2)
  		return;
  
diff --git a/debian/patches/touch-point-orientation-size.patch b/debian/patches/touch-point-orientation-size.patch
index 7094de7..298a460 100644
--- a/debian/patches/touch-point-orientation-size.patch
+++ b/debian/patches/touch-point-orientation-size.patch
@@ -37,7 +37,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
 
 --- a/doc/Makefile.am
 +++ b/doc/Makefile.am
-@@ -26,6 +26,7 @@ header_files = \
+@@ -27,6 +27,7 @@ header_files = \
  	$(srcdir)/tapping.dox \
  	$(srcdir)/test-suite.dox \
  	$(srcdir)/tools.dox \
@@ -45,7 +45,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  	$(srcdir)/touchpads.dox
  
  diagram_files = \
-@@ -50,6 +51,7 @@ diagram_files = \
+@@ -51,6 +52,7 @@ diagram_files = \
  	$(srcdir)/svg/thumb-detection.svg \
  	$(srcdir)/svg/top-software-buttons.svg \
  	$(srcdir)/svg/touchscreen-gestures.svg \
@@ -471,7 +471,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  
  enum evdev_key_type {
  	EVDEV_KEY_TYPE_NONE,
-@@ -245,6 +249,100 @@ evdev_device_transform_y(struct evdev_de
+@@ -258,6 +262,100 @@ evdev_device_transform_y(struct evdev_de
  	return scale_axis(device->abs.absinfo_y, y, height);
  }
  
@@ -572,7 +572,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  static inline void
  normalize_delta(struct evdev_device *device,
  		const struct device_coords *delta,
-@@ -282,8 +380,15 @@ evdev_flush_pending_event(struct evdev_d
+@@ -295,8 +393,15 @@ evdev_flush_pending_event(struct evdev_d
  	struct normalized_coords accel, unaccel;
  	struct device_coords point;
  	struct device_float_coords raw;
@@ -588,7 +588,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  
  	switch (device->pending_event) {
  	case EVDEV_NONE:
-@@ -324,7 +429,7 @@ evdev_flush_pending_event(struct evdev_d
+@@ -337,7 +442,7 @@ evdev_flush_pending_event(struct evdev_d
  		if (!(device->seat_caps & EVDEV_DEVICE_TOUCH))
  			break;
  
@@ -597,7 +597,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  			log_bug_kernel(libinput,
  				       "%s: Driver sent multiple touch down for the "
  				       "same slot",
-@@ -333,38 +438,50 @@ evdev_flush_pending_event(struct evdev_d
+@@ -346,38 +451,48 @@ evdev_flush_pending_event(struct evdev_d
  		}
  
  		seat_slot = ffs(~seat->slot_map) - 1;
@@ -610,7 +610,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  		seat->slot_map |= 1 << seat_slot;
 -		point = device->mt.slots[slot].point;
 +		point = slot_data->point;
- 		transform_absolute(device, &point);
+ 		evdev_transform_absolute(device, &point);
  
 -		touch_notify_touch_down(base, time, slot, seat_slot,
 -					&point);
@@ -629,16 +629,14 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
 -		seat_slot = device->mt.slots[slot].seat_slot;
 -		point = device->mt.slots[slot].point;
 +		seat_slot = slot_data->seat_slot;
-+
 +		point = slot_data->point;
  
  		if (seat_slot == -1)
  			break;
  
- 		transform_absolute(device, &point);
+ 		evdev_transform_absolute(device, &point);
 -		touch_notify_touch_motion(base, time, slot, seat_slot,
 -					  &point);
-+
 +		touch_notify_touch_motion(base,
 +					  time,
 +					  slot,
@@ -658,9 +656,9 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  
  		if (seat_slot == -1)
  			break;
-@@ -396,7 +513,13 @@ evdev_flush_pending_event(struct evdev_d
+@@ -409,7 +524,13 @@ evdev_flush_pending_event(struct evdev_d
  		point = device->abs.point;
- 		transform_absolute(device, &point);
+ 		evdev_transform_absolute(device, &point);
  
 -		touch_notify_touch_down(base, time, -1, seat_slot, &point);
 +		touch_notify_touch_down(base,
@@ -673,7 +671,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  		break;
  	case EVDEV_ABSOLUTE_MOTION:
  		point = device->abs.point;
-@@ -408,8 +531,13 @@ evdev_flush_pending_event(struct evdev_d
+@@ -421,8 +542,13 @@ evdev_flush_pending_event(struct evdev_d
  			if (seat_slot == -1)
  				break;
  
@@ -689,7 +687,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  		} else if (device->seat_caps & EVDEV_DEVICE_POINTER) {
  			pointer_notify_motion_absolute(base, time, &point);
  		}
-@@ -583,8 +711,9 @@ evdev_process_touch(struct evdev_device
+@@ -596,8 +722,9 @@ evdev_process_touch(struct evdev_device
  		    struct input_event *e,
  		    uint64_t time)
  {
@@ -701,7 +699,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  		if ((size_t)e->value >= device->mt.slots_len) {
  			log_bug_libinput(device->base.seat->libinput,
  					 "%s exceeds slots (%d of %zd)\n",
-@@ -595,8 +724,7 @@ evdev_process_touch(struct evdev_device
+@@ -608,8 +735,7 @@ evdev_process_touch(struct evdev_device
  		}
  		evdev_flush_pending_event(device, time);
  		device->mt.slot = e->value;
@@ -711,7 +709,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  		if (device->pending_event != EVDEV_NONE &&
  		    device->pending_event != EVDEV_ABSOLUTE_MT_MOTION)
  			evdev_flush_pending_event(device, time);
-@@ -604,17 +732,34 @@ evdev_process_touch(struct evdev_device
+@@ -617,17 +743,34 @@ evdev_process_touch(struct evdev_device
  			device->pending_event = EVDEV_ABSOLUTE_MT_DOWN;
  		else
  			device->pending_event = EVDEV_ABSOLUTE_MT_UP;
@@ -756,7 +754,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  	}
  }
  
-@@ -1969,6 +2114,20 @@ evdev_configure_mt_device(struct evdev_d
+@@ -1989,6 +2132,20 @@ evdev_configure_mt_device(struct evdev_d
  		slots[slot].point.y = libevdev_get_slot_value(evdev,
  							      slot,
  							      ABS_MT_POSITION_Y);
@@ -777,7 +775,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  	}
  	device->mt.slots = slots;
  	device->mt.slots_len = num_slots;
-@@ -2039,6 +2198,15 @@ evdev_configure_device(struct evdev_devi
+@@ -2060,6 +2217,15 @@ evdev_configure_device(struct evdev_devi
  		return -1;
  	}
  
@@ -795,7 +793,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  
 --- a/src/evdev.h
 +++ b/src/evdev.h
-@@ -113,6 +113,8 @@ enum evdev_device_model {
+@@ -119,6 +119,8 @@ enum evdev_device_model {
  struct mt_slot {
  	int32_t seat_slot;
  	struct device_coords point;
@@ -804,7 +802,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  };
  
  struct evdev_device {
-@@ -129,6 +131,8 @@ struct evdev_device {
+@@ -135,6 +137,8 @@ struct evdev_device {
  	int fd;
  	struct {
  		const struct input_absinfo *absinfo_x, *absinfo_y;
@@ -813,7 +811,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  		int fake_resolution;
  
  		struct device_coords point;
-@@ -350,6 +354,26 @@ double
+@@ -376,6 +380,26 @@ double
  evdev_device_transform_y(struct evdev_device *device,
  			 double y,
  			 uint32_t height);
@@ -854,7 +852,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  /*
   * A coordinate pair in device coordinates, capable of holding non discrete
   * values, this is necessary e.g. when device coordinates get averaged.
-@@ -396,14 +401,18 @@ touch_notify_touch_down(struct libinput_
+@@ -461,14 +466,18 @@ touch_notify_touch_down(struct libinput_
  			uint64_t time,
  			int32_t slot,
  			int32_t seat_slot,
@@ -877,7 +875,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  touch_notify_touch_up(struct libinput_device *device,
 --- a/src/libinput-util.h
 +++ b/src/libinput-util.h
-@@ -118,6 +118,12 @@ msleep(unsigned int ms)
+@@ -145,6 +145,12 @@ msleep(unsigned int ms)
  	usleep(ms * 1000);
  }
  
@@ -901,7 +899,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  };
  
  struct libinput_event_gesture {
-@@ -732,6 +734,204 @@ libinput_event_touch_get_y(struct libinp
+@@ -758,6 +760,204 @@ libinput_event_touch_get_y(struct libinp
  	return evdev_convert_to_mm(device->abs.absinfo_y, event->point.y);
  }
  
@@ -1106,7 +1104,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  LIBINPUT_EXPORT uint32_t
  libinput_event_gesture_get_time(struct libinput_event_gesture *event)
  {
-@@ -1512,7 +1712,9 @@ touch_notify_touch_down(struct libinput_
+@@ -2113,7 +2313,9 @@ touch_notify_touch_down(struct libinput_
  			uint64_t time,
  			int32_t slot,
  			int32_t seat_slot,
@@ -1117,7 +1115,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  {
  	struct libinput_event_touch *touch_event;
  
-@@ -1528,6 +1730,8 @@ touch_notify_touch_down(struct libinput_
+@@ -2129,6 +2331,8 @@ touch_notify_touch_down(struct libinput_
  		.slot = slot,
  		.seat_slot = seat_slot,
  		.point = *point,
@@ -1126,7 +1124,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  	};
  
  	post_device_event(device, time,
-@@ -1540,7 +1744,9 @@ touch_notify_touch_motion(struct libinpu
+@@ -2141,7 +2345,9 @@ touch_notify_touch_motion(struct libinpu
  			  uint64_t time,
  			  int32_t slot,
  			  int32_t seat_slot,
@@ -1137,7 +1135,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  {
  	struct libinput_event_touch *touch_event;
  
-@@ -1556,6 +1762,8 @@ touch_notify_touch_motion(struct libinpu
+@@ -2157,6 +2363,8 @@ touch_notify_touch_motion(struct libinpu
  		.slot = slot,
  		.seat_slot = seat_slot,
  		.point = *point,
@@ -1148,7 +1146,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  	post_device_event(device, time,
 --- a/src/libinput.h
 +++ b/src/libinput.h
-@@ -968,6 +968,228 @@ libinput_event_touch_get_y_transformed(s
+@@ -1151,6 +1151,228 @@ libinput_event_touch_get_y_transformed(s
  /**
   * @ingroup event_touch
   *
@@ -1379,7 +1377,7 @@ Signed-off-by: Andreas Pokorny <andreas.pokorny@canonical.com>
  struct libinput_event *
 --- a/src/libinput.sym
 +++ b/src/libinput.sym
-@@ -173,6 +173,19 @@ LIBINPUT_0.21.0 {
+@@ -174,6 +174,19 @@ LIBINPUT_0.21.0 {
  	libinput_event_touch_get_time_usec;
  } LIBINPUT_0.20.0;
  

commit 371db78d35361ec5b0f5b2c1d3b4c6862c317bd6
Author: Timo Aaltonen <tjaalton@debian.org>
Date:   Thu Mar 17 10:55:12 2016 +0200

    release to unstable

diff --git a/debian/changelog b/debian/changelog
index f092320..f32c177 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+libinput (1.2.2-1) unstable; urgency=medium
+
+  * New upstream release.
+
+ -- Timo Aaltonen <tjaalton@debian.org>  Thu, 17 Mar 2016 10:49:19 +0200
+
 libinput (1.2.0-1) unstable; urgency=medium
 
   * New upstream release.

commit ae7b2f77720f19ce3b6924bb3ecf706cabd17587
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Tue Mar 15 10:23:42 2016 +1000

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

diff --git a/configure.ac b/configure.ac
index 71255ed..7d73183 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], [2])
-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=17:3:7
+LIBINPUT_LT_VERSION=17:4:7
 AC_SUBST(LIBINPUT_LT_VERSION)
 
 AM_SILENT_RULES([yes])

commit a608d9dc2c70c7915fc94466ed27c1684f65409e
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Mon Mar 7 16:05:25 2016 +1000

    touchpad: add quirk for the T450 and T460 generation hardware
    
    The touchpad's sensors are too far apart (or the firmware interferes), causing
    in a jerky movement visible especially on slow motion. We get a bunch of
    normal motion events, then only ABS_MT_PRESSURE updates without x/y updates.
    After about one mm of movement x/y updates resume, with the first event
    covering the distance between the last motion event. That event is usually
    accelerated and thus causes a large jump. Subsequent events are sufficiently
    fine-grained again.
    
    This patch counts the number of non-motion events. Once we hit 10 in a row, we
    mark the first motion update as non-dirty, effectively discarding the motion
    and thus stopping the pointer jumps.
    
    https://bugs.freedesktop.org/show_bug.cgi?id=94379
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
    Tested-by: Benjamin Tissoires <benjamin.tissoires@gmail.com>

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 00d6539..d0a8e27 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -337,7 +337,7 @@ tp_process_absolute(struct tp_dispatch *tp,
 	case ABS_MT_PRESSURE:
 		t->pressure = e->value;
 		t->dirty = true;
-		tp->queued |= TOUCHPAD_EVENT_MOTION;
+		tp->queued |= TOUCHPAD_EVENT_OTHERAXIS;
 		break;
 	}
 }
@@ -880,8 +880,10 @@ tp_position_fake_touches(struct tp_dispatch *tp)
 }
 
 static inline bool
-tp_need_motion_history_reset(struct tp_dispatch *tp)
+tp_need_motion_history_reset(struct tp_dispatch *tp, uint64_t time)
 {
+	bool rc = false;
+
 	/* semi-mt finger postions may "jump" when nfingers changes */
 	if (tp->semi_mt && tp->nfingers_down != tp->old_nfingers_down)
 		return true;
@@ -894,7 +896,29 @@ tp_need_motion_history_reset(struct tp_dispatch *tp)
 		 tp->old_nfingers_down > tp->num_slots))
 		return true;
 
-	return false;
+	/* Quirk: if we had multiple events without x/y axis
+	   information, the next x/y event is going to be a jump. So we
+	   reset that touch to non-dirty effectively swallowing that event
+	   and restarting with the next event again.
+	 */
+	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;
+				rc = true;
+			}
+			tp->quirks.nonmotion_event_count = 0;
+		}
+
+		if ((tp->queued & (TOUCHPAD_EVENT_OTHERAXIS|TOUCHPAD_EVENT_MOTION)) ==
+		    TOUCHPAD_EVENT_OTHERAXIS)
+			tp->quirks.nonmotion_event_count++;
+	}
+
+	return rc;
 }
 
 static void
@@ -909,7 +933,7 @@ tp_process_state(struct tp_dispatch *tp, uint64_t time)
 	tp_unhover_touches(tp, time);
 	tp_position_fake_touches(tp);
 
-	want_motion_reset = tp_need_motion_history_reset(tp);
+	want_motion_reset = tp_need_motion_history_reset(tp, time);
 
 	for (i = 0; i < tp->ntouches; i++) {
 		t = tp_get_touch(tp, i);
diff --git a/src/evdev-mt-touchpad.h b/src/evdev-mt-touchpad.h
index eae327b..1f05a03 100644
--- a/src/evdev-mt-touchpad.h
+++ b/src/evdev-mt-touchpad.h
@@ -41,6 +41,7 @@ enum touchpad_event {
 	TOUCHPAD_EVENT_MOTION		= (1 << 0),
 	TOUCHPAD_EVENT_BUTTON_PRESS	= (1 << 1),
 	TOUCHPAD_EVENT_BUTTON_RELEASE	= (1 << 2),
+	TOUCHPAD_EVENT_OTHERAXIS	= (1 << 3),
 };
 
 enum touchpad_model {
@@ -353,6 +354,17 @@ struct tp_dispatch {
 		int upper_thumb_line;
 		int lower_thumb_line;
 	} thumb;
+
+	struct {
+		/* A quirk used on the T450 series Synaptics hardware.
+		 * Slowly moving the finger causes multiple events with only
+		 * ABS_MT_PRESSURE but no x/y information. When the x/y
+		 * event comes, it will be a jump of ~20 units. We use the
+		 * below to count non-motion events to discard that first
+		 * event with the jump.
+		 */
+		unsigned int nonmotion_event_count;
+	} quirks;
 };
 
 #define tp_for_each_touch(_tp, _t) \
diff --git a/src/evdev.c b/src/evdev.c
index 51768fe..a5c965d 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -1680,6 +1680,7 @@ evdev_read_model_flags(struct evdev_device *device)
 		{ "LIBINPUT_MODEL_CYBORG_RAT", EVDEV_MODEL_CYBORG_RAT },
 		{ "LIBINPUT_MODEL_CYAPA", EVDEV_MODEL_CYAPA },
 		{ "LIBINPUT_MODEL_ALPS_RUSHMORE", EVDEV_MODEL_ALPS_RUSHMORE },
+		{ "LIBINPUT_MODEL_LENOVO_T450_TOUCHPAD", EVDEV_MODEL_LENOVO_T450_TOUCHPAD },
 		{ NULL, EVDEV_MODEL_DEFAULT },
 	};
 	const struct model_map *m = model_map;
diff --git a/src/evdev.h b/src/evdev.h
index 482712b..4a5d807 100644
--- a/src/evdev.h
+++ b/src/evdev.h
@@ -113,6 +113,7 @@ enum evdev_device_model {
 	EVDEV_MODEL_CYBORG_RAT = (1 << 14),
 	EVDEV_MODEL_CYAPA = (1 << 15),
 	EVDEV_MODEL_ALPS_RUSHMORE = (1 << 16),
+	EVDEV_MODEL_LENOVO_T450_TOUCHPAD= (1 << 17),
 };
 
 struct mt_slot {
diff --git a/udev/90-libinput-model-quirks.hwdb b/udev/90-libinput-model-quirks.hwdb
index eb2859e..d5978f7 100644
--- a/udev/90-libinput-model-quirks.hwdb
+++ b/udev/90-libinput-model-quirks.hwdb
@@ -100,6 +100,13 @@ libinput:name:Cypress APA Trackpad (cyapa):dmi:*
 libinput:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*:pvrThinkPadX230*
  LIBINPUT_MODEL_LENOVO_X230=1
 
+# Lenovo T450/T460 and all other Lenovos of the *50 and *60 generation,
+# including the X1 Carbon 3rd gen
+libinput:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*:pvrThinkPad??50*:
+libinput:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*:pvrThinkPad??60*:
+libinput:name:SynPS/2 Synaptics TouchPad:dmi:*svnLENOVO:*:pvrThinkPadX1Carbon3rd:*
+ LIBINPUT_MODEL_LENOVO_T450_TOUCHPAD=1
+
 ##########################################
 # Synaptics
 ##########################################

commit 5d904b63191538b46d7fe8443990b55c42de0205
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Mon Mar 7 10:12:13 2016 +1000

    tablet: reject mislabelled tablet devices
    
    The HUION 580 has a "consumer control" event node that has an ABS_VOLUME, keys
    and a REL_HWHEEL. It has the same VID/PID as the pen tablet and libwacom
    labels it as ID_INPUT_TABLET. This causes a crash later when we try to init
    pointer acceleration for a device that doesn't have axes.
    
    https://bugzilla.redhat.com/show_bug.cgi?id=1314955
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
index 0f6fa2c..7359881 100644
--- a/src/evdev-tablet.c
+++ b/src/evdev-tablet.c
@@ -1613,6 +1613,31 @@ tablet_init_left_handed(struct evdev_device *device)
 }
 
 static int
+tablet_reject_device(struct evdev_device *device)
+{
+	struct libevdev *evdev = device->evdev;
+	int rc = -1;
+
+	if (!libevdev_has_event_code(evdev, EV_ABS, ABS_X) ||
+	    !libevdev_has_event_code(evdev, EV_ABS, ABS_Y))
+		goto out;
+
+	if (!libevdev_has_event_code(evdev, EV_KEY, BTN_TOOL_PEN))
+		goto out;
+
+	rc = 0;
+
+out:
+	if (rc) {
+		log_bug_libinput(device->base.seat->libinput,
+				 "Device '%s' does not meet tablet criteria. "
+				 "Ignoring this device.\n",
+				 device->devname);
+	}
+	return rc;
+}
+
+static int
 tablet_init(struct tablet_dispatch *tablet,
 	    struct evdev_device *device)
 {
@@ -1625,6 +1650,9 @@ tablet_init(struct tablet_dispatch *tablet,
 	tablet->current_tool_type = LIBINPUT_TOOL_NONE;
 	list_init(&tablet->tool_list);
 
+	if (tablet_reject_device(device))
+		return -1;
+
 	tablet_init_calibration(tablet, device);
 	tablet_init_proximity_threshold(tablet, device);
 	rc = tablet_init_accel(tablet, device);

commit b4a74bcebc8f1d37b2ed78db3440435ead03299a
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Fri Mar 4 07:50:49 2016 +1000

    Assert that the interface is actually filled in.
    
    Had this in a private bug report recently. Missing hooks for open/close just
    segfault with little information to debug. Add an assert, this is definitely a
    bug in the caller and we don't need to recover from that.
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/src/libinput.c b/src/libinput.c
index 3c78905..1480878 100644
--- a/src/libinput.c
+++ b/src/libinput.c
@@ -1517,6 +1517,9 @@ libinput_init(struct libinput *libinput,
 	      const struct libinput_interface_backend *interface_backend,
 	      void *user_data)
 {
+	assert(interface->open_restricted != NULL);
+	assert(interface->close_restricted != NULL);
+
 	libinput->epoll_fd = epoll_create1(EPOLL_CLOEXEC);;
 	if (libinput->epoll_fd < 0)
 		return -1;
diff --git a/test/udev.c b/test/udev.c
index 30ae118..9296e94 100644
--- a/test/udev.c
+++ b/test/udev.c
@@ -52,7 +52,6 @@ const struct libinput_interface simple_interface = {
 START_TEST(udev_create_NULL)
 {
 	struct libinput *li;
-	const struct libinput_interface interface;
 	struct udev *udev;
 
 	udev = udev_new();
@@ -60,13 +59,13 @@ START_TEST(udev_create_NULL)
 	li = libinput_udev_create_context(NULL, NULL, NULL);
 	ck_assert(li == NULL);
 
-	li = libinput_udev_create_context(&interface, NULL, NULL);
+	li = libinput_udev_create_context(&simple_interface, NULL, NULL);
 	ck_assert(li == NULL);
 
 	li = libinput_udev_create_context(NULL, NULL, udev);
 	ck_assert(li == NULL);
 
-	li = libinput_udev_create_context(&interface, NULL, udev);
+	li = libinput_udev_create_context(&simple_interface, NULL, udev);
 	ck_assert(li != NULL);
 	ck_assert_int_eq(libinput_udev_assign_seat(li, NULL), -1);
 

commit 00a9b05da71c9071cc910a1c5975165f2a8db9c6
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Thu Mar 3 08:33:22 2016 +1000

    test: add two path tests for invalid devices
    
    One test for an actual file (so far we only tested /tmp, the directory) and
    one for a kernel dev that returns a udev device and thus gets one step further
    in the error handling code.
    
    Plus, I saw test code doing this (opening /dev/uinput) and it crashed (for
    other reasons), so we might as well test it.
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/test/path.c b/test/path.c
index 0b04b19..7d7c445 100644
--- a/test/path.c
+++ b/test/path.c
@@ -27,6 +27,7 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <libinput.h>
+#include <stdio.h>
 #include <unistd.h>
 
 #include "litest.h"
@@ -98,6 +99,63 @@ START_TEST(path_create_invalid)
 }
 END_TEST
 
+START_TEST(path_create_invalid_kerneldev)
+{
+	struct libinput *li;
+	struct libinput_device *device;
+	const char *path = "/dev/uinput";
+
+	open_func_count = 0;
+	close_func_count = 0;
+
+	li = libinput_path_create_context(&simple_interface, NULL);
+	ck_assert(li != NULL);
+	device = libinput_path_add_device(li, path);
+	ck_assert(device == NULL);
+
+	ck_assert_int_eq(open_func_count, 1);
+	ck_assert_int_eq(close_func_count, 1);
+
+	libinput_unref(li);
+	ck_assert_int_eq(close_func_count, 1);
+
+	open_func_count = 0;
+	close_func_count = 0;
+}
+END_TEST
+
+START_TEST(path_create_invalid_file)
+{
+	struct libinput *li;
+	struct libinput_device *device;
+	char path[] = "/tmp/litest_path_XXXXXX";
+	int fd;
+
+	fd = mkstemp(path);
+	ck_assert_int_ge(fd, 0);
+	close(fd);
+
+	open_func_count = 0;
+	close_func_count = 0;
+
+	li = libinput_path_create_context(&simple_interface, NULL);
+	unlink(path);
+
+	ck_assert(li != NULL);
+	device = libinput_path_add_device(li, path);
+	ck_assert(device == NULL);
+
+	ck_assert_int_eq(open_func_count, 0);
+	ck_assert_int_eq(close_func_count, 0);
+
+	libinput_unref(li);
+	ck_assert_int_eq(close_func_count, 0);
+
+	open_func_count = 0;
+	close_func_count = 0;
+}
+END_TEST
+
 START_TEST(path_create_destroy)
 {
 	struct libinput *li;
@@ -882,6 +940,8 @@ litest_setup_tests(void)
 {
 	litest_add_no_device("path:create", path_create_NULL);
 	litest_add_no_device("path:create", path_create_invalid);
+	litest_add_no_device("path:create", path_create_invalid_file);
+	litest_add_no_device("path:create", path_create_invalid_kerneldev);
 	litest_add_no_device("path:create", path_create_destroy);
 	litest_add_no_device("path:create", path_set_user_data);
 	litest_add_no_device("path:suspend", path_suspend);

commit a60afbeec39f7de4a03103dab26701b506dc93d0
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Wed Mar 2 11:48:59 2016 +1000

    touchpad: use the udev property over a compile-time vendor ID check
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/src/evdev-mt-touchpad.c b/src/evdev-mt-touchpad.c
index 95d650a..00d6539 100644
--- a/src/evdev-mt-touchpad.c
+++ b/src/evdev-mt-touchpad.c
@@ -1299,7 +1299,7 @@ tp_dwt_device_is_blacklisted(struct evdev_device *device)
 		return true;
 
 	/* Wacom makes touchpads, but not internal ones */
-	if (libevdev_get_id_vendor(device->evdev) == VENDOR_ID_WACOM)
+	if (device->model_flags & EVDEV_MODEL_WACOM_TOUCHPAD)
 		return true;
 
 	return false;

commit 2bb0678a00f9c089dc865d6ecd20be36446d1c06
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Wed Feb 10 09:24:51 2016 +1000

    tablet: sanitize button mask passing
    
    We have a struct, use it. Better than passing arrays and array lengths around.
    
    Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>

diff --git a/src/evdev-tablet.c b/src/evdev-tablet.c
index 22ea1eb..0f6fa2c 100644
--- a/src/evdev-tablet.c
+++ b/src/evdev-tablet.c
@@ -38,34 +38,27 @@
 
 static inline void
 tablet_get_pressed_buttons(struct tablet_dispatch *tablet,
-			   unsigned char *buttons,
-			   unsigned int buttons_len)
+			   struct button_state *buttons)
 {
 	size_t i;
 	const struct button_state *state = &tablet->button_state,
 			          *prev_state = &tablet->prev_button_state;
 
-	assert(buttons_len <= ARRAY_LENGTH(state->stylus_buttons));
-
-	for (i = 0; i < buttons_len; i++)
-		buttons[i] = state->stylus_buttons[i] &
-					~(prev_state->stylus_buttons[i]);
+	for (i = 0; i < sizeof(buttons->bits); i++)
+		buttons->bits[i] = state->bits[i] & ~(prev_state->bits[i]);
 }
 
 static inline void
 tablet_get_released_buttons(struct tablet_dispatch *tablet,
-			    unsigned char *buttons,
-			    unsigned int buttons_len)
+			    struct button_state *buttons)
 {
 	size_t i;
 	const struct button_state *state = &tablet->button_state,
 			          *prev_state = &tablet->prev_button_state;
 
-	assert(buttons_len <= ARRAY_LENGTH(state->stylus_buttons));
-
-	for (i = 0; i < buttons_len; i++)
-		buttons[i] = prev_state->stylus_buttons[i] &
-					~(state->stylus_buttons[i]);
+	for (i = 0; i < sizeof(buttons->bits); i++)
+		buttons->bits[i] = prev_state->bits[i] &
+					~(state->bits[i]);
 }
 
 /* Merge the previous state with the current one so all buttons look like
@@ -77,10 +70,9 @@ tablet_force_button_presses(struct tablet_dispatch *tablet)
 			    *prev_state = &tablet->prev_button_state;
 	size_t i;
 
-	for (i = 0; i < sizeof(state->stylus_buttons); i++) {
-		state->stylus_buttons[i] = state->stylus_buttons[i] |
-						prev_state->stylus_buttons[i];
-		prev_state->stylus_buttons[i] = 0;
+	for (i = 0; i < sizeof(state->bits); i++) {
+		state->bits[i] = state->bits[i] | prev_state->bits[i];
+		prev_state->bits[i] = 0;
 	}
 }
 
@@ -566,10 +558,10 @@ tablet_update_button(struct tablet_dispatch *tablet,
 	}
 
 	if (enable) {
-		set_bit(tablet->button_state.stylus_buttons, evcode);
+		set_bit(tablet->button_state.bits, evcode);
 		tablet_set_status(tablet, TABLET_BUTTONS_PRESSED);
 	} else {
-		clear_bit(tablet->button_state.stylus_buttons, evcode);
+		clear_bit(tablet->button_state.bits, evcode);
 		tablet_set_status(tablet, TABLET_BUTTONS_RELEASED);
 	}
 }
@@ -936,20 +928,19 @@ tablet_notify_button_mask(struct tablet_dispatch *tablet,
 			  struct evdev_device *device,
 			  uint64_t time,
 			  struct libinput_tablet_tool *tool,
-			  const unsigned char *buttons,
-			  unsigned int buttons_len,
+			  const struct button_state *buttons,
 			  enum libinput_button_state state)
 {
 	struct libinput_device *base = &device->base;
 	size_t i;
-	size_t nbits = 8 * sizeof(buttons[0]) * buttons_len;
+	size_t nbits = 8 * sizeof(buttons->bits);
 	enum libinput_tablet_tool_tip_state tip_state;
 
 	tip_state = tablet_has_status(tablet, TABLET_TOOL_IN_CONTACT) ?
 			LIBINPUT_TABLET_TOOL_TIP_DOWN : LIBINPUT_TABLET_TOOL_TIP_UP;
 
 	for (i = 0; i < nbits; i++) {
-		if (!bit_is_set(buttons, i))
+		if (!bit_is_set(buttons->bits, i))
 			continue;
 
 		tablet_notify_button(base,
@@ -969,21 +960,18 @@ tablet_notify_buttons(struct tablet_dispatch *tablet,
 		      struct libinput_tablet_tool *tool,
 		      enum libinput_button_state state)
 {
-	unsigned char buttons[ARRAY_LENGTH(tablet->button_state.stylus_buttons)];
+	struct button_state buttons;
 
 	if (state == LIBINPUT_BUTTON_STATE_PRESSED)
-		tablet_get_pressed_buttons(tablet, buttons, sizeof(buttons));
+		tablet_get_pressed_buttons(tablet, &buttons);
 	else
-		tablet_get_released_buttons(tablet,
-					    buttons,
-					    sizeof(buttons));
+		tablet_get_released_buttons(tablet, &buttons);
 
 	tablet_notify_button_mask(tablet,
 				  device,
 				  time,
 				  tool,
-				  buttons,
-				  sizeof(buttons),
+				  &buttons,
 				  state);
 }
 
@@ -1332,9 +1320,9 @@ tablet_flush(struct tablet_dispatch *tablet,
 
 	if (tablet_has_status(tablet, TABLET_TOOL_LEAVING_PROXIMITY)) {
 		/* Release all stylus buttons */
-		memset(tablet->button_state.stylus_buttons,
+		memset(tablet->button_state.bits,
 		       0,
-		       sizeof(tablet->button_state.stylus_buttons));
+		       sizeof(tablet->button_state.bits));
 		tablet_set_status(tablet, TABLET_BUTTONS_RELEASED);
 		if (tablet_has_status(tablet, TABLET_TOOL_IN_CONTACT))
 			tablet_set_status(tablet, TABLET_TOOL_LEAVING_CONTACT);
diff --git a/src/evdev-tablet.h b/src/evdev-tablet.h
index 1d6fc93..880d523 100644
--- a/src/evdev-tablet.h
+++ b/src/evdev-tablet.h
@@ -45,7 +45,7 @@ enum tablet_status {
 };
 
 struct button_state {
-	unsigned char stylus_buttons[NCHARS(KEY_CNT)];
+	unsigned char bits[NCHARS(KEY_CNT)];
 };
 
 struct tablet_dispatch {

commit 21fe11fb11a4d79aabb208f5839679a52a74678b
Author: Peter Hutterer <peter.hutterer@who-t.net>
Date:   Fri Feb 26 15:19:57 2016 +1000

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

diff --git a/configure.ac b/configure.ac
index d400f21..71255ed 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@ AC_PREREQ([2.64])
 
 m4_define([libinput_major_version], [1])


Reply to: