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);
