如何在 Wacom 图形输入板连接(通过 USB)后立即运行配置脚本?

如何在 Wacom 图形输入板连接(通过 USB)后立即运行配置脚本?

我在 Ubuntu 18.04 下使用 Wacom 绘图板(核心: 4.15.0-72-generic)。

不幸的是,我无法使用系统设置来配置它,因为它无法被正确识别。

通过配置xsetwacom可以工作,但不是持久的。只要我重新启动计算机或重新插入设备,就会加载默认设置。


我认为最简单的解决方案是在平板电脑被识别为 USB 设备后立即运行配置脚本。

根据我的理解,实现此目标需要两个步骤:

  1. 创建 udev 规则

    /etc/udev/rules.d/99-config_wacom_intuos.rules我创建了一个包含以下内容的文件:

    # "idVendor" and "idProduct" were derived from the output of the lsusb command.
    ACTION=="add" \
    , SUBSYSTEM=="input" \
    , KERNEL=="mouse*" \
    , ATTRS{idVendor}=="1234" \
    , ATTRS{idProduct}=="5678" \
    , RUN+="/bin/sh -c '/usr/local/bin/config_wacom_intuos.sh >> /var/log/custom_logs/config_wacom_intuos.log 2>&1'"
    

    该文件具有以下权限:

    -rw-r--r-- 1 root root    ...
    

    (这本字典/var/log/custom_logs也是我编写的。)

  2. 创建配置脚本

    /usr/local/bin/config_wacom_intuos.sh我创建了一个包含以下内容的文件:

    #!/bin/bash
    #coding:utf8
    
    # These were the missing statements as suggested by the answer.
    #export DISPLAY=:1
    #export XAUTHORITY=/run/user/1000/gdm/Xauthority
    
    echo "`date '+%Y-%m-%dT%H:%M:%S'`, ShellPID $$, start"
    
    sleep 1
    
    if xsetwacom --list devices | grep -q "Wacom Intuos BT"
    then
        main_screen="HEAD-0"
        bezier_args="0 20 80 100"
        positioning_mode="Absolute"
        raw_sample_lvl="9"
        suppress_lvl="10"
    
        # Maps the graphics tablet to the area of a specified screen (for multiple-screen environments).
        xsetwacom set "Wacom Intuos BT S Pen stylus" MapToOutput "$main_screen"
        xsetwacom set "Wacom Intuos BT S Pen eraser" MapToOutput "$main_screen"
        xsetwacom set "Wacom Intuos BT S Pen cursor" MapToOutput "$main_screen"
    
        # Changes the pressure sensitivity.
        xsetwacom set "Wacom Intuos BT S Pen stylus" PressureCurve "$bezier_args"
        xsetwacom set "Wacom Intuos BT S Pen eraser" PressureCurve "$bezier_args"
    
        # Smoothes drawn lines by reducing any quivering.
        xsetwacom set "Wacom Intuos BT S Pen stylus" RawSample "$raw_sample_lvl"
        xsetwacom set "Wacom Intuos BT S Pen stylus" Suppress "$suppress_lvl"
        xsetwacom set "Wacom Intuos BT S Pen eraser" RawSample "$raw_sample_lvl"
        xsetwacom set "Wacom Intuos BT S Pen eraser" Suppress "$suppress_lvl"
        xsetwacom set "Wacom Intuos BT S Pen cursor" RawSample "$raw_sample_lvl"
        xsetwacom set "Wacom Intuos BT S Pen cursor" Suppress "$suppress_lvl"
    
        # Specifies the positioning mode ("Absolute" / "Relative")
        xsetwacom set "Wacom Intuos BT S Pen stylus" Mode "$positioning_mode"
        xsetwacom set "Wacom Intuos BT S Pen eraser" Mode "$positioning_mode"
        xsetwacom set "Wacom Intuos BT S Pen cursor" Mode "$positioning_mode"
    
        # Assigns actions to the tablet buttons.
        xsetwacom set "Wacom Intuos BT S Pad pad" Button 1 "key +ctrl z -ctrl"
        xsetwacom set "Wacom Intuos BT S Pad pad" Button 2 "key +ctrl +shift z -ctrl -shift"
        xsetwacom set "Wacom Intuos BT S Pad pad" Button 3 "key 0xffab"
        xsetwacom set "Wacom Intuos BT S Pad pad" Button 8 "key 0xffad"
    
    else
        echo "NO 'WACOM INTUOS BT' DEVICES FOUND."
    fi
    
    echo "`date '+%Y-%m-%dT%H:%M:%S'`, ShellPID $$, end"
    echo -e "---\n"
    
    exit 0
    

    该文件具有以下权限:

    -rwxr-xr-x 1 root root    ...
    

当我从终端手动执行该脚本时,它运行良好。

当我插入设备时它也会执行。不幸的是,这似乎没有任何效果。

另外,插入设备后,脚本会连续执行多次。
我猜测这是因为udev规则限制不够。

谁能告诉我我做错了什么?

答案1

X 服务器工具通常只影响您当前的会话(这就是您每次都必须设置它们的原因)。

由于您在未附加到任何 X 会话的 shell 中运行该脚本,因此该工具不知道应该为哪个 X 会话更改这些设置(或更准确地说,它甚至不知道 X 会话是否存在)。

您可以手动将您的 shell 连接到当前的 X 会话,但有时该解决方案可能有点脆弱。

您需要向脚本添加两个变量导出,一个用于DISPLAYXAUTHORITY。它们用于识别和访问正确的 X 会话。您可以env在以普通用户身份登录时通过运行来获取适当的值。

就我而言,输出如下所示([...]省略了标记为 的部分):

$ env
[...]
XAUTHORITY=/home/tim/.Xauthority
[...]
DISPLAY=:0.0
[...]

对于这些值,我需要通过以下几行来扩展脚本:

export DISPLAY=:0.0
export XAUTHORITY=/home/tim/.Xauthority

现在,即使您是 root 用户,脚本也应该可以运行。

udev 配置本身看起来不错。

相关内容