ситуация
У меня есть мобильная клавиатура Microsoft Sculpt, подключенная через Bluetooth. На моем ноутбуке работает xUbuntu 16.04.
Клавиши Sculpt Mobile Keyboard от F1 до F12 работают как функциональные клавиши Play/Pause, Mute, .... Чтобы использовать клавиши от F1 до F12 по назначению, нужно нажать клавиши Fn , расположенные справа. Это довольно неудобно, если вы хотите нажать ALT+F4 .... Я хотел бы постоянно переключаться на клавиши Fx (или блокировать клавишу Fn ). Кроме того, я хотел бы переключить ключи PageUp и PageDown на Home и End .
Windows Solution
Используйте AutoHotKey, как описано в
- Microsoft Sculpt Mobile Keyboard обратные клавиши Fn и
- "Microsoft Sculpt Mobile Keyboard Remap" для AutoHotKey на GitHub.
Нерабочее решение
Ответ относится к другой клавиатуре
Решение Linux для других клавиатур (не работает)
Должно быть возможно изменить или переключить ключи с помощью инструментов командной строки xkbcomp
или setxkbmap
как описано здесь:
- Superuser: Как переназначить клавиши под Linux только для конкретной клавиатуры
- AskUbuntu: Что противоположно setxkbmap -option ctrl: nocaps?
- Stackoverflow: создание пользовательского параметра setxkbmap
- Обзор сопоставления ключей xkbcomp на GitHub
- AskUbuntu: изменение раскладки клавиатуры ТОЛЬКО для клавиатуры Bluetooth
- Unix и Linux: используйте setxkbmap, чтобы поменять местами левый Shift и левый элемент управления
Основываясь на этих вопросах и ответах, я использовал xev
чтобы найти имена ключей (идентификаторы XKB) рассматриваемых ключей. Я хотел создать следующее отображение:
# F1 to F5 (F5 probably does not work)
I172 -> FK01
MUTE -> FK02
VOL- -> FK03
VOL+ -> FK04
FIND -> FK05
# F11 and F12
FK22 -> FK11
FK23 -> FK12
# switch Page Up and Page Down with Home and End
PGUP -> HOME
HOME -> PGUP
PGDN -> END
END -> PGDN
Таким образом, я создал соответствующий код:
xkb_symbols "remote" {
key <I172> {
type= "CTRL+ALT",
symbols[Group1]= [ F1, F1, F1, F1, XF86Switch_VT_1 ]
};
key <MUTE> {
type= "CTRL+ALT",
symbols[Group1]= [ F2, F2, F2, F2, XF86Switch_VT_2 ]
};
key <VOL-> {
type= "CTRL+ALT",
symbols[Group1]= [ F3, F3, F3, F3, XF86Switch_VT_3 ]
};
key <VOL+> {
type= "CTRL+ALT",
symbols[Group1]= [ F4, F4, F4, F4, XF86Switch_VT_4 ]
};
key <FIND> {
type= "CTRL+ALT",
symbols[Group1]= [ F5, F5, F5, F5, XF86Switch_VT_5 ]
};
key <FK22> {
type= "CTRL+ALT",
symbols[Group1]= [ F11, F11, F11, F11, XF86Switch_VT_11 ]
};
key <FK23> {
type= "CTRL+ALT",
symbols[Group1]= [ F12, F12, F12, F12, XF86Switch_VT_12 ]
};
key <PGDN> { [ End ] };
key <END> { [ Next ] };
key <PGUP> { [ Home ] };
key <HOME> { [ Prior ] };
};
И добавил его к существующему определению карты ключей с помощью xkbcomp
и добавил +custom(remote)
в переменную xkb_symbols
отображения ключей устройства, соответствующего устройству. Это не работает.
Я думаю, что они, возможно, не работают, потому что клавиатура распознается как указатель, а не как клавиатура. xinput list
говорит:
⎡ Virtual core pointer id=2 [master pointer (3)]
⎜ ↳ Virtual core XTEST pointer id=4 [slave pointer (2)]
⎜ ↳ Logitech USB Mouse id=11 [slave pointer (2)]
⎜ ↳ AlpsPS/2 ALPS DualPoint TouchPad id=14 [slave pointer (2)]
⎜ ↳ AlpsPS/2 ALPS DualPoint Stick id=15 [slave pointer (2)]
⎜ ↳ Microsoft Sculpt Mobile Keyboard id=17 [slave pointer (2)]
⎣ Virtual core keyboard id=3 [master keyboard (2)]
↳ Virtual core XTEST keyboard id=5 [slave keyboard (3)]
↳ Power Button id=6 [slave keyboard (3)]
↳ Video Bus id=7 [slave keyboard (3)]
↳ Video Bus id=8 [slave keyboard (3)]
↳ Power Button id=9 [slave keyboard (3)]
↳ Sleep Button id=10 [slave keyboard (3)]
↳ Laptop_Integrated_Webcam_E4HD id=12 [slave keyboard (3)]
↳ AT Translated Set 2 keyboard id=13 [slave keyboard (3)]
↳ Dell WMI hotkeys id=16 [slave keyboard (3)]
Альтернативные решения (не пробовали)
Я читал о некоторых мышах, которые были распознаны как клавиатура, а не как указатель. Изменение кода ядра Linux + перекомпиляция его было одним из решений. Я не хочу перекомпилировать Ядро только для того, чтобы моя клавиатура нормально работала ...
Аппаратное решение (работает)
Вопрос
- Мое предположение в "Linux Solution for other Keyboards" неверно?
- Если ответ на первый вопрос - нет: как мне решить описанную проблему программно (переключать и заменять ключи) без перекомпиляции моего ядра?