Захоплення ключового вводу з пристрою подій та його відображення (перемикання клавіші сенсорної панелі не знято)


10

У мене Lenovo IdeaPad Yoga 13 з встановленим Ubuntu 13.10. На клавіатурі пристрій має кнопку «Переключити сенсорну панель» ( 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, і я помітив, що є різниця зміщення 8, тому я спробував setkeycodesкоманду ще раз, але ключ відображений keycode 191.

sudo setkeycodes e03e 191

Це спрацювало чудово.

EDIT - рішення, яке я запропонував працювати над запуском, не відповідає. Я розберу це завтра і оновлю цю відповідь. На даний момент я думаю, ви можете запустити це при запуску вручну.


1
як зробити його постійним в приємний спосіб? (тобто після скидання / завантаження)
vak

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щоб перелічити його властивості; один з них повинен бути названий "Увімкнено пристрій" з номером поруч (наприклад, 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

Дякую за відповідь. Це, на жаль, не вийшло. У мене все це працює, тому сміливо дивіться на власну відповідь! :)
Hosh Sadiq
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.