2

Я пытаюсь автоматизировать калибровку планшета Huion без особого успеха.

У меня есть этот вывод из xinput --list в обычном терминале:

⎡ Virtual core pointer                          id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                id=4    [slave  pointer  (2)]
⎜   ↳ USB USB Keyboard                          id=13   [slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad                id=16   [slave  pointer  (2)]
⎜   ↳ Logitech USB Receiver                     id=14   [slave  pointer  (2)]
⎜   ↳ HUION PenTablet                           id=18   [slave  pointer  (2)]
⎜   ↳ HUION PenTablet                           id=19   [slave  pointer  (2)]
⎜   ↳ HUION PenTablet                           id=20   [slave  pointer  (2)]
⎣ Virtual core keyboard                         id=3    [master keyboard (2)]
↳ Virtual core XTEST keyboard               id=5    [slave  keyboard (3)]
↳ Power Button                              id=6    [slave  keyboard (3)]
↳ Video Bus                                 id=7    [slave  keyboard (3)]
↳ Video Bus                                 id=8    [slave  keyboard (3)]
↳ Power Button                              id=9    [slave  keyboard (3)]
↳ Sleep Button                              id=10   [slave  keyboard (3)]
↳ Laptop_Integrated_Webcam_2HDM             id=11   [slave  keyboard (3)]
↳ USB USB Keyboard                          id=12   [slave  keyboard (3)]
↳ AT Translated Set 2 keyboard              id=15   [slave  keyboard (3)]
↳ Dell WMI hotkeys                          id=17   [slave  keyboard (3)]

Журнал udev показывает только это для той же команды:

⎡ Virtual core pointer id=2 [master pointer (3)] 
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)] 
⎜ ↳ USB USB Keyboard id=13 [slave pointer (2)] 
⎜ ↳ SynPS/2 Synaptics TouchPad id=16 [slave pointer (2)] 
⎜ ↳ Logitech USB Receiver id=14 [slave pointer (2)] 
⎜ ↳ HUION PenTablet id=18 [slave pointer (2)] 
⎣ Virtual core keyboard id=3 [master keyboard (2)] 
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)] 
↳ Power Button id=6 [slave keyboard (3)] 
↳ Video Bus id=7 [slave keyboard (3)] 
↳ Video Bus id=8 [slave keyboard (3)] 
↳ Power Button id=9 [slave keyboard (3)] 
↳ Sleep Button id=10 [slave keyboard (3)] 
↳Laptop_Integrated_Webcam_2HDM id=11 [slave keyboard (3)] 
↳ USB USB Keyboard id=12 [slave keyboard (3)] 
↳ AT Translated Set 2 keyboard id=15 [slave keyboard (3)] 
↳ Dell WMI hotkeys id=17 [slave keyboard (3)]

Обратите внимание, что строки для id=19 и id=20 отсутствуют.

Я имею:

/etc/udev/rules.d/huion.rules:

ATTRS{idVendor}=="256c", ATTRS{idProduct}=="006e", SYMLINK+="davesusb", ENV{DISPLAY}=":0.0", ENV{XAUTHORITY}="/home/romulo/.Xauthority", RUN+="/usr/local/Huion"

/usr/local/Huion:

#!/bin/bash
/home/romulo/.local/Huion &

~/.local/Huion:

#!/bin/bash

sleep 3
DISPLAY=":0.0"
HOME=/home/romulo/
XAUTHORITY=$HOME/.Xauthority
export DISPLAY XAUTHORITY HOME

if (xrandr | grep "HDMI1 connected" > /dev/null)
then
    LENGTH=$(/usr/bin/xrandr | grep 'HDMI1 connected primary' | uniq |  awk '{x=$4; split(x,a,"+"); split(a[1],b,"x"); print b[1]}')
    WIDTH=$(/usr/bin/xrandr | grep 'HDMI1 connected primary' | uniq |  awk '{x=$4; split(x,a,"+"); split(a[1],b,"x"); print b[2]}')
    DEVICE=$(/usr/bin/xinput --list | grep HUION | uniq | awk 'NR==2 {x=$5; split(x,a,"="); print a[2]}')

    echo $(/usr/bin/xinput --list)

    CORRECTION=$((40000*$WIDTH/$LENGTH))
    echo "$CORRECTION"

    if (glxinfo | grep "Intel" > /dev/null)
    then
        xsetwacom set $DEVICE MapToOutput HDMI1
        echo "device $DEVICE restricted to HDMI-1"
        xinput set-prop $DEVICE "Evdev Axis Calibration" 0 40000 0 $CORRECTION
        echo "correction of proportion : 40000x$CORRECTION"        
    else
        echo "error :("
    fi
else
    echo "error :("
fi

Скрипт делает xinput --list | grep HUION | uniq | awk 'NR==2 …' в попытке перехватить id второго устройства HUION (т. е. 19), и поэтому происходит сбой, потому что эта информация отсутствует.  Как я могу преодолеть эту проблему?

обновление 1

Root через sudo su дает мне тот же xinput --list что и обычный пользователь, но любая попытка калибровки не дала результата. Мне нужно будет переключиться на моего пользователя в вызове сценария оболочки udev? Не очень элегантно ... :(

1 ответ1

3

Проблема в том, что список xinput обновляется после обработки правил udev, и никакое время ожидания в фоновом процессе не может его преодолеть. Решение заключается в запуске вашего скрипта с помощью inotify. Оригинальное решение и необходимые источники скриптов можно найти по адресу https://bbs.archlinux.org/viewtopic.php?pid=1626055#p1626055.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .