我给自己买了 XP-Pen Deco mini 7 绘图板。指针和压力开箱即用,但我想将其旋转到左手模式并更改键盘和手写笔按钮上的操作。
我在用着摇摆archlinux 上的 Wayland 合成器。
答案1
前言
有官方的linux“驱动程序”XP-Pen 网站上(还奥尔包)。据我所知,它是一个用户空间应用程序(与仅 X11 的 Qt5 链接),它应该通过 DE 自动启动,并以某种方式通过 USB 与平板电脑交互。它带有 udev 规则,使普通用户可以写入 XP-Pen USB 设备。
strace
显示它尝试了所有 USB 设备 ( /dev/bus/usb/*/*
),但最终无法找到我的平板电脑。也许你会有更好的运气
平板电脑事件处理概述
+————————————————+
| |
| Wayland |
| compositor |
| |
+——————————+ event +—————————+ event +——————————————+ | event +———————+
| Tablet |————————>| Linux |————————>| libinput | |————————>| app |
+——————————+ +—————————+ | | | +———————+
| +——————————+ | |
| | libwacom | | |
+—+——————————+—+—+
Wayland 合成器(Sway、Mutter、KWin 到 Qt)使用库输入处理输入设备及其事件。它依次使用libwacom有关平板电脑的硬件信息(按钮数量、其代码、手写笔是否有“橡胶”笔尖等)
库输入可以通过以下方式与 X11 一起使用xf86-输入-libinput因此以下步骤不仅限于 Wayland。
左手模式
如果libwacom报道称平板电脑是“可逆的”,库输入可以配置为将指针事件从它转换为左手模式。
基本上libwacom是已知图形输入板的数据库,每个图形输入板都在.tablet
文件中进行了描述(请参阅整个列表在回购协议中)。
您可以检查是否libwacom了解您的平板电脑:
$ libwacom-list-local-devices
/dev/input/event19 is a tablet but not supported by libwacom
Failed to find any devices known to libwacom.
如果没有,你就必须.tablet
自己创造。对于 XP-Pen Deco mini 7,我在以下位置创建了以下文件/usr/share/libwacom/xp-pen-deco-mini-7.tablet
:
# XP-Pen
# Deco mini7
#
[Device]
Name=XP-Pen Deco mini7
ModelName=
DeviceMatch=usb:28bd:0928
Class=Bamboo
Width=7
Height=4.37
Styli=0xffffd;
[Features]
Stylus=true
Reversible=true
Touch=false
Buttons=0
最重要的是两个选择:
DeviceMatch
指定如何识别平板电脑并具有格式BUS:VENDOR_ID:MODEL_ID
。您可以通过以下方式找到该值udevadm
:
$ udevadm info /dev/input/event19
...
E: ID_VENDOR_ID=28bd
...
E: ID_MODEL_ID=0928
...
E: ID_BUS=usb
Reversible
表示平板电脑可以在左手模式下使用。
(其他选项的更多详细信息和说明可以在回购中的示例)
验证 libwacom 现在是否可以识别平板电脑:
$ libwacom-list-local-devices
devices:
- name: 'XP-Pen Deco mini7'
bus: 'usb'
vid: '0x28bd'
pid: '0x0928'
nodes:
- /dev/input/event19
现在您可以配置库输入通过你的合成器。对于 Sway 添加到您的配置
input type:tablet_tool left_handed enabled
笔记您可能需要重新插入平板电脑才能应用配置。
键盘和手写笔按钮映射
XP-Pen 将键盘按钮事件作为单独的键盘设备发送。您可以使用以下命令查看它们evtest
(此处按钮已映射):
$ sudo evtest /dev/input/event18
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x28bd product 0x928 version 0x100
Input device name: "UGTABLET 6 inch PenTablet Keyboard"
Supported events:
...
Testing ... (interrupt to exit)
Event: time 1648039909.676558, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e0
Event: time 1648039909.676558, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 1
Event: time 1648039909.676558, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70056
Event: time 1648039909.676558, type 1 (EV_KEY), code 44 (KEY_Z), value 1
Event: time 1648039909.676558, -------------- SYN_REPORT ------------
^Z
[1]+ Stopped sudo evtest /dev/input/event18
$ fg
sudo evtest /dev/input/event18
Event: time 1648039909.764562, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e0
Event: time 1648039909.764562, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 0
Event: time 1648039909.764562, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70056
Event: time 1648039909.764562, type 1 (EV_KEY), code 44 (KEY_Z), value 0
Event: time 1648039909.764562, -------------- SYN_REPORT ------------
Event: time 1648039944.475630, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e0
Event: time 1648039944.475630, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 1
Event: time 1648039944.475630, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70057
Event: time 1648039944.475630, type 1 (EV_KEY), code 183 (KEY_F13), value 1
Event: time 1648039944.475630, -------------- SYN_REPORT ------------
Event: time 1648039944.551696, type 4 (EV_MSC), code 4 (MSC_SCAN), value 700e0
Event: time 1648039944.551696, type 1 (EV_KEY), code 29 (KEY_LEFTCTRL), value 0
Event: time 1648039944.551696, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70057
Event: time 1648039944.551696, type 1 (EV_KEY), code 183 (KEY_F13), value 0
Event: time 1648039944.551696, -------------- SYN_REPORT ------------
(这是按下前两个按钮的结果。由于其中一个按钮被映射到Ctrl+ Z,bash
暂停evtest
)
它们可以映射为哈维数据库(7)。创建/etc/udev/hwdb.d/62-xp-pen-deco-mini-7.hwdb
包含内容的文件:
evdev:input:b0003v28BDp0928*
KEYBOARD_KEY_70005=kp0
KEYBOARD_KEY_70008=kp1
KEYBOARD_KEY_700e2=kp2
KEYBOARD_KEY_7002c=f16
KEYBOARD_KEY_70016=f15
KEYBOARD_KEY_7001d=f14
KEYBOARD_KEY_70057=f13
KEYBOARD_KEY_70056=z
第一行匹配类似于.tablet
file 的设备并且具有 format b{BUS_ID}v{VENDOR_ID}p{MODEL_ID}
。对于 USB 来说{BUS_ID}
是0003
.
然后您将扫描代码写入格式的键映射KEYBOARD_KEY_{scancode}={key}
。扫描码从evtest
输出(行)中获取MSC_SCAN
,键名称可以在中找到/usr/include/linux/input-event-codes.h
并且必须为小写。在上面的示例中,我将除最后一个按钮之外的所有按钮都映射到通用键,这样我就可以根据每个应用程序将特定操作绑定到它们。
对于 XP-Pen Deco mini 7,默认映射为:
70005 — 乙
70008 — e
700e2 — 左翼
7002c — 空间
700e2, 70016 — 左ctrl, s
700e2、7001d — 左ctrl、z
700e2、70057 — 左ctrl、kpplus
700e2, 70056 — 左ctrl, kpminus
但每个平板电脑型号的这些都不同。
笔记由于我不映射 scancode 700e2
,最后四个键将通过Ctrl
手写笔按钮事件是在平板电脑输入本身上生成的:
$ sudo evtest /dev/input/event19
Input driver version is 1.0.1
Input device ID: bus 0x3 vendor 0x28bd product 0x928 version 0x100
Input device name: "UGTABLET 6 inch PenTablet"
...
Event: time 1648041701.178269, -------------- SYN_REPORT ------------
Event: time 1648041701.686282, type 4 (EV_MSC), code 4 (MSC_SCAN), value d0044
Event: time 1648041701.686282, type 1 (EV_KEY), code 331 (BTN_STYLUS), value 1
Event: time 1648041701.786243, -------------- SYN_REPORT ------------
Event: time 1648041701.790243, type 4 (EV_MSC), code 4 (MSC_SCAN), value d0044
Event: time 1648041701.790243, type 1 (EV_KEY), code 331 (BTN_STYLUS), value 0
Event: time 1648041704.130289, -------------- SYN_REPORT ------------
Event: time 1648041704.134281, type 4 (EV_MSC), code 4 (MSC_SCAN), value d0045
Event: time 1648041704.134281, type 1 (EV_KEY), code 277 (BTN_FORWARD), value 1
Event: time 1648041704.262281, -------------- SYN_REPORT ------------
Event: time 1648041704.266286, type 4 (EV_MSC), code 4 (MSC_SCAN), value d0045
Event: time 1648041704.266286, type 1 (EV_KEY), code 277 (BTN_FORWARD), value 0
默认情况下,下部按钮( scancode d0044
)会导致“按下鼠标中键”事件,这非常方便,但上部按钮没有可见的效果。有两种可能的方式来利用它:
- 映射到任意鼠标按钮并将操作绑定到应用程序中的该按钮
KEYBOARD_KEY_d0045=btn_forward
- 映射到
BTN_TOOL_RUBBER
模拟“橡胶”笔尖
KEYBOARD_KEY_d0045=btn_tool_rubber
添加首选变体/etc/udev/hwdb.d/62-xp-pen-deco-mini-7.hwdb
,然后编译二进制 hwdb
$ sudo systemd-hwdb update
并将映射应用于设备:
$ sudo udevadm trigger
笔记您可能需要重新插入平板电脑和/或重新启动 DE 应用程序才能使用此映射。
答案2
要处理所有选项,例如绘图区域、左手模式、宽高比、笔的压力等,请遵循MadRunner 的自我回答(段落左手模式)。
.tablet
创建配置后,如果您想为该libwacom
项目做出贡献(这样那些在您之后到达的人就不必执行此过程),请按照以下说明提出拉取请求:“贡献于libwacom
”
要更改图形输入板按钮的操作,有一种更简单的方法。您可以使用输入重映射器。
答案3
对于任何也尝试这样做的人,在花费 4 小时尝试使其工作后,请尝试使用
evdev:名称:(设备名称):*
代替
evdev:输入:b0003v28BDp0928*
非常感谢你的回答顺便说一句!虽然我还没有弄清楚如何btn_middle
用滚动来完成工作。