[Решено]Не могу настроить Tablet Hardware Buttons на ThinkPad X61 tablet

Автор svl, 08 ноября 2014, 20:53:03

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

svl

Здравствуйте!
У меня ThinkPad X61 tablet установил на него Debian Wheezy 7.7. На матрице имеются доп. кнопки а именно: Джойстик(верх, низ, право, лево) вместе ентером, Esc, поворот екрана, таблет меню и Cltr-Alt-Del (одной кнопкой).
Проблема в том что не все из них работают коректно. А именно джойстик и Esc работают нормально, при нажатии на меню, екран темнеет потом просит пароль (блокировка екрана наверно), при нажатии на кнопку поворота екрана на экране появляется зачеркнутая иконка тачпада (тачпада в ноуте нет) а при нажатии Cltr-Alt-Del вообще ничего не происходит. (говоря поворот екрана, подразумевается изменение ориентации картинки на 90 градусов)
В нете нашел решение http://www.thinkwiki.org/wiki/Tablet_Hardware_Buttons но Xbindkeys не выдает коды кнопок, точнее при нажатии нормально работающих кнопок она все выдает (например при нажатии джойстика) а вот на остальные она не реагирует.
Положение матрицы не влияет на поведение кнопок, такое впечатление, что система не видит датчика положения матрицы, но с этим я готов смериться.
Вопрос: Как заставить коректно работать кнопку поворота екрана? (и остальные)

svl

Сам решил проблему, правда на другом дистрибутиве (Linux Mint 17) но думаю что и на debian проблема решится аналогично.
Собственно разобрался и решил проблему следующим образом:
При нажатии не работающей кнопки syslog забивается сообщениями по типу:
Feb  2 15:19:46 svl-2 kernel: [ 1797.811865] atkbd serio0: Use 'setkeycodes 67 <keycode>' to make it known.
Feb  2 15:19:46 svl-2 kernel: [ 1797.815906] atkbd serio0: Unknown key released (translated set 2, code 0x67 on isa0060/serio0).

Чем дольше держать кнопку тем больше сообщений запишется в лог.
Также можно использовать команду dmesg чтобы увидеть эти сообщения.

Команды для разных кнопок.
setkeycodes 67 <keycode> -Control-Alt-Delete Button (маленькая кнопка утопленная в корпус, больше похожа на ресет но в windows выполняла тоже что и сочетание из трех клавиш)
setkeycodes 6c <keycode> - Rotate Button (поворот экрана)
setkeycodes 68 <keycode> - Toolbox Button (в windows вызывает меню настроек(яркость, тач и тд.))
Дальше пойдут кнопки которые повторяют функционал аналогичных кнопок на клавиатуре. Я испробовал разные дистрибутивы и в некоторых эти кнопки сразу работали как надо а в некоторых также сыпали в лог сообщения.
setkeycodes 6b <keycode> - Esc
setkeycodes 69 <keycode> - Return (центр джойстика,  в windows(да и в linux дистрибутивах) выполняет тоже что и Enter)
setkeycodes 71 <keycode> - Up (джойстик верх)
setkeycodes 6f <keycode> - Down
setkeycodes 6e <keycode> - Left
setkeycodes 6d <keycode> - Right

А вот команды которые я выполнял чтоб назначить кнопкам функции:
sudo setkeycodes 71 103
sudo setkeycodes 6f 108
sudo setkeycodes 6e 105
sudo setkeycodes 6d 106
sudo setkeycodes 69 28
sudo setkeycodes 6b 1
sudo setkeycodes 68 241
sudo setkeycodes 67 242
sudo setkeycodes 6c 240


Где взять коды кнопок? В мануалах которые я читал везде написано взять скан код кнопки перевести в десятичную систему калькулятором и добавить 128. С  некоторыми кнопками все гуд они попадают на свободные кейкоды а некоторые у меня попадали на задействованные кейкоды, конфликта в системе это не вызывает но при нажатии кнопки она выполняет совсем не те действия которые должна. Я точно не помню но получалось что-то типа жмешь Esc на матрице а система ее понимает как кнопку назад(в браузере).

Потому кнопкам которые повторяют функционал кнопок на клавиатуре я назначил коды кнопок с клавиатуры. Чтобы узнать код кнопки выполняем команду xev или xbindkeys -k

Появится белое окно, жмем кнопку код которой хотим узнать.
При первой команде получим:
KeyRelease event, serial 37, synthetic NO, window 0x2c00001,
    root 0x7e, subw 0x0, time 1026802, (352,341), root:(354,413),
    state 0x2010, keycode 36 (keysym 0xff0d, Return), same_screen YES,
"   XLookupString gives 1 bytes: (0d) "
    XFilterEvent returns: False

При второй:
"(Scheme function)"
    m:0x10 + c:36
    Mod2 + Return

Код кнопки Enter у нас 36.
Я не понял почему но если вести sudo setkeycodes 69 36 нашей кнопке будет назначен код 44, т. е. На 8 больше, разбираться не стал просто отнял везде 8, таким образом я заставил работать джойстик и Esc.
Остались еще спец кнопки. Им назначил просто свободные коды обычно от 120 до 255. Проверить свободные коды можно командой sudo dumpkeys

Но после перезагрузки кнопки перестали работать, вылечилось это помещением в /etc/init/ файла kb-keys-customize.conf следующего содержания:
# kb-keys-customize
# Map key codes to the scan codes emitted by Toolbox, Rotate, Ctrl-Alt-Del...

description "Map FToolbox, Rotate, Ctrl-Alt-Del...  kernel scancodes to kernel keycodes"

start on local-filesystems

script
    setkeycodes 71 103 6f 108 6e 105 6d 106 69 28 6b 1 68 241 67 242 6c 240
end script


Я подумал что на этом все, система видит кнопки и реагирует на них щас поставлю в комбинациях клавиш команды на запуск нужных мне скриптов или приложений и готово но не тут то было, стандартные средства ос отказались видеть кнопки, точнее кнопки повторяющие функционал кнопок клавиатуры видились отлично, а вот 3 спец кнопки просто не вбивались в комбинацию. Все потому что клавишам не задано символьное обозначение. NoSymbol Тут наметилось 2 пути решения данной проблемы: 1. назначить значения по типу XF86Launch2 XF86Launch3... 2. Использовать xbindkeys.
Я решил использовать второй вариант.
Если у вас еще не установлен xbindkeys установите его.
Создадим файл конфигурации (без него не работает) $ xbindkeys --defaults > ~/.xbindkeysrc
Водим команду $ xbindkeys -k и жмем нужную нам кнопку.
Получаем вывод:
"(Scheme function)"
    m:0x0 + c:161
    NoSymbol

Копируем его в ~/.xbindkeysrc и заменяем (Scheme function) на нашу команду.
У меня получилось следующее:

## (Автоматически сгенерированная документация)
# ...

#ctrl-alt-del (gnome-system-monitor)
"gnome-system-monitor"
    m:0x0 + c:250
    NoSymbol

#Tablet Toolbox button (show cellwriter)
"cellwriter --show-window"
   m:0x0 + c:249
   NoSymbol

#Tablet Rotate button (run rotate script)
"sudo /home/svl/scripts/rotate.sh"
    m:0x0 + c:248
    NoSymbol

Кнопки действия выполняют но при изменении ориентации экрана джойстик на матрице не меняет значения своих кнопок, для изменения работы джойстика в скрипте использовалась команда  setkeycodes которую нужно выполнять с sudo, чтобы у нас не просило пароль при каждом нажатии кнопки переворота в папке /etc/sudoers.d/ был создан файл rotate следующего содержания:
Cmnd_Alias ROTATE = /home/svl/scripts/rotate.sh

ALL ALL = NOPASSWD:ROTATE

ну и последнее сам скрипт rotate.sh
#!/bin/bash
tablet="Serial Wacom Tablet stylus"

# Get the current orientation of the tablet
rotate=$(xsetwacom get "$tablet" Rotate)

# Work out the next tablet and screen orientations (rotating clockwise)
case "$rotate" in
    none) nextRotate="cw"
          nextOrient="right" ;;
    cw)   nextRotate="half"
          nextOrient="inverted" ;;
    half) nextRotate="ccw"
          nextOrient="left" ;;
    ccw)  nextRotate="none"
          nextOrient="normal" ;;
esac

# Rotate the screen
xrandr -o $nextOrient

# Rotate the tablet
xsetwacom set "$tablet" Rotate $nextRotate

# Rotate the buttons

case "$nextOrient" in
    right) setkeycodes 71 105 #up
   setkeycodes 6d 103 #right
           setkeycodes 6f 106 #down
           setkeycodes 6e 108 #left
           ;;
    inverted) setkeycodes 71 108 #up
      setkeycodes 6d 105 #right
              setkeycodes 6f 103 #down
              setkeycodes 6e 106 #left
              ;;
    left) setkeycodes 71 106 #up
  setkeycodes 6d 108 #right
          setkeycodes 6f 105 #down
          setkeycodes 6e 103 #left
          ;;
    normal) setkeycodes 71 103 #up
    setkeycodes 6d 106 #right
    setkeycodes 6f 108 #down
    setkeycodes 6e 105 #left
            ;;
esac


Ссылки на источники и полезные статьи:
http://www.thinkwiki.org/wiki/Tablet_Hardware_Buttons
https://wiki.archlinux.org/index.php/Xbindkeys
http://www.thinkwiki.org/wiki/Installing_Ubuntu_10.04_%28Lucid_Lynx%29_on_a_ThinkPad_X61_Tablet
https://help.ubuntu.com/community/MultimediaKeys
http://www.tux.in.ua/articles/458