Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package libwacom for openSUSE:Factory 
checked in at 2026-02-10 21:11:37
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/libwacom (Old)
 and      /work/SRC/openSUSE:Factory/.libwacom.new.1670 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "libwacom"

Tue Feb 10 21:11:37 2026 rev:48 rq:1331996 version:2.18.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/libwacom/libwacom.changes        2025-11-25 
15:53:15.127505958 +0100
+++ /work/SRC/openSUSE:Factory/.libwacom.new.1670/libwacom.changes      
2026-02-10 21:11:40.125667913 +0100
@@ -1,0 +2,17 @@
+Sun Feb  8 07:52:35 UTC 2026 - Aesara Binder <[email protected]>
+
+- Update to version 2.18.0
+  * New devices:
+    - Added Lenovo ThinkVision M14t Gen2
+    - XP Pen Deco02
+    - Huion Kamvas Pro 19 (4K) (GT1902)
+  * Device fixes:
+    - drop the firmware match for the Huion Kamvas 13 GS1333
+    - fix the Huion Inspiroy Q620M layout
+    - add bluetooth match for the XP-Pen Deco MW
+    - Update huion-hs611.tablet
+    - Update huion-inspiroy-q620m.tablet
+  * Device other:
+    - libwacom_stylus_is_generic() to detect generic styli
+
+-------------------------------------------------------------------

Old:
----
  libwacom-2.17.0.tar.xz
  libwacom-2.17.0.tar.xz.sig

New:
----
  libwacom-2.18.0.tar.xz
  libwacom-2.18.0.tar.xz.sig

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

Other differences:
------------------
++++++ libwacom.spec ++++++
--- /var/tmp/diff_new_pack.kz2qaJ/_old  2026-02-10 21:11:41.061707135 +0100
+++ /var/tmp/diff_new_pack.kz2qaJ/_new  2026-02-10 21:11:41.061707135 +0100
@@ -19,7 +19,7 @@
 %define sover 9
 
 Name:           libwacom
-Version:        2.17.0
+Version:        2.18.0
 Release:        0
 Summary:        Tablet description library
 License:        HPND

++++++ libwacom-2.17.0.tar.xz -> libwacom-2.18.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/.pre-commit-config.yaml 
new/libwacom-2.18.0/.pre-commit-config.yaml
--- old/libwacom-2.17.0/.pre-commit-config.yaml 2025-11-12 05:10:44.000000000 
+0100
+++ new/libwacom-2.18.0/.pre-commit-config.yaml 2026-02-03 12:32:51.000000000 
+0100
@@ -7,13 +7,13 @@
   - id: check-merge-conflict
   - id: check-symlinks
 - repo: https://github.com/astral-sh/ruff-pre-commit
-  rev: v0.14.2
+  rev: v0.14.9
   hooks:
   - id: ruff
     args: ['--ignore=E741,E501']
   - id: ruff-format
 - repo: https://github.com/pre-commit/mirrors-clang-format
-  rev: v21.1.2
+  rev: v21.1.7
   hooks:
   - id: clang-format
     types_or: [c]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/NEWS new/libwacom-2.18.0/NEWS
--- old/libwacom-2.17.0/NEWS    2025-11-12 05:10:44.000000000 +0100
+++ new/libwacom-2.18.0/NEWS    2026-02-03 12:32:51.000000000 +0100
@@ -1,3 +1,11 @@
+libwacom 2.18.0:
+- New Devices:
+  - XP-Pen Deco MW (bluetooth), Deco02
+  - Huion Kamvas Pro 19
+  - Lenovo ThinkVision M14t Gen 2
+- New API:
+  - libwacom_stylus_is_generic() returns true for generic styli that are added 
by libwacom
+
 libwacom 2.17.0:
 - New Devices:
   - Dell Inspiron 14 7445 2-in-1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/data/huion-hs611.tablet 
new/libwacom-2.18.0/data/huion-hs611.tablet
--- old/libwacom-2.17.0/data/huion-hs611.tablet 2025-11-12 05:10:44.000000000 
+0100
+++ new/libwacom-2.18.0/data/huion-hs611.tablet 2026-02-03 12:32:51.000000000 
+0100
@@ -33,10 +33,13 @@
 #
 # sysinfo.RmLwlkDGnI
 # https://github.com/linuxwacom/wacom-hid-descriptors/issues/132
+#
+# sysinfo.X7tABmLMuR
+# https://github.com/linuxwacom/wacom-hid-descriptors/issues/581
 
 [Device]
 Name=Huion HS611
-DeviceMatch=usb|256c|006d|HUION Huion Tablet_HS611 Pad;usb|256c|006d|HUION 
Huion Tablet_HS611 Touch Strip;usb|256c|006d|HUION Huion Tablet_HS611 Pen
+DeviceMatch=usb|256c|006d|HUION Huion Tablet_HS611 Pad;usb|256c|006d|HUION 
Huion Tablet_HS611 Touch Strip;usb|256c|006d|HUION Huion Tablet_HS611 
Pen;usb|256c|006f|HUION Huion Tablet_HS611 Pen
 Width=10
 Height=6
 IntegratedIn=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/data/huion-inspiroy-q620m.tablet 
new/libwacom-2.18.0/data/huion-inspiroy-q620m.tablet
--- old/libwacom-2.17.0/data/huion-inspiroy-q620m.tablet        2025-11-12 
05:10:44.000000000 +0100
+++ new/libwacom-2.18.0/data/huion-inspiroy-q620m.tablet        2026-02-03 
12:32:51.000000000 +0100
@@ -2,16 +2,16 @@
 # https://github.com/JoseExposito/uclogic-libwacom-tablet-descriptions
 # If you own this tablet, please improve it.
 #
-# sysinfo missing - if you own this device please provide it. See this link
-# for details: https://github.com/linuxwacom/libwacom/wiki/Adding-a-new-device
+# sysinfo.6Qz87YOL9o
+# https://github.com/linuxwacom/wacom-hid-descriptors/tree/master/Huion%20Q620M
+# https://github.com/linuxwacom/wacom-hid-descriptors/issues/214
 
 [Device]
 Name=INSPIROY Q620M
 ModelName=INSPIROY Q620M
-# Product ID is unknown, please fix
-DeviceMatch=usb|256c|006e||HUION_T18d;usb|256c|006d||HUION_T18d;usb|256c|006f||HUION_T18d;usb|256c|0064||HUION_T18d;
-Width=9  # autogenerated value, please fix
-Height=6  # autogenerated value, please fix
+DeviceMatch=usb|256c|006d||HUION_T18d;
+Width=11 # 10.5 inch 266.7mm
+Height=7 # 6.56 inch 166.7mm
 Layout=huion-inspiroy-q620m.svg
 Styli=@generic-no-eraser;
 IntegratedIn=
@@ -28,3 +28,5 @@
 [Buttons]
 Left=A;B;C;D;E;F;G;H;I
 EvdevCodes=BTN_0;BTN_1;BTN_2;BTN_3;BTN_4;BTN_5;BTN_6;BTN_7;BTN_8
+
+Dial=I
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/data/huion-kamvas-13-gs1333.tablet 
new/libwacom-2.18.0/data/huion-kamvas-13-gs1333.tablet
--- old/libwacom-2.17.0/data/huion-kamvas-13-gs1333.tablet      2025-11-12 
05:10:44.000000000 +0100
+++ new/libwacom-2.18.0/data/huion-kamvas-13-gs1333.tablet      2026-02-03 
12:32:51.000000000 +0100
@@ -37,7 +37,7 @@
 [Device]
 Name=Huion Kamvas 13 (Gen 3)
 ModelName=GS1333
-DeviceMatch=usb|256c|2008||HUION_M22c;
+DeviceMatch=usb|256c|2008;
 Width=12
 Height=7
 Layout=huion-kamvas-13-gs1333.svg
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libwacom-2.17.0/data/huion-kamvas-pro-19-gt1902.tablet 
new/libwacom-2.18.0/data/huion-kamvas-pro-19-gt1902.tablet
--- old/libwacom-2.17.0/data/huion-kamvas-pro-19-gt1902.tablet  1970-01-01 
01:00:00.000000000 +0100
+++ new/libwacom-2.18.0/data/huion-kamvas-pro-19-gt1902.tablet  2026-02-03 
12:32:51.000000000 +0100
@@ -0,0 +1,30 @@
+# Huion
+# Kamvas Pro 19 (4K)
+# GT1902
+#
+# This tablet description file was initially generated using an automated tool:
+# https://github.com/JoseExposito/uclogic-libwacom-tablet-descriptions
+#
+# sysinfo.b93aiqXV5w.tar.gz
+# https://github.com/linuxwacom/wacom-hid-descriptors/issues/577
+
+[Device]
+Name=Kamvas Pro 19 (4K)
+ModelName=GT1902
+DeviceMatch=usb|256c|006b||HUION_M220;
+# This device may have another firmware match for HUION_M245, see
+# https://github.com/linuxwacom/libwacom/pull/946
+# HUION_FIRMWARE_ID="HUION_M220_241220"
+# HUION_MAGIC_BYTES="1303803f01b8b300ff3fd81303000000080040"
+Width=16
+Height=9
+Styli=@generic-no-eraser;
+IntegratedIn=Display
+
+[Features]
+NumStrips=0
+NumRings=0
+Reversible=false
+Stylus=true
+Touch=true
+TouchSwitch=true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/libwacom-2.17.0/data/layouts/huion-inspiroy-q620m.svg 
new/libwacom-2.18.0/data/layouts/huion-inspiroy-q620m.svg
--- old/libwacom-2.17.0/data/layouts/huion-inspiroy-q620m.svg   2025-11-12 
05:10:44.000000000 +0100
+++ new/libwacom-2.18.0/data/layouts/huion-inspiroy-q620m.svg   2026-02-03 
12:32:51.000000000 +0100
@@ -1,51 +1,263 @@
-<?xml version='1.0' encoding='ASCII'?>
-<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>
-<svg xmlns="http://www.w3.org/2000/svg"; version="1.1" 
style="color:#000000;stroke:#7f7f7f;fill:none;stroke-width:.25;font-size:8" 
id="huion-inspiroy-q620m" width="733" height="430">
-  <title id="title">INSPIROY Q620M</title>
-  <rect x="161" y="52" width="520" height="325"/>
-  <g>
-    <rect id="ButtonA" class="A Button" x="21" y="85" width="42" height="42"/>
-    <text id="LabelA" class="A Label" x="80.0" y="108" 
style="text-anchor:start;">A</text>
-    <path style="fill:none" d="M 65.0,106.0 H 72.0" id="LeaderA" class="Leader 
A"/>
-  </g>
-  <g>
-    <rect id="ButtonB" class="B Button" x="21" y="128" width="42" height="38"/>
-    <text id="LabelB" class="B Label" x="80.0" y="149" 
style="text-anchor:start;">B</text>
-    <path style="fill:none" d="M 65.0,147.0 H 72.0" id="LeaderB" class="Leader 
B"/>
-  </g>
-  <g>
-    <rect id="ButtonC" class="C Button" x="21" y="168" width="42" height="38"/>
-    <text id="LabelC" class="C Label" x="80.0" y="189" 
style="text-anchor:start;">C</text>
-    <path style="fill:none" d="M 65.0,187.0 H 72.0" id="LeaderC" class="Leader 
C"/>
-  </g>
-  <g>
-    <rect id="ButtonD" class="D Button" x="21" y="208" width="42" height="38"/>
-    <text id="LabelD" class="D Label" x="80.0" y="229" 
style="text-anchor:start;">D</text>
-    <path style="fill:none" d="M 65.0,227.0 H 72.0" id="LeaderD" class="Leader 
D"/>
-  </g>
-  <g>
-    <rect id="ButtonE" class="E Button" x="21" y="248" width="42" height="38"/>
-    <text id="LabelE" class="E Label" x="80.0" y="269" 
style="text-anchor:start;">E</text>
-    <path style="fill:none" d="M 65.0,267.0 H 72.0" id="LeaderE" class="Leader 
E"/>
-  </g>
-  <g>
-    <rect id="ButtonF" class="F Button" x="21" y="288" width="42" height="38"/>
-    <text id="LabelF" class="F Label" x="80.0" y="309" 
style="text-anchor:start;">F</text>
-    <path style="fill:none" d="M 65.0,307.0 H 72.0" id="LeaderF" class="Leader 
F"/>
-  </g>
-  <g>
-    <rect id="ButtonG" class="G Button" x="21" y="328" width="42" height="38"/>
-    <text id="LabelG" class="G Label" x="80.0" y="349" 
style="text-anchor:start;">G</text>
-    <path style="fill:none" d="M 65.0,347.0 H 72.0" id="LeaderG" class="Leader 
G"/>
-  </g>
-  <g>
-    <rect id="ButtonH" class="H Button" x="21" y="368" width="42" height="40"/>
-    <text id="LabelH" class="H Label" x="80.0" y="390" 
style="text-anchor:start;">H</text>
-    <path style="fill:none" d="M 65.0,388.0 H 72.0" id="LeaderH" class="Leader 
H"/>
-  </g>
-  <g>
-    <rect id="ButtonI" class="I Button" x="29" y="30" width="26" height="26"/>
-    <text id="LabelI" class="I Label" x="80.0" y="45" 
style="text-anchor:start;">I</text>
-    <path style="fill:none" d="M 65.0,43.0 H 72.0" id="LeaderI" class="Leader 
I"/>
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   version="1.1"
+   style="color:#000000;stroke:#7f7f7f;fill:none;stroke-width:.25;font-size:8"
+   id="huion-inspiroy-q620m"
+   width="733"
+   height="430"
+   sodipodi:docname="huion-inspiroy-q620m.svg"
+   inkscape:version="1.4.2 (ebf0e940d0, 2025-05-08)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:svg="http://www.w3.org/2000/svg";>
+  <defs
+     id="defs9" />
+  <sodipodi:namedview
+     id="namedview9"
+     pagecolor="#ffffff"
+     bordercolor="#000000"
+     borderopacity="0.25"
+     inkscape:showpageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     inkscape:deskcolor="#d1d1d1"
+     showgrid="false"
+     inkscape:zoom="2.8690314"
+     inkscape:cx="366.5"
+     inkscape:cy="214.88088"
+     inkscape:window-width="3072"
+     inkscape:window-height="1662"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="huion-inspiroy-q620m" />
+  <title
+     id="title">INSPIROY Q620M</title>
+  <rect
+     x="161"
+     y="52"
+     width="520"
+     height="325"
+     id="rect1" />
+  <g
+     id="g1">
+    <rect
+       id="ButtonA"
+       class="A Button"
+       x="21"
+       y="85"
+       width="42"
+       height="42" />
+    <text
+       id="LabelA"
+       class="A Label"
+       x="80.0"
+       y="108"
+       style="text-anchor:start;">A</text>
+    <path
+       style="fill:none"
+       d="M 65.0,106.0 H 72.0"
+       id="LeaderA"
+       class="Leader A" />
+  </g>
+  <g
+     id="g2">
+    <rect
+       id="ButtonB"
+       class="B Button"
+       x="21"
+       y="128"
+       width="42"
+       height="38" />
+    <text
+       id="LabelB"
+       class="B Label"
+       x="80.0"
+       y="149"
+       style="text-anchor:start;">B</text>
+    <path
+       style="fill:none"
+       d="M 65.0,147.0 H 72.0"
+       id="LeaderB"
+       class="Leader B" />
+  </g>
+  <g
+     id="g3">
+    <rect
+       id="ButtonC"
+       class="C Button"
+       x="21"
+       y="168"
+       width="42"
+       height="38" />
+    <text
+       id="LabelC"
+       class="C Label"
+       x="80.0"
+       y="189"
+       style="text-anchor:start;">C</text>
+    <path
+       style="fill:none"
+       d="M 65.0,187.0 H 72.0"
+       id="LeaderC"
+       class="Leader C" />
+  </g>
+  <g
+     id="g4">
+    <rect
+       id="ButtonD"
+       class="D Button"
+       x="21"
+       y="208"
+       width="42"
+       height="38" />
+    <text
+       id="LabelD"
+       class="D Label"
+       x="80.0"
+       y="229"
+       style="text-anchor:start;">D</text>
+    <path
+       style="fill:none"
+       d="M 65.0,227.0 H 72.0"
+       id="LeaderD"
+       class="Leader D" />
+  </g>
+  <g
+     id="g5">
+    <rect
+       id="ButtonE"
+       class="E Button"
+       x="21"
+       y="248"
+       width="42"
+       height="38" />
+    <text
+       id="LabelE"
+       class="E Label"
+       x="80.0"
+       y="269"
+       style="text-anchor:start;">E</text>
+    <path
+       style="fill:none"
+       d="M 65.0,267.0 H 72.0"
+       id="LeaderE"
+       class="Leader E" />
+  </g>
+  <g
+     id="g6">
+    <rect
+       id="ButtonF"
+       class="F Button"
+       x="21"
+       y="288"
+       width="42"
+       height="38" />
+    <text
+       id="LabelF"
+       class="F Label"
+       x="80.0"
+       y="309"
+       style="text-anchor:start;">F</text>
+    <path
+       style="fill:none"
+       d="M 65.0,307.0 H 72.0"
+       id="LeaderF"
+       class="Leader F" />
+  </g>
+  <g
+     id="g7">
+    <rect
+       id="ButtonG"
+       class="G Button"
+       x="21"
+       y="328"
+       width="42"
+       height="38" />
+    <text
+       id="LabelG"
+       class="G Label"
+       x="80.0"
+       y="349"
+       style="text-anchor:start;">G</text>
+    <path
+       style="fill:none"
+       d="M 65.0,347.0 H 72.0"
+       id="LeaderG"
+       class="Leader G" />
+  </g>
+  <g
+     id="g8">
+    <rect
+       id="ButtonH"
+       class="H Button"
+       x="21"
+       y="368"
+       width="42"
+       height="40" />
+    <text
+       id="LabelH"
+       class="H Label"
+       x="80.0"
+       y="390"
+       style="text-anchor:start;">H</text>
+    <path
+       style="fill:none"
+       d="M 65.0,388.0 H 72.0"
+       id="LeaderH"
+       class="Leader H" />
+  </g>
+  <g
+     id="g9">
+    <rect
+       id="ButtonI"
+       class="I Button ModeSwitch"
+       x="29"
+       y="30"
+       width="26"
+       height="26" />
+    <text
+       id="LabelI"
+       class="I Label ModeSwitch"
+       x="80.0"
+       y="45"
+       style="text-anchor:start;">I</text>
+    <path
+       style="fill:none"
+       d="M 65.0,43.0 H 72.0"
+       id="LeaderI"
+       class="Leader I ModeSwitch" />
+  </g>
+  <g
+     id="g8-3"
+     
style="color:#000000;font-size:8px;fill:none;stroke:#7f7f7f;stroke-width:0.25"
+     transform="matrix(1.5169492,0,0,1.5169492,-33.220342,-93.525428)">
+    <circle
+       id="Dial"
+       class="Dial TouchDial"
+       cx="50"
+       cy="90"
+       r="22" />
+    <path
+       id="LeaderDialCCW"
+       class="DialCCW Dial Leader"
+       d="M 57,75 H 74" />
+    <path
+       id="LeaderDialCW"
+       class="DialCW Dial Leader"
+       d="M 57,105 H 74" />
+    <text
+       id="LabelDialCCW"
+       class="DialCCW Dial Label"
+       x="76"
+       y="78"
+       style="text-anchor:start">CCW</text>
+    <text
+       id="LabelDialCW"
+       class="DialCW Dial Label"
+       x="76"
+       y="107"
+       style="text-anchor:start">CW</text>
   </g>
 </svg>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/data/layouts/xp-pen-deco02.svg 
new/libwacom-2.18.0/data/layouts/xp-pen-deco02.svg
--- old/libwacom-2.17.0/data/layouts/xp-pen-deco02.svg  1970-01-01 
01:00:00.000000000 +0100
+++ new/libwacom-2.18.0/data/layouts/xp-pen-deco02.svg  2026-02-03 
12:32:51.000000000 +0100
@@ -0,0 +1,165 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" 
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd";>
+<svg
+   id="xp-pen-deco02"
+   width="10in"
+   height="5.6300001in"
+   style="color:#000000;stroke:#7f7f7f;fill:none;stroke-width:.25;font-size:8"
+   version="1.1"
+   viewBox="0 0 254 143.002"
+   xmlns="http://www.w3.org/2000/svg"; >
+  <title
+     id="title">XP-Pen Deco 02</title>
+  <g
+     id="F">
+    <circle
+       id="ButtonF"
+       class="F Button"
+       cx="30.5"
+       cy="123.5"
+       r="4.5" />
+    <path
+       id="LeaderF"
+       class="F Leader"
+       d="M 38 123.5 H 63.5" />
+    <text
+       id="LabelF"
+       class="F Label"
+       x="66.5"
+       y="123.5"
+       style="text-anchor:start">F</text>
+  </g>
+  <g
+     id="E">
+    <circle
+       id="ButtonE"
+       class="E Button"
+       cx="30.5"
+       cy="108.5"
+       r="4.5" />
+    <path
+       id="LeaderE"
+       class="E Leader"
+       d="M 38 108.5 H 63.5" />
+    <text
+       id="LabelE"
+       class="E Label"
+       x="66.5"
+       y="108.5"
+       style="text-anchor:start">E</text>
+  </g>
+  <g
+     id="D">
+    <circle
+       id="ButtonD"
+       class="D Button"
+       cx="30.5"
+       cy="93.5"
+       r="4.5" />
+    <path
+       id="LeaderD"
+       class="D Leader"
+       d="M 38 93.5 H 63.5" />
+    <text
+       id="LabelD"
+       class="D Label"
+       x="66.5"
+       y="93.5"
+       style="text-anchor:start">D</text>
+  </g>
+  <g
+     id="C">
+    <circle
+       id="ButtonC"
+       class="C Button"
+       cx="30.5"
+       cy="49.5"
+       r="4.5" />
+    <path
+       id="LeaderC"
+       class="C Leader"
+       d="M 38 49.5 H 63.5" />
+    <text
+       id="LabelC"
+       class="C Label"
+       x="66.5"
+       y="49.5"
+       style="text-anchor:start">C</text>
+  </g>
+  <g
+     id="B">
+    <circle
+       id="ButtonB"
+       class="B Button"
+       cx="30.5"
+       cy="34.5"
+       r="4.5" />
+    <path
+       id="LeaderB"
+       class="B Leader"
+       d="M 38 34.5 H 63.5" />
+    <text
+       id="LabelB"
+       class="B Label"
+       x="66.5"
+       y="34.5"
+       style="text-anchor:start">B</text>
+  </g>
+  <g
+     id="A">
+    <circle
+       id="ButtonA"
+       class="A Button"
+       cx="30.5"
+       cy="19.5"
+       r="4.5" />
+    <path
+       id="LeaderA"
+       class="A Leader"
+       d="m 38 19 26 0" />
+    <text
+       id="LabelA"
+       class="A Label"
+       x="66.5"
+       y="19"
+       style="text-anchor:start">A</text>
+  </g>
+  <g
+     id="DialGroup">
+      <circle
+     id="Dial"
+     class="TouchDial Dial"
+     cx="30.5"
+     cy="71"
+     r="10" />
+    <path
+       id="LeaderDialCCW"
+       class="DialCCW Dial Leader"
+       d="m 45.5 65 h 10" />
+    <path
+       id="DialCCW"
+       class="DialCCW Dial Button"
+       d="m 40 64 1 1.5 0 -0.5 c 0.5 0 2 1 2.5 1.5 0 -0.5 -1.5 -2 -2 -2.5 l 0 
-0.5 z"
+       />
+    <text
+       id="LabelDialCCW"
+       class="DialCCW Dial Label"
+       x="57"
+       y="65"
+       style="text-anchor:start;">CWW</text>
+        <path
+       id="LeaderDialCW"
+       class="DialCW Dial Leader"
+       d="m 45.5,76.5 h 10" />
+    <path
+       id="DialCW"
+       class="DialCW Dial Button"
+       d="m 40,78 1,-1.5 v 0.350377 c 0.5,0 2,-1 2.5,-1.5 0,0.5 -1.5,2 -2,2.5 
v 0.5 z" />
+      <text
+       id="LabelDialCW"
+       class="DialCW Dial Label"
+       x="57"
+       y="76.5"
+       style="text-anchor:start">CW</text>
+  </g>
+</svg>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/data/wacom-isdv4-2d1f-53d1.tablet 
new/libwacom-2.18.0/data/wacom-isdv4-2d1f-53d1.tablet
--- old/libwacom-2.17.0/data/wacom-isdv4-2d1f-53d1.tablet       1970-01-01 
01:00:00.000000000 +0100
+++ new/libwacom-2.18.0/data/wacom-isdv4-2d1f-53d1.tablet       2026-02-03 
12:32:51.000000000 +0100
@@ -0,0 +1,20 @@
+# Lenovo ThinkVision M14t Gen 2
+# Sensor Type: AES
+# Features: Touch (Integrated), Tilt
+#
+# Manually generated from sysinfo.XXG8yghpWe.tar.gz
+# 
https://github.com/linuxwacom/wacom-hid-descriptors/issues/575#issue-3676825694
+
+[Device]
+Name=Lenovo ThinkVision M14t Gen 2
+ModelName=
+DeviceMatch=usb|2d1f|53d1
+Class=ISDV4
+Width=12
+Height=7
+IntegratedIn=Display
+Styli=@isdv4-aes;
+
+[Features]
+Stylus=true
+Touch=true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/data/wacom.stylus 
new/libwacom-2.18.0/data/wacom.stylus
--- old/libwacom-2.17.0/data/wacom.stylus       2025-11-12 05:10:44.000000000 
+0100
+++ new/libwacom-2.18.0/data/wacom.stylus       2026-02-03 12:32:51.000000000 
+0100
@@ -6,6 +6,7 @@
 Buttons=2
 Axes=Tilt;Pressure;Distance;
 Type=General
+IsGenericStylus=true
 
 [0x0:0xffffe]
 Name=General Pen Eraser
@@ -15,6 +16,7 @@
 Buttons=2
 Axes=Tilt;Pressure;Distance;
 Type=General
+IsGenericStylus=true
 
 [0x0:0xffffd]
 Name=General Pen with no Eraser
@@ -22,6 +24,7 @@
 Buttons=2
 Axes=Pressure;
 Type=General
+IsGenericStylus=true
 
 [0x56a:0x1]
 # Lenovo ; VID_NONE     | 0x0000 | BAT_SWAP
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/data/xp-pen-deco-mw.tablet 
new/libwacom-2.18.0/data/xp-pen-deco-mw.tablet
--- old/libwacom-2.17.0/data/xp-pen-deco-mw.tablet      2025-11-12 
05:10:44.000000000 +0100
+++ new/libwacom-2.18.0/data/xp-pen-deco-mw.tablet      2026-02-03 
12:32:51.000000000 +0100
@@ -3,11 +3,18 @@
 #
 # sysinfo.VOAFvy7j7z.tar.gz
 # https://github.com/linuxwacom/wacom-hid-descriptors/issues/291
+# sysinfo.xEHXYQ3D0h.tar.gz
+# https://github.com/linuxwacom/wacom-hid-descriptors/issues/566
+# sysinfo.dwWr0dkJW2.tar.gz
+# https://github.com/linuxwacom/wacom-hid-descriptors/issues/567
+# sysinfo.znrBdxmBWS.tar.gz
+# https://github.com/linuxwacom/wacom-hid-descriptors/issues/568
+
 
 [Device]
 Name=XP-Pen Deco MW
 ModelName=Deco_MW
-DeviceMatch=usb|28bd|0936
+DeviceMatch=usb|28bd|0936;bluetooth|28bd|0936;
 Width=8
 Height=5
 Layout=xp-pen-deco-mw.svg
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/data/xp-pen-deco02.tablet 
new/libwacom-2.18.0/data/xp-pen-deco02.tablet
--- old/libwacom-2.17.0/data/xp-pen-deco02.tablet       1970-01-01 
01:00:00.000000000 +0100
+++ new/libwacom-2.18.0/data/xp-pen-deco02.tablet       2026-02-03 
12:32:51.000000000 +0100
@@ -0,0 +1,46 @@
+# XP-Pen
+# Deco 02
+#
+# sysinfo.4ksH4T345j
+# https://github.com/linuxwacom/wacom-hid-descriptors/issues/506
+#
+# Button Map:
+# (A=1, B=2, C=3, ...)
+#
+#         *------------------------------------*
+#         |                                    |
+#  A      |                                    |
+#  B      |                                    |
+#  C      |                                    |
+#  (Dial) |              TABLET                |
+#  D      |                                    |
+#  E      |                                    |
+#  F      |                                    |
+#         |                                    |
+#         *------------------------------------*
+
+[Device]
+Name=XP-PEN DECO 02
+ModelName=
+DeviceMatch=usb|28bd|0803
+PairedIDs=
+Width=10
+Height=6
+IntegratedIn=
+Layout=xp-pen-deco02.svg
+# Only the discontinued P05 stylus is supported, which is single button only.
+# Until one-button configurations are supported, a two-button generic must be 
used.
+Styli=@generic-with-eraser
+
+[Features]
+Stylus=true
+Reversible=true
+Touch=false
+TouchSwitch=false
+NumRings=0
+NumDials=1
+NumStrips=0
+
+[Buttons]
+Left=A;B;C;D;E;F
+EvdevCodes=BTN_0;BTN_1;BTN_2;BTN_3;BTN_4;BTN_5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/libwacom/libwacom-database.c 
new/libwacom-2.18.0/libwacom/libwacom-database.c
--- old/libwacom-2.17.0/libwacom/libwacom-database.c    2025-11-12 
05:10:44.000000000 +0100
+++ new/libwacom-2.18.0/libwacom/libwacom-database.c    2026-02-03 
12:32:51.000000000 +0100
@@ -571,6 +571,18 @@
                                  groups[i],
                                  error->message);
                g_clear_error(&error);
+               stylus->is_generic_stylus = boolean_or_fallback(
+                       keyfile,
+                       groups[i],
+                       "IsGenericStylus",
+                       aliased ? aliased->is_generic_stylus : FALSE,
+                       error);
+               if (error && error->code == G_KEY_FILE_ERROR_INVALID_VALUE)
+                       g_warning("Stylus %s (%s) %s\n",
+                                 stylus->name,
+                                 groups[i],
+                                 error->message);
+               g_clear_error(&error);
                stylus->num_buttons =
                        int_or_fallback(keyfile,
                                        groups[i],
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/libwacom/libwacom.c 
new/libwacom-2.18.0/libwacom/libwacom.c
--- old/libwacom-2.17.0/libwacom/libwacom.c     2025-11-12 05:10:44.000000000 
+0100
+++ new/libwacom-2.18.0/libwacom/libwacom.c     2026-02-03 12:32:51.000000000 
+0100
@@ -1814,6 +1814,12 @@
 }
 
 LIBWACOM_EXPORT int
+libwacom_stylus_is_generic(const WacomStylus *stylus)
+{
+       return stylus->is_generic_stylus;
+}
+
+LIBWACOM_EXPORT int
 libwacom_stylus_has_lens(const WacomStylus *stylus)
 {
        return stylus->has_lens;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/libwacom/libwacom.h 
new/libwacom-2.18.0/libwacom/libwacom.h
--- old/libwacom-2.17.0/libwacom/libwacom.h     2025-11-12 05:10:44.000000000 
+0100
+++ new/libwacom-2.18.0/libwacom/libwacom.h     2026-02-03 12:32:51.000000000 
+0100
@@ -1106,6 +1106,24 @@
 libwacom_stylus_is_eraser(const WacomStylus *stylus);
 
 /**
+ * Check if the given stylus is a generic stylus.
+ *
+ * Generic styli are styli that cannot be uniquely identified by their
+ * tool ID. Instead a tool ID is assigned by libwacom but these styli
+ * cannot be differentiated at runtime. A device may support multiple
+ * generic styli but there is no information which stylus is in use
+ * at any time.
+ *
+ * @param stylus The stylus to query
+ * @return Non-zero if the stylus is a generic stylus, zero otherwise
+ *
+ * @since 2.18
+ * @ingroup styli
+ */
+int
+libwacom_stylus_is_generic(const WacomStylus *stylus);
+
+/**
  * @param stylus The stylus to query
  * @return Whether the stylus has a lens
  *
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/libwacom/libwacom.sym 
new/libwacom-2.18.0/libwacom/libwacom.sym
--- old/libwacom-2.17.0/libwacom/libwacom.sym   2025-11-12 05:10:44.000000000 
+0100
+++ new/libwacom-2.18.0/libwacom/libwacom.sym   2026-02-03 12:32:51.000000000 
+0100
@@ -98,3 +98,7 @@
 LIBWACOM_2.15 {
     libwacom_get_button_modeswitch_mode;
 } LIBWACOM_2.14;
+
+LIBWACOM_2.18 {
+    libwacom_stylus_is_generic;
+} LIBWACOM_2.15;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/libwacom/libwacomint.h 
new/libwacom-2.18.0/libwacom/libwacomint.h
--- old/libwacom-2.17.0/libwacom/libwacomint.h  2025-11-12 05:10:44.000000000 
+0100
+++ new/libwacom-2.18.0/libwacom/libwacomint.h  2026-02-03 12:32:51.000000000 
+0100
@@ -143,6 +143,7 @@
        char *group;
        int num_buttons;
        gboolean has_eraser;
+       gboolean is_generic_stylus;
        GArray *paired_styli;          /* [WacomStylus*, ...] */
        GArray *deprecated_paired_ids; /* [int, ...] */
        GArray *paired_stylus_ids;     /* [WacomStylusId, ...], NULL once 
parsing is
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/meson.build 
new/libwacom-2.18.0/meson.build
--- old/libwacom-2.17.0/meson.build     2025-11-12 05:10:44.000000000 +0100
+++ new/libwacom-2.18.0/meson.build     2026-02-03 12:32:51.000000000 +0100
@@ -1,5 +1,5 @@
 project('libwacom', 'c',
-       version: '2.17.0',
+       version: '2.18.0',
        license: 'HPND',
        default_options: [ 'c_std=gnu99', 'warning_level=2' ],
        meson_version: '>= 0.58.0')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/libwacom-2.17.0/test/test-stylus-validity.c 
new/libwacom-2.18.0/test/test-stylus-validity.c
--- old/libwacom-2.17.0/test/test-stylus-validity.c     2025-11-12 
05:10:44.000000000 +0100
+++ new/libwacom-2.18.0/test/test-stylus-validity.c     2026-02-03 
12:32:51.000000000 +0100
@@ -257,6 +257,22 @@
 }
 
 static void
+test_generic(gconstpointer data)
+{
+       const WacomStylus *stylus = data;
+
+       g_assert_true(libwacom_stylus_is_generic(stylus));
+}
+
+static void
+test_not_generic(gconstpointer data)
+{
+       const WacomStylus *stylus = data;
+
+       g_assert_false(libwacom_stylus_is_generic(stylus));
+}
+
+static void
 test_buttons(gconstpointer data)
 {
        const WacomStylus *stylus = data;
@@ -352,7 +368,15 @@
 setup_emr_tests(const WacomStylus *stylus)
 {
        switch (libwacom_stylus_get_id(stylus)) {
-       case 0xffffd:
+       case 0xfffff: /* GENERIC_PEN_WITH_ERASER */
+       case 0xffffe: /* GENERIC_ERASER */
+               add_test(stylus, test_generic);
+               add_test(stylus, test_pressure);
+               add_test(stylus, test_distance);
+               add_test(stylus, test_tilt);
+               break;
+       case 0xffffd: /* GENERIC_PEN_NO_ERASER */
+               add_test(stylus, test_generic);
                add_test(stylus, test_pressure);
                add_test(stylus, test_no_distance);
                add_test(stylus, test_no_tilt);
@@ -360,6 +384,7 @@
        case 0x006:
        case 0x096:
        case 0x097:
+               add_test(stylus, test_not_generic);
                add_test(stylus, test_no_pressure);
                add_test(stylus, test_distance);
                add_test(stylus, test_no_tilt);
@@ -368,6 +393,7 @@
        case 0x017:
        case 0x094:
        case 0x806:
+               add_test(stylus, test_not_generic);
                add_test(stylus, test_no_pressure);
                add_test(stylus, test_distance);
                add_test(stylus, test_tilt);
@@ -375,11 +401,13 @@
        case 0x021:
        case 0x8e2:
        case 0x862:
+               add_test(stylus, test_not_generic);
                add_test(stylus, test_pressure);
                add_test(stylus, test_distance);
                add_test(stylus, test_no_tilt);
                break;
        default:
+               add_test(stylus, test_not_generic);
                add_test(stylus, test_pressure);
                add_test(stylus, test_tilt);
                add_test(stylus, test_distance);

Reply via email to