Как запустить сценарий конфигурации при подключении графического планшета Wacom (через USB)?

Я использую графический планшет Wacom под Ubuntu 18.04 ( Ядро: 4.15.0-72-generic ).

К сожалению, я не могу настроить его, используя системные настройки, потому что он не распознается должным образом.

Конфигурация через xsetwacom работает, но не является постоянной. Как только я перезагружаю компьютер или подключаю устройство заново, загружаются настройки по умолчанию.


Я предположил, что самым простым решением было бы запустить сценарий конфигурации, как только планшет распознается как USB-устройство.

Насколько я понимаю, для этого потребуются два шага:

  1. Создать правило udev

    Я создал файл /etc/udev/rules.d/99-config_wacom_intuos.rules с содержанием:

     # "idVendor" и "idProduct" были получены из вывода команды lsusb.
    ДЕЙСТВИЕ == "добавить" \
    , ПОДСИСТЕМА == "ввод" \
    , ЯДРО == "мышь *" \
    , 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
    
    # Это были пропущенные утверждения, как предполагалось в ответе.
    #export DISPLAY =: 1
    #export XAUTHORITY = / run / user / 1000 / gdm / Xauthority
    echo "` date '+% Y-% m-% dT% H:% M:% S``, ShellPID $$, start "
    спать 1
    если xsetwacom - список устройств | grep -q "Wacom Intuos BT"
    тогда
    main_screen = "ГОЛОВА-0"
    bezier_args = "0 20 80 100"
    positioning_mode = "Абсолютный"
    raw_sample_lvl = "9"
    suppress_lvl = "10"
    
     # Сопоставляет графический планшет с областью указанного экрана (для многоэкранных сред).
    xsetwacom set "Стилус Wacom Intuos BT S Pen" MapToOutput "$ main_screen"
    xsetwacom set "Ластик Wacom Intuos BT S Pen" MapToOutput "$ main_screen"
    xsetwacom set "Курсор Wacom Intuos BT S Pen" MapToOutput "$ main_screen"
    
     # Изменяет чувствительность к давлению.
    xsetwacom set "Стилус Wacom Intuos BT S Pen" PressureCurve "$ bezier_args"
    xsetwacom set "Ластик Wacom Intuos BT S Pen" PressureCurve "$ bezier_args"
    
     # Сглаживает нарисованные линии, уменьшая дрожание.xsetwacom set "Стилус Wacom Intuos BT S Pen" RawSample "$ raw_sample_lvl"
    xsetwacom set "Стилус Wacom Intuos BT S Pen" Подавить "$ suppress_lvl"
    xsetwacom set "Ластик Wacom Intuos BT S Pen" RawSample "$ raw_sample_lvl"
    xsetwacom set "Ластик Wacom Intuos BT S Pen" Подавить "$ suppress_lvl"
    xsetwacom set "Курсор Wacom Intuos BT S Pen" RawSample "$ raw_sample_lvl"
    xsetwacom set "Курсор Wacom Intuos BT S Pen" Подавить "$ suppress_lvl"
    
     # Определяет режим позиционирования («Абсолютный» / «Относительный»)
    xsetwacom set «Стилус Wacom Intuos BT S Pen» Режим «$ positioning_mode»
    xsetwacom set "Ластик Wacom Intuos BT S Pen" Режим "$ positioning_mode"
    xsetwacom set "Курсор Wacom Intuos BT S Pen" Режим "$ positioning_mode"
    
     # Назначает действия кнопкам планшета.
    xsetwacom set "Панель управления Wacom Intuos BT S Pad" Кнопка 1 "клавиша + ctrl z -ctrl"
    xsetwacom set "Панель управления Wacom Intuos BT S Pad" Кнопка 2 "клавиша + ctrl + shift z -ctrl -shift"
    xsetwacom set "Панель управления Wacom Intuos BT S Pad" Кнопка 3 "клавиша 0xffab"
    xsetwacom set "Панель управления Wacom Intuos BT S Pad" Кнопка 8 "клавиша 0xffad"
    еще
    echo "НЕТ 'УСТРОЙСТВА WACOM INTUOS BT' ОБНАРУЖЕНЫ."
    фи
    echo "` date '+% Y-% m-% dT% H:% M:% S``, ShellPID $$, end "
    echo -e "--- \ n"
    выход 0
    

    У этого файла есть права доступа:

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

Скрипт отлично работает, когда я запускал его вручную с терминала.

Это также выполняется, когда я подключаю устройство. К сожалению, похоже, это ни на что не влияет.

Кроме того, сценарий выполняется несколько раз подряд после подключения устройства.
Я предполагаю, что такое поведение происходит из-за правила udev, которое не является достаточно строгим.

Кто-нибудь может сказать мне, что я делаю не так?

0
задан 3 January 2020 в 22:55

1 ответ

Инструменты X-сервера обычно влияют только на ваш текущий сеанс (именно поэтому вы должны устанавливать их каждый раз).

Поскольку вы запускаете этот скрипт в оболочке, которая не привязана ни к какому X-сеансу, инструмент не имеет ни малейшего представления, для какого X-сеанса следует изменить эти настройки (точнее, он не имеет ни малейшего представления что сеанс X даже существует).

Вы можете вручную подключить свою оболочку к текущему X-сеансу, но иногда это решение может оказаться ненадежным.

Вам нужно добавить в скрипт два экспорта переменных: одну для DISPLAY и XAUTHORITY. Они используются для идентификации и доступа к правильному сеансу X. Вы можете получить соответствующие значения, запустив env, войдя в систему как обычный пользователь.

В моем случае вывод выглядит следующим образом (части, отмеченные [...] опущены):

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

Для этих значений мне нужно было бы расширить скрипт следующими строками :

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

Теперь скрипт должен работать, даже если вы являетесь пользователем root.

Сама конфигурация udev выглядит нормально.

1
ответ дан 5 January 2020 в 18:23

Другие вопросы по тегам:

Похожие вопросы: