[РЕШЕНО] Как избавиться от залипания клавиши Fn в Linux?

improovizator
Я так понял кейкоды это 72, 73, 74. Так что с ними дальше то делать?
Мне кажется, ты не использовал при нажатии эту самую Fn. Поэтому коды другие. Fn - "железная" клавиша, она сама по себе не имеет кода, а при нажатии изменяет поведение отдельных клавиш.
Короче, попробуй те же клавиши F6,F7,F8 в сочетании с Fn
На мой взгляд ТС, в указанном топике BBS, использует термин keycodes, но имеет в виду scancode (1-ый уровень идентификации клавиши), а не к keycode (2-ой уровень идентификации клавиши) … поэтому нужно определять scancode — перейти в текстовую консоль и использовать утилиту showkey -s , которая показывает scancode (идетификатор клавиши в 16-ричном исчислении) …. что вообщем то и написано в топике
from a VT as root and use this to get a list of keycodes which are giving problems....
In my case, this showed the following keycodes:
scan code: 0xA0   key code: mute
scan code: 0xAE   key code: volumedown
scan code: 0xB0   key code: volumeup
PS … as root не обязательно ...
Ошибки не исчезают с опытом - они просто умнеют
toZen
Работают!
Ты имеешь ввиду, что работает без всякой привязки Fn + FN (на прямую)???? ....не согласен ... (точнее мне такое не известно) работает, но нужно определить ..... а для меня удобнее при определении использовать не Fn , а MOD ...
PS ... toZen, вообщем не удачно я применил эту фразу "не работает" ..... не нужно было даже и писать ...... но имел ввиду следующее - что комбинация Fn + FN не работает на прямую, без привязки/описания этой комбинации в конфиге .... ну вот такой я - сначала пишу, хорошо не продумав, а потом начинается непонимание ....
Ошибки не исчезают с опытом - они просто умнеют
Нашел кейкоды для комбинаций, даже названия правильные высветились (XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume):
KeyPress event, serial 36, synthetic NO, window 0x1000001,
    root 0x270, subw 0x0, time 120414, (627,291), root:(683,384),
    state 0x0, keycode 121 (keysym 0x1008ff12, XF86AudioMute), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyPress event, serial 36, synthetic NO, window 0x1000001,
    root 0x270, subw 0x0, time 120418, (627,291), root:(683,384),
    state 0x0, keycode 122 (keysym 0x1008ff11, XF86AudioLowerVolume), same_screen YES,
    XLookupString gives 0 bytes:
    XmbLookupString gives 0 bytes:
    XFilterEvent returns: False

KeyRelease event, serial 36, synthetic NO, window 0x1000001,
    root 0x270, subw 0x0, time 123837, (627,291), root:(683,384),
    state 0x0, keycode 123 (keysym 0x1008ff13, XF86AudioRaiseVolume), same_screen YES,
    XLookupString gives 0 bytes:
    XFilterEvent returns: False

Для тех, кто столкнется: Комбинацию узнать не сможете, пока не переназначите комбинации в DE. Я переназначил на Super + F6 / F7 / F8.
Перезагрузитесь, если уже нажимали комбинацию. Вывод команды xev при нажатии будет огромный (видимо из-за залипания), не надо пугаться, просто найдите три нужные записи.
Всё меняется.
Вывел по showkey:
sudo showkey -s
kb mode was ?UNKNOWN?
[ if you are trying this under X, it might not work
since the X server is also reading /dev/console ]

press any key (program terminates 10s after last keypress)...
0x9c
0xe0 0x20
0xe0 0x2e
0xe0 0x30
Всё меняется.
Перевел из шестнадцатиричной:
echo $((16#20))
32

echo $((16#2e))
46

echo $((16#30))
48

Странно, что оно не совпадает с результатом xev. Немного запутался что делать дальше. Если у них так:
cat /sys/bus/serio/devices/serio0/force_release
369-370

echo 369-370,160,174,176 > /sys/bus/serio/devices/serio0/force_release

А у меня так:
cat /sys/bus/serio/devices/serio0/force_release
130-132,134,136-137,177,179-180,197,213,247,249,369-370

Тогда мне сделать следующее?
echo 130-132,134,136-137,177,179-180,197,213,247,249,369-370, 121, 122, 123 > /sys/bus/serio/devices/serio0/force_release

Что-то оно не похоже на решение, с виду вообще не то.
Всё меняется.
Твой вывод ….....
improovizator
0x9c
0xe0 0x20
0xe0 0x2e
0xe0 0x30
По идее твой skancode = 30 …... но требует уточнения....
Не нравятся мне твои значения и вдобавок еще имеется и третье значение … 0x30, которого при нормальном раскладе быть не должно …... (похоже была замена/переназначение …) … нужно будет делать проверку ...
Мой вывод scancode Fn+F8
0x9c
0xe0 0x2e
0xe0 0xae
skancode = ae
если старший бит равен 0 (0xe0) — нажатие
если старший бит равен 1 (0xe1) — отпускание

Рекомендую проверить, используя утилиту evtest …
sudo evtest
(…...... смотрим и выбираем свою клавиатуру ...)
Select the device event number [0-14]: 4
После выбора нажимаем требуемые комбинации, например, Fn+F8 … и получаем
Event: time 1484390009.213401, type 4 (EV_MSC), code 4 (MSC_SCAN), value ae
Event: time 1484390009.213401, type 1 (EV_KEY), code 114 (KEY_VOLUMEDOWN), value 0
Откуда видим, что комбинация нормально определяется и соответствует VOLUMEDOWN , также видим ее keycode 114 и, главное, skancode ae
UPD ….. Но есть одно но, в части определения кейкода разными утилитами. Например, xev ту же комбинацию Fn+F8 покажет так
state 0x0, keycode 122 (keysym 0x1008ff11, XF86AudioLowerVolume), same_screen YES,
И, как видим, имеется разница в определении кейкода (отличие на 8) evtest — 114, а xev — 122 (8 добавляет Xorg …... etest показывает такой же результат, как и showkey -k из текстовой консоли)
PS … в принципе можно и это еще перепроверить, используя getkeycodes (таблица соответствия сканкодов и кейкодов … запускается так же, как и showkey только в консоли) …... моему кейкоду 114 соответствует сканкод 2e (что у меня и показывает - 1-ое значение 2e, 2-ое значение ae …...... между ними разница в 128 в 10-ом исчислении …... все нормально)

Плюс к этому не нравятся и эти значения
improovizator
cat /sys/bus/serio/devices/serio0/force_release 130-132,134,136-137,177,179-180,197,213,247,249,369-370
Попробуй поэкспериментируй ....... оставь только 369-370 ...... интересно посмотреть что будет ...
Ошибки не исчезают с опытом - они просто умнеют
improovizator, проверь нормальные комбинации клавиш ....... какие будут отличия .... и желательно записать всю инфу и рекомендую записать в таблицу, я обычно делаю так ...... лучше видно ну и чтоб по несколько раз не смотреть одно и тоже ..
Сравнив все это, можно будет что то и предположить и выбрать дальнейшее решение ....
Ошибки не исчезают с опытом - они просто умнеют
improovizator
echo 369-370,160,174,176 > /sys/bus/serio/devices/serio0/force_release
160, 174, 176 ........ это в принципе похоже на твои значения, но увеличенные на 128 ( 32, 46, 48) ...... но нужно разбираться почему у тебя такое малое значение сканкодов ......... такое впечатление, что у тебя используется 1-ая часть таблицы getkeycodes, а не 2-ая, хотя ... хотя написано e0, значит 2-ая ... лучше все перепроверить ..... и советую самому почитать об всем этом, чтобы идти дальше ....... пояснять долго и нудно - это очень большая тема ...
Ошибки не исчезают с опытом - они просто умнеют
showkeys показывает именно эти значения.

Результаты действительно разные, вывод evtest:
Event code 113 (KEY_MUTE)
Event code 114 (KEY_VOLUMEDOWN)
Event code 115 (KEY_VOLUMEUP)

Нажатие в evtest вывело это:
Event: time 1484403489.558978, type 4 (EV_MSC), code 4 (MSC_SCAN), value a0
Event: time 1484403489.558978, type 1 (EV_KEY), code 113 (KEY_MUTE), value 2
Event: time 1484403489.558978, -------------- SYN_REPORT ------------
Event: time 1484403492.382100, type 4 (EV_MSC), code 4 (MSC_SCAN), value ae
Event: time 1484403492.382100, type 1 (EV_KEY), code 114 (KEY_VOLUMEDOWN), value 2
Event: time 1484403492.382100, -------------- SYN_REPORT ------------
Event: time 1484403494.187227, type 4 (EV_MSC), code 4 (MSC_SCAN), value b0
Event: time 1484403494.187227, type 1 (EV_KEY), code 115 (KEY_VOLUMEUP), value 2
Event: time 1484403494.187227, -------------- SYN_REPORT ------------

Перевел сканкоды из шестнадцатиричной:
echo $((16#a0))
160
echo $((16#ae))
174
echo $((16#b0))
176

У меня Wayland, может быть это тоже играет какую-то роль?
Всё меняется.
 
Зарегистрироваться или войдите чтобы оставить сообщение.