为什么xsetwacom无法在udev上运行?


8

我编写了一个脚本,将Wacom Bamboo数位板旋转180度。当我以自己(用户)或root身份执行它时,它可以正常工作,但是从udev(即,将平板电脑插入usb端口中)启动时,它将无法工作。

Udev规则

SUBSYSTEMS=="usb", ATTRS{idVendor}=="056a", ATTRS{idProduct}=="00d1", ATTRS{manufacturer}=="Wacom Co.,Ltd.", RUN+="/usr/local/bin/red-wacom-bamboo.sh"

Wacom脚本/usr/local/bin/red-wacom-bamboo.sh

#!/usr/bin/env bash

exec > /tmp/red-wacom.log
exec 2>&1

# I had to do this otherwise xsetwacom would say:
# "Failed to open Display ."
# Is there a way to do this without using my username?
export XAUTHORITY=/home/redsandro/.Xauthority
export DISPLAY=:0

/usr/bin/xsetwacom set "Wacom Bamboo 2FG 4x5 Pen stylus" Rotate half
/usr/bin/xsetwacom set "Wacom Bamboo 2FG 4x5 Finger touch" Rotate half

结果在/tmp/red-wacom.log中

Cannot find device 'Wacom Bamboo 2FG 4x5 Pen stylus'.
Cannot find device 'Wacom Bamboo 2FG 4x5 Finger touch'.

(请注意,日志中的错误表示udev规则本身不是问题。)

我尝试sleep在脚本中设置一个,也许需要几毫秒。但这无济于事。

  • 为什么直接从中调用该脚本不起作用udev
    • 我该如何解决?
  • 我可以udev以特定用户的身份调用脚本吗?(例如,同步/home到外部备份驱动器-/ home /仅对其用户可见)

Answers:


3

有一个相当简单的解决方法,您可以将以下内容添加到您xorg.conf的文件中(或在中的文件中xorg.conf.d,如下所示):

anthony@Watt:/etc/X11/xorg.conf.d$ cat 55-local-wacom.conf 
Section "InputClass"
       Identifier "Wacom Left Handed"
       MatchDriver "wacom"
       Option "Rotate" "half"
EndSection

检查wacom(4)联机帮助页以获取可以设置的所有选项的详细信息。

(理论上,您可以MatchProduct用来分别配置触摸板,笔,橡皮擦等,但是当我尝试过一会儿时,它导致Xorg出现段错误。如果我尝试将它们浮动,则同样。但是您没有做任何操作其中...也许该错误现已修复。)


哇,经过这么多的谷歌搜索之后,我再也没有遇到过。我赞成你的回答。我在工作时会尝试一下。有55什么具体原因吗?我一直使用“最后处理无数个条目的想法,因此最好跳过自定义条目的数字”。
Redsandro

@Redsandro /usr/share/X11/xorg.conf.d/50-wacom.conf在我的系统上是50,所以我选择了55。甚至不重要。
derobert

此答案提供了有用的信息,但没有回答原始问题。如果X服务器启动插入USB Wacom设备怎么办?
Lqueryvg

1
@Lqueryvg InputClass适用于热插拔的设备,因此它也应该起作用。
derobert 2015年

@derobert,感谢您的回复。我没有意识到InputClass也可以用于热插拔。我有一些使用xsetwacom映射的按钮事件,如果我在X启动后热插拔平板电脑,我想触发它​​们。我将尝试一下。谢谢 !
Lqueryvg

2

插入设备时:

  1. Linux将检测设备并根据udev规则创建设备条目。
  2. X服务器检测到该设备。

您无法xsetwacom在阶段2之前运行。您的脚本失败了,因为您正在阶段1运行脚本,此时X还不知道该设备。

您可以使用进行一些设置gnome-settings-daemon。我相信它会通过D-Bus收到有关新设备的通知,但我不知道D-Bus事件是什么样的。尝试使用监视间谍巴士dbus-monitor


我赞成您的回答以获取详细信息,但是由于以下原因,我不确定这是正确的:我尝试使用sleep了几秒钟。插入时,平板电脑会在不到一秒钟的时间内工作,因此在命令执行时,设备已被检测到并在使用中X。但是还是行不通吗?
Redsandro

2

如果创建两个文件,则该方法有效,其中一个包装脚本由udev调用,而后者又在后台调用实际的配置脚本。配置脚本需要睡眠一小会儿,以便X11有时间完成其工作。这是我使用的设置:

由udev(/usr/local/bin/setupwacom.sh)调用的包装器脚本:

#!/usr/bin/env bash
/usr/local/bin/setupwacom-post-X11.sh &

包装脚本调用的配置脚本(/usr/local/bin/setupwacom-post-X11.sh):

#!/usr/bin/env bash
sleep 2
export XAUTHORITY=/home/adrian/.Xauthority
export DISPLAY=:0
# Put your xsetwacom commands here, for example: 
xsetwacom --set "Wacom Intuos S Pad pad" Button 1 "key +ctrl +shift e"

2

这里没有答案对我有用,并且我想设置的选项无法在中指定xorg.conf

$ xsetwacom -x get 'Wacom Intuos PT S Pad pad' button 1 
Button: Actions are not supported by xorg.conf. Try shell format (-s) instead.

我最终不得不使用由udev规则触发的systemd服务来启动脚本:

$ cat /etc/udev/rules.d/99-wacom.rules
SUBSYSTEM=="usb", ENV{ID_VENDOR_ID}=="056a", ENV{ID_MODEL_ID}=="0302", TAG+="systemd"

可以找到lsusb在插入设备的情况下运行的供应商和型号ID 。

重新加载udev规则:

$ udevadm control --reload-rules
$ udevadm trigger

TAG+="systemd"使其他systemd服务(系统或用户)依赖于设备(寄存器它作为一个装置单元,见上man systemd.device)。要查找设备单元的名称,请运行udevadm monitor并插入平板电脑。我懂了

UDEV  [2918.098423] add      /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3 (usb)
...

要检查systemd正在捡起它,请执行

$ systemctl status /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3/
● sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device - CTH-480 [Intuos Pen & Touch (S)]
   Loaded: loaded
   Active: active (plugged) since Mon 2016-06-20 11:14:20 UYT; 29min ago
   Device: /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3

因此设备单元是sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device,并且可以在系统服务单元中使用

 $ cat .config/systemd/user/wacom.service    
[Service]
Type=forking
Restart=no
ExecStart=/path/to/wacom-pad-button-setup

[Install]
WantedBy=default.target
WantedBy=sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.1.device
WantedBy=sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.2.device
WantedBy=sys-devices-pci0000:00-0000:00:1d.0-usb2-2\x2d1-2\x2d1.3.device

每个USB端口有一个设备单元。

然后启用并与重新加载单元systemctl --user enable wacom.servicesystemctl --user daemon-reload

该脚本仍然需要一点时间让xsetwacom查找设备,并设置$DISPLAY$XAUTHORITYType=oneshot插入时可以正常工作,但是如果在引导计算机时已经插入设备,则无法运行。这就是为什么我需要使用用户服务而不是系统服务的原因,以及该单元也具有的原因WantedBy=default.target。oneshot的问题在于它阻止了startx。Type=forkingRestart=no告诉systemd不要等待脚本的分支过程退出,这样脚本就可以在后台休眠,等待Xorg启动。

$ cat bin/wacom-pad-button-setup
#!/bin/rc
{
    sleep 2

    if (~ $DISPLAY ()) {
        DISPLAY=:0
        XAUTHORITY=/home/spelufo/.Xauthority
    }

    xsetwacom set 'Wacom Intuos PT S Pad pad' button 9 'button +3 -3'
    xsetwacom set 'Wacom Intuos PT S Pad pad' button 8 'button +4 -4'
    xsetwacom set 'Wacom Intuos PT S Pad pad' button 3 'button +1 -1'
    xsetwacom set 'Wacom Intuos PT S Pad pad' button 1 'button +2 -2'
} &

我不知道为什么在您的情况下不是这种情况,但是我至少必须转义服务文件中的\xto \\x。最终,我的WantedBy看起来像这样:WantedBy=sys-devices-pci0000\:00-0000\:00\:14.0-usb1-1\\x2d4.device现在他们被触发了……在没有之前。
1

1

derobert的解决方法并不适合所有情况(如果不能使用xorg.conf)。

sleepAdrian 建议的包装和解决方案对我不起作用(ubuntu 16.04)。

如果将此添加到xsetwacom脚本的顶部:

exec > /tmp/debug-my-script.txt 2>&1
xinput --list

从输出中可以看到,xsetwacom脚本在xinput知道wacom 之前仍以某种方式执行。不管你睡多久。

我在这里提出另一种解决方案/解决方法使用的小程序,在这比spelufo解决方案(我没有尝试),但只需要安装更简单的at程序。(sudo apt install at对于debian用户)。

现在,将包装器脚本(Adrian的答案)更改为以下内容:

#!/usr/bin/env bash
at now -f /usr/local/bin/setupwacom-post-X11.sh

at通常用于一次调度命令,例如,您可以提前一个小时来调度at now +1 hours -f yourscript.sh。但是由于您只能添加分钟/小时/天/周,因此我now没有添加任何内容,而是依靠xsetwacom脚本中的睡眠状态。


面对与Adrian的建议相同的问题,这在16.04 Ubuntu上为我解决了。我感到困惑,它是如何开始工作的,at now没有任何分叉。有什么理由吗?实际上,使用该at方法甚至不需要包装器脚本。您可以将其直接添加为.., RUN+="/usr/bin/at now -f script-path":)
Gaurav

这太疯狂了,因为我什至没有在脚本中入睡,没有它就可以正常工作。我希望我知道背景中发生了什么,以便与它一起工作at
BozanicJosip
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.