[sisyphus] Wacom на ThinkPad с новым xorg (Was: sorta [SOLVED] Re: dm не работает, приходится startx)

Yury Bushmelev jay4mail на gmail.com
Ср Фев 23 12:33:50 UTC 2011


23 февраля 2011 г. 15:05 пользователь Michael Shigorin
<mike на osdn.org.ua> написал:
> On Wed, Feb 23, 2011 at 10:32:39AM +0300, Yury Bushmelev wrote:
>> > xorg.conf необходим по причине serial-ного Wacom в ноутбуке,
>> > автоматически не цепляется.
>> Миш, у меня еще когда на моем X61t сизиф был, тогда уже там вроде бы
>> были достаточно новые иксы, чтобы держать не xorg.conf, а файлик в
>> xorg.conf.d, который ловит wacom-овский планшет. Если хочешь, могу
>> тебе с арча своего скинуть нужные файлики.
>
> Уже подсказали, но всё равно давай.

Хоть ты мне и лично письмо написал, но отвечаю в рассылку, ибо вон и
Дмитрий интересовался.

Во-первых, надо пометить нужные устройства (ловятся по id) в udev как
устройства ввода выставлением некоторых переменных. Откуда взял файлик
и почему именно эти переменные - нифига не помню уже :( Возможно, что
откуда-то с thinkwiki.org.

$ cat /etc/udev/rules.d/10-wacom-tty.rules
# Rules for Wacom tty interface
ACTION!="add|change", GOTO="wacom_end"
  # Match all wacom tablets with a serial ID starting with WACf or FUJ*
  ATTRS{id}=="WACf*" ENV{NAME}="Serial Wacom Tablet",
ENV{ID_INPUT}="1", ENV{ID_INPUT_TABLET}="1"
  ATTRS{id}=="FUJ*" ENV{NAME}="Serial Wacom Tablet",
ENV{ID_INPUT}="1", ENV{ID_INPUT_TABLET}="1"
LABEL="wacom_end"

Как именно посмотреть всю базу устройств udev, честно говоря, тоже не
помню, а гуглить влом. Навскидку придумал вариант с перебором
устройств в команде udevadm info --query=all --name=/dev/bla-bla-bla.

После подкладывания файлика передергиваем udev командой udevadm trigger.

Теперь будем крутить xorg.
У меня все основные настройки были сделаны файликом
/etc/X11/xorg.conf.d/50-wacom.conf, поставленным пакетом
xf86-input-wacom (конкретно сейчас стоит 0.10.8-2). Для удобства
привожу содержимое:

$ cat /etc/X11/xorg.conf.d/50-wacom.conf
Section "InputClass"
        Identifier "Wacom class"
# WALTOP needs a patched kernel driver, that isn't in mainline lk yet,
# so for now just let it fall through and be picked up by evdev instead.
#       MatchProduct "Wacom|WALTOP|WACOM"
        MatchProduct "Wacom|WACOM"
        MatchDevicePath "/dev/input/event*"
        Driver "wacom"
EndSection

Section "InputClass"
        Identifier "Wacom serial class"
        MatchProduct "Serial Wacom Tablet"
        Driver "wacom"
EndSection

Section "InputClass"
        Identifier "Wacom serial class identifiers"
        MatchProduct "WACf|FUJ02e5|FUJ02e7"
        Driver "wacom"
EndSection


# N-Trig Duosense Electromagnetic Digitizer
Section "InputClass"
        Identifier "Wacom N-Trig class"
        MatchProduct "HID 1b96:0001|N-Trig Pen"
        MatchDevicePath "/dev/input/event*"
        Driver "wacom"
        Option "Button2" "3"
EndSection

Далее дигитайзер надо было откалибровать. В оригинале всем
предлагается делать это посредством некоей tcl-ной GUI-утилиты из
пакета linux-wacom. Оттуда взялись координаты "углов" дигитайзера.
Плюс некоторые параметры были взяты, скорее всего, с thinkwiki. В
итоге у меня сейчас живет вот такой файлик:

$ cat /etc/X11/xorg.conf.d/91-input-ibm-thinkpad-wacom.conf
Section "InputClass"
  Identifier    "stylus"
  MatchProduct  "Serial Wacom Tablet"
  Driver        "wacom"
  Option        "ForceDevice" "ISDV4"
  Option        "TopY" "-88"
  Option        "TopX" "110"
  Option        "BottomY" "18376"
  Option        "BottomX" "24670"
#  Option       "KeepShape" "on"
  Option        "TPCButton" "off"
  Option        "Button3" "2"
  Option        "Button2" "3"
EndSection

Section "InputClass"
  Identifier    "eraser"
  MatchProduct  "Serial Wacom Tablet"
  Driver        "wacom"
  Option        "ForceDevice" "ISDV4"
  Option        "TopY" "-88"
  Option        "TopX" "110"
  Option        "BottomY" "18376"
  Option        "BottomX" "24670"
#  Option       "KeepShape" "on"
  Option        "TPCButton" "off"
  Option        "Button3" "2"
  Option        "Button2" "3"
EndSection

Параметр TPCButton отключает необходимость тапать стилусом, чтобы
получить клик с нажатой кнопкой на стилусе. То есть, достаточно нажать
кнопку, и это уже считается кликом. Кнопка на стилусе перемаплена,
чтобы выдавать нажатие правой кнопкой мыши.

Кстати, повторную калибрацию недавно я делал уже при помощи
xinput_calibrator. Если в альте еще нету, рекомендую опакетить. Она
корректирует смещения где-то в недрах xinput и выдает на консоль
значения, которые можно подставить в TopX/Y и BottomX/Y, чтобы
настройки загружались автоматом. Хотя, оно выдает кусок файла для
xorg.conf.d, который, наверное, можно использовать как есть, но я не
пробовал.

В качестве бонуса вот еще страшненький скрипт для поворота изображения
(прибит гвоздями к экрану ":0"):
$ cat bin/rotate
#!/bin/sh

rotation=$(xrandr -d :0 --verbose | awk '/ connected/ {print $5;}')

if [ -z "$rotation" ]; then
        exit 1;
fi

brightness_path="/sys/class/backlight/acpi_video0"

devices_stylus='Serial Wacom Tablet stylus'
devices_eraser='Serial Wacom Tablet eraser'
devices="
${devices_stylus}
${devices_eraser}
"

geom=0

mode=${1:-'-'}

case "$mode" in
'-' | '+')
        #case `xrandr --verbose | grep "$output" | sed "s/^[^ ]* [^ ]*
[^ ]* ([^(]*) \([a-z]*\).*/\1/"` in
        case $rotation in
        normal)
                geom=0
                ;;
        left)
                geom=1
                ;;
        inverted)
                geom=2
                ;;
        right)
                geom=3
                ;;
        esac

        let geom=${geom}${mode}1+4
        let geom=${geom}%4;
        ;;

'0' | '1' | '2' | '3')
        geom=$mode
        ;;
*)
        echo "Usage: `basename $0` { {-|+} | {0|1|2|3} }"
        exit 1
        ;;
esac

case $geom in
1)
        wacom=CCW
        xrandr=left
        unavsym=Right
        lnavsym=Up
        rnavsym=Down
        dnavsym=Left
        ;;

2)
        wacom=HALF
        xrandr=inverted
        unavsym=Down
        lnavsym=Right
        rnavsym=Left
        dnavsym=Up
        ;;

3)
        wacom=CW
        xrandr=right
        unavsym=Left
        lnavsym=Down
        rnavsym=Up
        dnavsym=Right
        ;;
*)
        wacom=NONE
        xrandr=normal
        unavsym=Up
        lnavsym=Left
        rnavsym=Right
        dnavsym=Down
        ;;
esac

echo "geom=$geom, xrandr to $xrandr, xsetwacom to $wacom" >&2

# backlight fading to 0 after rotation so we should set it to previous
# value again (BUG?)
brightness=$(cat ${brightness_path}/actual_brightness)
if xrandr -o "$xrandr"; then
        # restore brightness
        sudo /bin/sh -c "echo ${brightness} > ${brightness_path}/brightness"

        IFS="
"
        for d in $devices; do
                xsetwacom --set "$d" Rotate "$wacom"
        done

        xmodmap -e "keycode 111 = $unavsym" \
                -e "keycode 113 = $lnavsym" \
                -e "keycode 114 = $rnavsym" \
                -e "keycode 116 = $dnavsym"
        echo "Up=$unavsym Left=$lnavsym Right=$rnavsym Down=$dnavsym"
fi


exit 0


> Кстати, если найдётся минут пять на кратенькое сравнение --
> тоже спасибо.

Эээ.. Кратенькое сравнение чего? :)

-- 
Yury Bushmelev


Подробная информация о списке рассылки Sisyphus