Захват ввода с устройства событий и сопоставление его (кнопка TouchPad отключена)

10

У меня есть Lenovo IdeaPad Yoga 13 с установленной Ubuntu 13.10. На клавиатуре устройства есть кнопка «Toggle TouchPad» ( F5). F*Кнопки клавиатуры перевернуты (поэтому, чтобы получить F5, мне нужно нажать Fn+ F5, и F5на самом деле это кнопка переключения).

Я обнаружил, что кнопка на самом деле читается клавиатурой (а не сенсорной панелью, как на некоторых устройствах), которая находится на /dev/input/event3. Таким образом, с помощью sudo input-events 3я смог выяснить, что кнопка отправляет код сканирования 190:

Выход sudo lsinput:

/dev/input/event3
   bustype : BUS_I8042
   vendor  : 0x1
   product : 0x1
   version : 43907
   name    : "AT Translated Set 2 keyboard"
   phys    : "isa0060/serio0/input0"
   bits ev : EV_SYN EV_KEY EV_MSC EV_LED EV_REP

Выход sudo input-events 3:

23:13:03.849392: EV_MSC MSC_SCAN 190
23:13:03.849392: EV_SYN code=0 value=0
23:13:03.855413: EV_MSC MSC_SCAN 190
23:13:03.855413: EV_SYN code=0 value=0

Никакие другие программы (такие как xev), кажется, не в состоянии прочитать это кроме input-events. Есть ли способ привязать эту кнопку, чтобы она переключала сенсорную панель на моем ноутбуке? Если так, как я могу это сделать?

Хош Садик
источник

Ответы:

7

Как оказалось, ядро ​​все-таки подобрало его, но продолжало жаловаться, что оно не распознано.

Для тех, кто имеет эту проблему, или хочет сопоставить ключ, который не читается ОС, читайте дальше.

Откройте терминал и запустите dmesg | grep -A 1 -i setkeycodes. Это даст вам несколько записей, как это:

[    9.307463] atkbd serio0: Unknown key pressed (translated set 2, code 0xbe on isa0060/serio0).
[    9.307476] atkbd serio0: Use 'setkeycodes e03e <keycode>' to make it known.

Нас интересует шестнадцатеричное значение после «setkeycodes», в данном случае это так e03e. Если у вас есть несколько из них, вы можете запустить tail -f /var/log/kern.log. Как только вы это сделаете, вы можете нажать на кнопку, которую вы ищете, и это даст вам ту же строку, что и выше, и опять же, нам нужно только шестнадцатеричное значение. Запишите это.

Теперь запустите xmodmap -pke | lessи найдите соответствующее отображение. В моем случае мне нужно было сопоставить это с переключением моей сенсорной панели, а это значит, что меня заинтересовала следующая строка:

keycode 199 = XF86TouchpadToggle NoSymbol XF86TouchpadToggle

Если вы не можете найти то, что вас интересует, прочитайте также ответ @Gilles, так как вы можете также определить собственные отображения, а затем читать (если ядро ​​читает это, вам не нужно добавлять его в xorg.conf. г)

Теперь я побежал следующую команду: sudo setkeycodes [hexadecimal] [keycode], так что в моем случае , который стал: setkeycodes e03e 199.

Теперь вы можете использовать следующую строку для проверки работоспособности и / или правильного отображения:

xev | grep -A2 --line-buffered '^KeyRelease' | sed -n '/keycode /s/^.*keycode \([0-9]*\).* (.*, \(.*\)).*$/\1 \2/p'

Когда вы запускаете эту команду, вам нужно сосредоточиться на открывшемся окне ( xev) и проверить вывод консоли. В моем случае это звучит так:

207 NoSymbol

Это было явно неправильно, так как я запросил код ключа 199, поэтому он сопоставлен с XF86TouchpadToggle. Я проверил еще xmodmap -pkeраз и заметил, что keycode 207на самом деле он сопоставлен NoSymbol, и я заметил, что разница смещений setkeycodesравна 8, поэтому я попробовал команду еще раз, но ключ сопоставлен keycode 191.

sudo setkeycodes e03e 191

Это сработало отлично.

РЕДАКТИРОВАТЬ - решение, которое я предоставил для работы при запуске, не имеет. Я выясню это завтра и обновлю этот ответ. На данный момент я полагаю, вы можете запустить это при запуске вручную.

Хош Садик
источник
1
как сделать его постоянным в хорошем смысле? (т.е. после сброса / загрузки)
vak 11.11
4

Судя по всему, это клавиатура (распознаваемая программно как отдельная от «основной» клавиатуры), но X-сервер ее не слушает.

Попробуйте добавить раздел ввода под/etc/X11/xorg.conf.d . То есть создайте каталог, /etc/X11/xorg.conf.dесли он еще не существует, и создайте файл extra-keyboard-buttonsв этом каталоге, содержащий

Section "InputClass"
    Identifier "extra-keyboard-buttons"
    Driver "kbd"
    MatchProduct "AT Translated Set 2 keyboard"
EndSection

Я не уверен насчет этой MatchProductлинии; если это не работает, попробуйте поиграться с MatchXXXдирективами .

Как только этот файл настроен правильно, при запуске X-сервера он должен обрабатывать события с этой клавиатуры, и вы должны видеть события в xevи в других местах. Запишите код ключа (я не уверен, будет ли в этом случае код ключа X11 идентичным коду оборудования) и сопоставьте ему ключ-симулятор. Вы можете сделать это через файл, называемый .Xmodmapв вашем домашнем каталоге, содержащий

keycode 190 = XF86_Launch5

Теперь вы можете определить сочетания клавиш с помощью этих клавиш.

Чтобы переключить тачпад, используйте команду xinput. Запустите, xinput listчтобы увидеть, какие устройства ввода доступны, и запишите имя вашей сенсорной панели (я назову ее Touchpadниже). Запустите, xinput list-props Touchpadчтобы перечислить его свойства; один из них должен называться «Device Enabled» с номером рядом с ним (например, 135). Следующий скрипт переключит сенсорную панель:

#!/bin/sh
device_name='Touchpad'
property=135
flipped_state=$(xinput list-props "$device_name" |
                awk "/\\($property\\)/ {print 1 - \$NF}")
xinput set-prop "$device_name" "$property" "$flipped_state"

Сохраните это в файле ~/bin/toggle-touchpadи сделайте его исполняемым ( chmod +x ~/bin/toggle-touchpad). Чтобы связать его с ключом, установите xbindkeys и настройте его для запуска скрипта , добавив следующие строки ~/.xbindkeysrc:

"toggle-touchpad"
  XF86_Launch5
Жиль "ТАК - перестань быть злым"
источник
Спасибо за ответ. К сожалению, это не сработало. Я получил это работает, так что не стесняйтесь взглянуть на мой собственный ответ! :)
Хош Садик