如何匹配名称含特殊字符(含回车)的Xinput触摸设备并切换其方向?
如何匹配名称含特殊字符(含回车)的Xinput触摸设备并切换其方向?
这种带换行的设备名确实挺闹心的,我之前处理过类似的情况,给你分享几个实用的解决思路,完美避开那个奇葩的设备名:
方法一:用固定硬件属性动态获取设备ID
设备的Xinput ID会变,但硬件的Product ID、Vendor ID这些属性是天生固定的,我们可以靠这个精准定位:
- 先运行
xinput list --long,找到你的触摸设备,记下它的Product ID(格式一般是1234:5678这种) - 用下面的命令自动获取当前设备ID,然后直接设置变换矩阵:
这个命令会遍历所有输入设备,找到匹配Product ID的那个,自动提取它的当前ID,完全不用管奇葩的设备名。# 把这里的PRODUCT_ID换成你设备的实际值 PRODUCT_ID="1234:5678" TOUCH_ID=$(xinput list --id-only | xargs -I {} xinput list-props {} | grep -B10 -A10 "$PRODUCT_ID" | grep -E "^[0-9]+" | head -n1) xinput set-prop $TOUCH_ID --type=float "Coordinate Transformation Matrix" 0 -1 1 1 0 0 0 0 1
方法二:直接匹配设备名片段(忽略换行)
如果不想记硬件ID,也可以用命令工具的特殊选项处理换行符:
设备名里的回车本质是换行符\n,我们可以用-z选项让工具把整个带换行的设备名当成一个完整字符串处理:
xinput list --name-only -z | grep -z "Touch Touch Device.*MF40WH00U-CT-A1-6P" | xargs -0 -I {} xinput set-prop "{}" --type=float "Coordinate Transformation Matrix" 0 -1 1 1 0 0 0 0 1
简单解释下各部分的作用:
xinput list --name-only -z:用空字符分隔每个设备名,确保带换行的名字不会被拆成两段grep -z "Touch Touch Device.*MF40WH00U-CT-A1-6P":匹配同时包含前后两段文本的设备名,.*会自动匹配中间的换行xargs -0:同样用空字符分隔输入,保证完整的设备名能传递给xinput
方法三:给设备设固定别名(一劳永逸)
如果每次开机都要跑命令嫌麻烦,还可以用udev规则给设备起个固定别名,以后直接用别名操作:
- 先找到设备的Vendor ID和Product ID,运行:
(把udevadm info --name=/dev/input/eventX --attribute-walk | grep -E "idVendor|idProduct"eventX换成你触摸设备对应的节点,从xinput list --long的输出里能找到) - 在
/etc/udev/rules.d/目录下新建一个规则文件,比如99-custom-touchscreen.rules,写入:SUBSYSTEM=="input", ATTRS{idVendor}=="你的Vendor ID", ATTRS{idProduct}=="你的Product ID", SYMLINK+="input/my_touchscreen" - 重新加载udev规则并生效:
udevadm control --reload-rules && udevadm trigger - 之后就可以直接用别名设置变换矩阵了:
xinput set-prop "my_touchscreen" --type=float "Coordinate Transformation Matrix" 0 -1 1 1 0 0 0 0 1
备注:内容来源于stack exchange,提问作者Moder New
相关产品推荐
相关产品推荐

