Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libinput for openSUSE:Factory 
checked in at 2026-05-16 19:23:33
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libinput (Old)
 and      /work/SRC/openSUSE:Factory/.libinput.new.1966 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libinput"

Sat May 16 19:23:33 2026 rev:131 rq:1353245 version:1.31.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/libinput/libinput.changes        2026-04-04 
19:06:45.567506483 +0200
+++ /work/SRC/openSUSE:Factory/.libinput.new.1966/libinput.changes      
2026-05-16 19:23:46.692203032 +0200
@@ -1,0 +2,12 @@
+Thu May 14 23:58:01 UTC 2026 - Jan Engelhardt <[email protected]>
+
+- Update to release 1.31.2
+  * A bunch of device-specific quirks
+  * Fix for the new fast-swipe interaction during 3fg dragging. A
+    wrong timestamp calculation could cause slow movements to be
+    interpreted as swipes in some cases.
+  * A fix for the Acer Swift SFX14-73G (and likely other devices
+    with a similar touchpad) fixes a stuttering cursor caused by
+    wrong SYN_REPORT handling in libinput.
+
+-------------------------------------------------------------------

Old:
----
  libinput-1.31.1.tar.gz

New:
----
  libinput-1.31.2.tar.gz

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

Other differences:
------------------
++++++ libinput.spec ++++++
--- /var/tmp/diff_new_pack.36y0aQ/_old  2026-05-16 19:23:48.284268189 +0200
+++ /var/tmp/diff_new_pack.36y0aQ/_new  2026-05-16 19:23:48.288268353 +0200
@@ -37,7 +37,7 @@
 %define lname  libinput10
 %define pname  libinput
 Name:           libinput%{?xsuffix}
-Version:        1.31.1
+Version:        1.31.2
 Release:        0
 Summary:        Input device and event processing library
 License:        MIT

++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.36y0aQ/_old  2026-05-16 19:23:48.348270809 +0200
+++ /var/tmp/diff_new_pack.36y0aQ/_new  2026-05-16 19:23:48.352270972 +0200
@@ -1,5 +1,5 @@
-mtime: 1775114676
-commit: 6cfb5d9611a339e3f447be0287373aed1776c9a947e0c8c8296b75ee548aa3f1
+mtime: 1778803125
+commit: 35d2d9dc284600b2191c7ce44233899d3564df78e84a2dee5caf6ab7c6b50bbb
 url: https://src.opensuse.org/jengelh/libinput
 revision: master
 

++++++ build.specials.obscpio ++++++

++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore      1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore      2026-05-15 01:58:45.000000000 +0200
@@ -0,0 +1 @@
+.osc

++++++ libinput-1.31.1.tar.gz -> libinput-1.31.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/meson.build 
new/libinput-1.31.2/meson.build
--- old/libinput-1.31.1/meson.build     2026-04-02 03:04:12.000000000 +0200
+++ new/libinput-1.31.2/meson.build     2026-05-14 12:56:17.000000000 +0200
@@ -1,5 +1,5 @@
 project('libinput', 'c',
-       version : '1.31.1',
+       version : '1.31.2',
        license : 'MIT/Expat',
        default_options : [ 'c_std=gnu99', 'warning_level=2' ],
        meson_version : '>= 0.64.0')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/quirks/30-vendor-clevetura.quirks 
new/libinput-1.31.2/quirks/30-vendor-clevetura.quirks
--- old/libinput-1.31.1/quirks/30-vendor-clevetura.quirks       1970-01-01 
01:00:00.000000000 +0100
+++ new/libinput-1.31.2/quirks/30-vendor-clevetura.quirks       2026-05-14 
12:56:17.000000000 +0200
@@ -0,0 +1,11 @@
+# Do not edit this file, it will be overwritten on update
+
+# Touchpad is not a clickpad but INPUT_PROP_BUTTONPAD is set,
+# causing libinput to drop physical button events.
+[Clevetura CLVX S Touchpad]
+MatchUdevType=touchpad
+MatchBus=bluetooth
+MatchVendor=0x36F7
+MatchProduct=0x5755
+AttrInputProp=-INPUT_PROP_BUTTONPAD
+AttrEventCode=+BTN_RIGHT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/quirks/30-vendor-elantech.quirks 
new/libinput-1.31.2/quirks/30-vendor-elantech.quirks
--- old/libinput-1.31.1/quirks/30-vendor-elantech.quirks        2026-04-02 
03:04:12.000000000 +0200
+++ new/libinput-1.31.2/quirks/30-vendor-elantech.quirks        2026-05-14 
12:56:17.000000000 +0200
@@ -9,3 +9,11 @@
 MatchName=*Elan Touchpad*
 AttrResolutionHint=31x31
 AttrPressureRange=10:8
+
+# Elan Hapticpad mostly used in Lenovo laptops.
+[Elan Haptic Touchpad (04F3:3355)]
+MatchBus=i2c
+MatchVendor=0x04F3
+MatchProduct=0x3355
+MatchUdevType=touchpad
+AttrInputProp=+INPUT_PROP_PRESSUREPAD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/quirks/30-vendor-goodix.quirks 
new/libinput-1.31.2/quirks/30-vendor-goodix.quirks
--- old/libinput-1.31.1/quirks/30-vendor-goodix.quirks  2026-04-02 
03:04:12.000000000 +0200
+++ new/libinput-1.31.2/quirks/30-vendor-goodix.quirks  2026-05-14 
12:56:17.000000000 +0200
@@ -2,6 +2,15 @@
 
 # "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
 # Match vid and pid as it can have other names.
+[Goodix Haptic Touchpad (27C6:01E7)]
+MatchBus=i2c
+MatchVendor=0x27C6
+MatchProduct=0x01E7
+MatchUdevType=touchpad
+AttrInputProp=+INPUT_PROP_PRESSUREPAD
+
+# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
+# GXTP5100:00 27C6:01E8 Touchpad
 [Goodix Haptic Touchpad (27C6:01E8)]
 MatchBus=i2c
 MatchVendor=0x27C6
@@ -9,6 +18,42 @@
 MatchUdevType=touchpad
 AttrInputProp=+INPUT_PROP_PRESSUREPAD
 
+# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
+# GXTP5100:00 27C6:01E9 Touchpad
+[Goodix Haptic Touchpad (27C6:01E9)]
+MatchBus=i2c
+MatchVendor=0x27C6
+MatchProduct=0x01E9
+MatchUdevType=touchpad
+AttrInputProp=+INPUT_PROP_PRESSUREPAD
+
+# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
+# GXTP5100:00 27C6:01EA Touchpad
+[Goodix Haptic Touchpad (27C6:01EA)]
+MatchBus=i2c
+MatchVendor=0x27C6
+MatchProduct=0x01EA
+MatchUdevType=touchpad
+AttrInputProp=+INPUT_PROP_PRESSUREPAD
+
+# "GXTP5100 Touchpad": pressure touchpad mostly used in Lenovo laptops.
+# GXTP5100:00 27C6:01EB Touchpad
+[Goodix Haptic Touchpad (27C6:01EB)]
+MatchBus=i2c
+MatchVendor=0x27C6
+MatchProduct=0x01EB
+MatchUdevType=touchpad
+AttrInputProp=+INPUT_PROP_PRESSUREPAD
+
+# "GXTP5400 Touchpad": pressure touchpad mostly used in Lenovo laptops.
+# GXTP5400:00 27C6:0F96 Touchpad
+[Goodix Haptic Touchpad (27C6:0F96)]
+MatchBus=i2c
+MatchVendor=0x27C6
+MatchProduct=0x0F96
+MatchUdevType=touchpad
+AttrInputProp=+INPUT_PROP_PRESSUREPAD
+
 # "GXTP5420 Touchpad": pressure touchpad mostly used in Lenovo laptops.
 # GXTP5420:00 27C6:0F95 Touchpad
 [Goodix Haptic Touchpad (27C6:0F95)]
@@ -17,3 +62,11 @@
 MatchProduct=0x0F95
 MatchUdevType=touchpad
 AttrInputProp=+INPUT_PROP_PRESSUREPAD
+
+# "GXTP5420 Touchpad": pressure touchpad mostly used in Lenovo laptops.
+[Goodix Haptic Touchpad (27C6:0F90)]
+MatchBus=i2c
+MatchVendor=0x27C6
+MatchProduct=0x0F90
+MatchUdevType=touchpad
+AttrInputProp=+INPUT_PROP_PRESSUREPAD
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/quirks/50-system-hp.quirks 
new/libinput-1.31.2/quirks/50-system-hp.quirks
--- old/libinput-1.31.1/quirks/50-system-hp.quirks      2026-04-02 
03:04:12.000000000 +0200
+++ new/libinput-1.31.2/quirks/50-system-hp.quirks      2026-05-14 
12:56:17.000000000 +0200
@@ -24,28 +24,27 @@
 MatchDMIModalias=dmi:*:svnHP:pnHPElitex21013G3:*
 ModelTabletModeSwitchUnreliable=1
 
-# The HP OmniBook Ultra Flip Laptop 14-fh0xxx's custom Intel ISH firmware
-# filters out events from its builtin keyboard and touchpad when the hinge is
-# opened little more than 180 degrees but toggles tablet-mode when it's opened
-# little less than 180 degrees.
-# Do not suspend the keyboard and touchpad to let use the device in flat
-# position and also give consistency with some keyboard keys controlled by the
-# Video Bus device (brightness down/up), the HP WMI hotkeys device (mic mute 
and
-# hp hubs launcher key) and the backlight getting on and off by the firmware at
-# the same time it enables disables the input.
-# This one is for the keyboard and...
-[HP OmniBook Ultra Flip Laptop 14-fh0xxx Keyboard]
+# The HP OmniBook Ultra Flip 14 toggles tablet mode at a little less than 180
+# degrees and hardware switches off inputs at a little more than 180 degrees.
+# We don't suspend ourselves to allow using them in flat position. It is
+# possible that HP fixes this in the future (i.e. so tablet mode toggles
+# after 180 degrees) so check before removing these rules.
+# This rule is for the keyboard and...
+[HP OmniBook Ultra Flip Laptop 14-fh0xxx and 14t-fh000 Keyboard]
 MatchBus=ps2
 MatchUdevType=keyboard
-MatchDMIModalias=dmi:*:svnHP:pnHPOmniBookUltraFlipLaptop14-fh0xxx:*
+MatchDMIModalias=dmi:*:svnHP:*:rn8CDE:*
 ModelTabletModeNoSuspend=1
 
-# ...this one is for the touchpad.
-[HP OmniBook Ultra Flip Laptop 14-fh0xxx Touchpad]
+# ...this rule is for the touchpad.
+[HP OmniBook Ultra Flip Laptop 14-fh0xxx and 14t-fh000 Touchpad]
 MatchBus=i2c
 MatchUdevType=touchpad
-MatchDMIModalias=dmi:*:svnHP:pnHPOmniBookUltraFlipLaptop14-fh0xxx:*
+MatchDMIModalias=dmi:*:svnHP:*:rn8CDE:*
 ModelTabletModeNoSuspend=1
+AttrPressureRange=15:5
+AttrThumbPressureThreshold=80
+AttrPalmPressureThreshold=125
 
 [HP Pavilion dm4]
 MatchName=*SynPS/2 Synaptics TouchPad
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/quirks/50-system-positivo.quirks 
new/libinput-1.31.2/quirks/50-system-positivo.quirks
--- old/libinput-1.31.1/quirks/50-system-positivo.quirks        1970-01-01 
01:00:00.000000000 +0100
+++ new/libinput-1.31.2/quirks/50-system-positivo.quirks        2026-05-14 
12:56:17.000000000 +0200
@@ -0,0 +1,11 @@
+# Do not edit this file, it will be overwritten on update
+
+# Most Pixart Touchpad (093A:0255) devices don't have buttons so we remove 
right
+# button in 30-vendor-pixart.quirks, but this one does.
+[Positivo VAIO FE15 Touchpad]
+MatchBus=i2c
+MatchVendor=0x093A
+MatchProduct=0x0255
+MatchUdevType=touchpad
+MatchDMIModalias=dmi:*:svnPositivoBahia-VAIO:pnVJFE59F11X-*:*
+AttrEventCode=+BTN_RIGHT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/quirks/50-system-wareus.quirks 
new/libinput-1.31.2/quirks/50-system-wareus.quirks
--- old/libinput-1.31.1/quirks/50-system-wareus.quirks  1970-01-01 
01:00:00.000000000 +0100
+++ new/libinput-1.31.2/quirks/50-system-wareus.quirks  2026-05-14 
12:56:17.000000000 +0200
@@ -0,0 +1,6 @@
+# Clickpad that announces BTN_RIGHT
+[Wareus B15 Touchpad]
+MatchName=HTIX5288:00 36B6:C001 Touchpad
+MatchUdevType=touchpad
+MatchDMIModalias=dmi:*svnWareus:*pnB15*
+AttrEventCode=-BTN_RIGHT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/src/evdev-frame.h 
new/libinput-1.31.2/src/evdev-frame.h
--- old/libinput-1.31.1/src/evdev-frame.h       2026-04-02 03:04:12.000000000 
+0200
+++ new/libinput-1.31.2/src/evdev-frame.h       2026-05-14 12:56:17.000000000 
+0200
@@ -332,9 +332,9 @@
        case EVDEV_BTN_TOOL_FINGER:
        case EVDEV_BTN_TOUCH:
                return false;
-       case BTN_STYLUS:
-       case BTN_STYLUS2:
-       case BTN_STYLUS3:
+       case EVDEV_BTN_STYLUS:
+       case EVDEV_BTN_STYLUS2:
+       case EVDEV_BTN_STYLUS3:
                return true;
        case EVDEV_BTN_MISC ... EVDEV_BTN_DIGI - 1:
        case EVDEV_BTN_WHEEL ... EVDEV_BTN_GEAR_UP:
@@ -550,10 +550,12 @@
                   size_t nevents)
 {
        assert(nevents > 0);
+       int syn_report_value = 0;
 
        for (size_t i = 0; i < nevents; i++) {
                if (evdev_usage_eq(events[i].usage, EVDEV_SYN_REPORT)) {
                        nevents = i;
+                       syn_report_value = events[i].value;
                        break;
                }
        }
@@ -568,14 +570,24 @@
                frame->count += nevents;
        }
 
+       frame->events[frame->count - 1] = (struct evdev_event){
+               .usage = evdev_usage_from_uint32_t(EVDEV_SYN_REPORT),
+               .value = syn_report_value,
+       };
+
        return 0;
 }
 
 static inline int
 evdev_frame_append_one(struct evdev_frame *frame, evdev_usage_t usage, int32_t 
value)
 {
-       if (evdev_usage_eq(usage, EVDEV_SYN_REPORT))
+       if (evdev_usage_eq(usage, EVDEV_SYN_REPORT)) {
+               frame->events[frame->count - 1] = (struct evdev_event){
+                       .usage = evdev_usage_from_uint32_t(EVDEV_SYN_REPORT),
+                       .value = value,
+               };
                return 0;
+       }
 
        if (frame->count >= frame->max_size)
                return -ENOMEM;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/src/evdev-mt-touchpad-gestures.c 
new/libinput-1.31.2/src/evdev-mt-touchpad-gestures.c
--- old/libinput-1.31.1/src/evdev-mt-touchpad-gestures.c        2026-04-02 
03:04:12.000000000 +0200
+++ new/libinput-1.31.2/src/evdev-mt-touchpad-gestures.c        2026-05-14 
12:56:17.000000000 +0200
@@ -585,8 +585,28 @@
 static void
 tp_gesture_set_3fg_drag_3fg_or_swipe_timer(struct tp_dispatch *tp, usec_t time)
 {
-       libinput_timer_set(&tp->gesture.drag_3fg_or_swipe_timer,
-                          usec_add(time, DRAG_3FG_OR_SWIPE_TIMEOUT));
+       usec_t expire = usec_add(tp->gesture.initial_time, 
DRAG_3FG_OR_SWIPE_TIMEOUT);
+
+       /* This is a hack to avoid the state machine getting even more 
complicated.
+        * For a slow drag/fast swipe we want the time from the *initial* touch 
point,
+        * not the time from when we realised the fingers are moving. IOW
+        * putting 3fg down, resting for 80ms and then moving fast must trigger
+        * a drag, not a swipe.
+        *
+        * In theory we should set the timer in the NONE/UNKNOWN states but 
that would
+        * require a whole parallel set of states like
+        * NONE_BUT_TIMEOUT_FOR_FAST_STATE_EXPIRED. Let's not do that, instead 
we set a
+        * negative timer and let the normal state proceed. Either we moved by 
the
+        * threshold already (in which case we shouldn't ever get here anyway) 
or
+        * we didn't in which case the neg timer will do the right thing too 
when it
+        * fires.
+        */
+       if (usec_cmp(expire, time) < 0)
+               libinput_timer_set_flags(&tp->gesture.drag_3fg_or_swipe_timer,
+                                        expire,
+                                        TIMER_FLAG_ALLOW_NEGATIVE);
+       else
+               libinput_timer_set(&tp->gesture.drag_3fg_or_swipe_timer, 
expire);
 }
 
 static void
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/src/libinput.c 
new/libinput-1.31.2/src/libinput.c
--- old/libinput-1.31.1/src/libinput.c  2026-04-02 03:04:12.000000000 +0200
+++ new/libinput-1.31.2/src/libinput.c  2026-05-14 12:56:17.000000000 +0200
@@ -5206,7 +5206,7 @@
        if (!libinput_tablet_tool_config_eraser_button_get_modes(tool))
                return LIBINPUT_CONFIG_ERASER_BUTTON_DEFAULT;
 
-       return tool->config.eraser_button.get_mode(tool);
+       return tool->config.eraser_button.get_default_mode(tool);
 }
 
 LIBINPUT_EXPORT enum libinput_config_status
@@ -5246,7 +5246,7 @@
        if (!libinput_tablet_tool_config_eraser_button_get_modes(tool))
                return 0;
 
-       return tool->config.eraser_button.get_button(tool);
+       return tool->config.eraser_button.get_default_button(tool);
 }
 
 #ifdef HAVE_LIBWACOM
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/src/util-time.h 
new/libinput-1.31.2/src/util-time.h
--- old/libinput-1.31.1/src/util-time.h 2026-04-02 03:04:12.000000000 +0200
+++ new/libinput-1.31.2/src/util-time.h 2026-05-14 12:56:17.000000000 +0200
@@ -41,19 +41,19 @@
 static inline usec_t
 usec_from_millis(uint32_t millis)
 {
-       return usec_from_uint64_t(millis * 1000);
+       return usec_from_uint64_t(millis * 1000ULL);
 }
 
 static inline usec_t
 usec_from_seconds(uint32_t secs)
 {
-       return usec_from_millis(secs * 1000);
+       return usec_from_uint64_t(secs * 1000000ULL);
 }
 
 static inline usec_t
 usec_from_hours(uint32_t hours)
 {
-       return usec_from_seconds(hours * 3600);
+       return usec_from_uint64_t((uint64_t)hours * 3600 * 1000000ULL);
 }
 
 static inline uint32_t
@@ -83,7 +83,7 @@
 static inline usec_t
 usec_add_millis(usec_t us, uint32_t millis)
 {
-       return usec_from_uint64_t(usec_as_uint64_t(us) + millis * 1000);
+       return usec_from_uint64_t(usec_as_uint64_t(us) + millis * 1000ULL);
 }
 
 static inline usec_t
@@ -101,13 +101,13 @@
 static inline usec_t
 usec_from_timeval(const struct timeval *tv)
 {
-       return usec_from_uint64_t(tv->tv_sec * 1000000 + tv->tv_usec);
+       return usec_from_uint64_t(tv->tv_sec * 1000000ULL + tv->tv_usec);
 }
 
 static inline usec_t
 usec_from_timespec(const struct timespec *tp)
 {
-       return usec_from_uint64_t(tp->tv_sec * 1000000 + tp->tv_nsec / 1000);
+       return usec_from_uint64_t(tp->tv_sec * 1000000ULL + tp->tv_nsec / 1000);
 }
 
 static inline usec_t
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/test/test-gestures.c 
new/libinput-1.31.2/test/test-gestures.c
--- old/libinput-1.31.1/test/test-gestures.c    2026-04-02 03:04:12.000000000 
+0200
+++ new/libinput-1.31.2/test/test-gestures.c    2026-05-14 12:56:17.000000000 
+0200
@@ -2161,6 +2161,65 @@
 }
 END_TEST
 
+START_TEST(gestures_3fg_drag_slow_start)
+{
+       struct litest_device *dev = litest_current_device();
+       struct libinput *li = dev->libinput;
+
+       uint32_t finger_count = litest_test_param_get_u32(test_env->params, 
"fingers");
+       bool tap_enabled = litest_test_param_get_bool(test_env->params, 
"tap-enabled");
+
+       if (litest_slot_count(dev) < 3)
+               return LITEST_NOT_APPLICABLE;
+       if 
(libinput_device_config_3fg_drag_get_finger_count(dev->libinput_device) <
+           (int)finger_count)
+               return LITEST_NOT_APPLICABLE;
+
+       litest_enable_3fg_drag(dev->libinput_device, finger_count);
+       if (tap_enabled)
+               litest_enable_tap(dev->libinput_device);
+       else
+               litest_disable_tap(dev->libinput_device);
+
+       litest_drain_events(li);
+
+       /* Fingers are set down, then we do nothing, then we swipe fast. Because
+        * we did nothing at first even fast movement must become a 3fg drag, 
not
+        * a swipe.
+        */
+       double y = 30.0;
+       for (uint32_t i = 0; i < finger_count; i++)
+               litest_touch_down(dev, i, 10 + i, y);
+
+       litest_checkpoint("Waiting past timeout before fast finger move");
+       litest_timeout_3fg_drag_or_swipe(li);
+
+       /* Now move fast */
+       while (y < 60.0) {
+               y += 2;
+               for (uint32_t i = 0; i < finger_count; i++) {
+                       litest_touch_move(dev, i, 10 + i, y);
+               }
+               litest_dispatch(li);
+       }
+
+       drain_cancelled_swipe_gesture(li);
+       litest_checkpoint("Expecting button press for 3fg drag");
+       litest_assert_button_event(li, BTN_LEFT, LIBINPUT_BUTTON_STATE_PRESSED);
+       litest_assert_only_typed_events(li, LIBINPUT_EVENT_POINTER_MOTION);
+
+       for (uint32_t i = 0; i < finger_count; i++)
+               litest_touch_up(dev, i);
+
+       litest_dispatch(li);
+       litest_assert_empty_queue(li);
+
+       litest_timeout_3fg_drag(li);
+
+       litest_assert_button_event(li, BTN_LEFT, 
LIBINPUT_BUTTON_STATE_RELEASED);
+}
+END_TEST
+
 TEST_COLLECTION(gestures)
 {
        /* clang-format off */
@@ -2247,6 +2306,7 @@
                               "fingers", 'u', 2, 3, 4,
                               "tap-enabled", 'b') {
                litest_add_parametrized(gestures_3fg_drag_fast_swipe, 
LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH, params);
+               litest_add_parametrized(gestures_3fg_drag_slow_start, 
LITEST_TOUCHPAD, LITEST_SINGLE_TOUCH, params);
        }
 
        /* Timing-sensitive test, valgrind is too slow */
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/test/test-utils.c 
new/libinput-1.31.2/test/test-utils.c
--- old/libinput-1.31.1/test/test-utils.c       2026-04-02 03:04:12.000000000 
+0200
+++ new/libinput-1.31.2/test/test-utils.c       2026-05-14 12:56:17.000000000 
+0200
@@ -3168,6 +3168,49 @@
                                     ARRAY_LENGTH(events));
                litest_assert_int_eq(frame->max_size, ARRAY_LENGTH(events));
        }
+       {
+               struct evdev_event events[] = {
+                       {
+                               .usage = U(EVDEV_ABS_X),
+                               .value = 1,
+                       },
+                       {
+                               .usage = U(EVDEV_ABS_Y),
+                               .value = 2,
+                       },
+                       {
+                               .usage = U(EVDEV_SYN_REPORT),
+                               .value = 1,
+                       },
+               };
+
+               _unref_(evdev_frame) *frame = evdev_frame_new(3);
+               int rc = evdev_frame_append(frame, events, 3);
+               litest_assert_neg_errno_success(rc);
+
+               litest_assert_int_eq(evdev_frame_get_count(frame),
+                                    ARRAY_LENGTH(events));
+               litest_assert_int_eq(frame->max_size, ARRAY_LENGTH(events));
+
+               size_t nevents;
+               rc = memcmp(evdev_frame_get_events(frame, &nevents),
+                           events,
+                           sizeof(events));
+               litest_assert_int_eq(rc, 0);
+               litest_assert_int_eq(nevents, ARRAY_LENGTH(events));
+
+               for (int v = 0; v < 2; v++) {
+                       /* Appending SYN_REPORT changes the value to zero */
+                       rc = evdev_frame_append_one(frame, U(EVDEV_SYN_REPORT), 
v);
+                       litest_assert_neg_errno_success(rc);
+                       litest_assert_int_eq(evdev_frame_get_count(frame),
+                                            ARRAY_LENGTH(events));
+                       struct evdev_event *evs =
+                               evdev_frame_get_events(frame, &nevents);
+                       litest_assert(evdev_usage_eq(evs[2].usage, 
EVDEV_SYN_REPORT));
+                       litest_assert_int_eq(evs[2].value, v);
+               }
+       }
 }
 END_TEST
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/tools/libinput-record.c 
new/libinput-1.31.2/tools/libinput-record.c
--- old/libinput-1.31.1/tools/libinput-record.c 2026-04-02 03:04:12.000000000 
+0200
+++ new/libinput-1.31.2/tools/libinput-record.c 2026-05-14 12:56:17.000000000 
+0200
@@ -257,6 +257,7 @@
 
                usec_t time = input_event_time(ev);
                usec_t dt = usec_delta(time, last_time);
+               last_time = time;
 
                snprintf(desc,
                         sizeof(desc),
@@ -908,7 +909,7 @@
                tool_type = "brush";
                break;
        case LIBINPUT_TABLET_TOOL_TYPE_PENCIL:
-               tool_type = "brush";
+               tool_type = "pencil";
                break;
        case LIBINPUT_TABLET_TOOL_TYPE_AIRBRUSH:
                tool_type = "airbrush";
@@ -1404,7 +1405,7 @@
        _autofree_ char *dmistr = strdup("unknown"); //
        if (dmi) {
                char buf[2048] = "unknown";
-               size_t n = fread(buf, sizeof(buf), 1, dmi); // NOLINT: 
unix.Stream
+               size_t n = fread(buf, 1, sizeof(buf), dmi); // NOLINT: 
unix.Stream
                if (n > 0) {
                        free(dmistr);
                        dmistr = strndup(buf, n - 1);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libinput-1.31.1/tools/shared.c 
new/libinput-1.31.2/tools/shared.c
--- old/libinput-1.31.1/tools/shared.c  2026-04-02 03:04:12.000000000 +0200
+++ new/libinput-1.31.2/tools/shared.c  2026-05-14 12:56:17.000000000 +0200
@@ -787,7 +787,7 @@
                        continue;
 
                const char *sysname = udev_device_get_sysname(device);
-               if (!strstartswith("event", sysname)) {
+               if (!strstartswith(sysname, "event")) {
                        continue;
                }
 

Reply via email to