xmodmap для комбинации клавиш - как переключить поведение Fn?

9

С клавиатурой Logitech K290 через USB, клавиши F. по умолчанию недоступны, и мне нужно нажать их Fnперед использованием, что не очень удобно.

Один Fnключ не запускает никаких событий в xev.

Нажатие F1без Fnпожаров двух ключевых событий, KEYCODE 50 ( Shift_L) и KEYCODE 133 ( Super_L) и выводит на экран сообщение «Сенсорная панель отключена» на моей Kubuntu (то же самое сообщение для каждых ключей F1через F4)

Несмотря на то, что большинство медиа-клавиш работает, я бы предпочел прямой доступ к F.-ключам. Знаете ли вы какой-либо способ переключения Fnповедения?

Вот вывод для когда я нажимаю F1без Fn:

KeyPress event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64638420, (-352,274), root:(1462,621),
    state 0x10, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64638420, (-352,274), root:(1462,621),
    state 0x11, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

FocusOut event, serial 40, synthetic NO, window 0x1a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 40, synthetic NO, window 0x1a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 40, synthetic NO, window 0x0,
    keys:  4294967238 0   0   0   0   0   4   0   0   0   0   0   0   0   0   0   
           32  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

KeyRelease event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64638436, (-352,274), root:(1462,621),
    state 0x51, keycode 50 (keysym 0xffe1, Shift_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64638436, (-352,274), root:(1462,621),
    state 0x50, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

MappingNotify event, serial 40, synthetic NO, window 0x0,
    request MappingPointer, first_keycode 0, count 0

И для F2(до сих пор нет Fn):

KeyPress event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64782724, (-202,438), root:(1491,799),
    state 0x10, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyPress event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64782724, (-202,438), root:(1491,799),
    state 0x18, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

FocusOut event, serial 40, synthetic NO, window 0x1a00001,
    mode NotifyGrab, detail NotifyAncestor

FocusIn event, serial 40, synthetic NO, window 0x1a00001,
    mode NotifyUngrab, detail NotifyAncestor

KeymapNotify event, serial 40, synthetic NO, window 0x0,
    keys:  4294967238 0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   
           32  0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   

KeyRelease event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64782780, (-202,438), root:(1491,799),
    state 0x58, keycode 64 (keysym 0xffe9, Alt_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64782780, (-202,438), root:(1491,799),
    state 0x50, keycode 133 (keysym 0xffeb, Super_L), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False

F1с Fnдает ожидаемый результат:

KeyPress event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64820204, (-856,-213), root:(1097,247),
    state 0x10, keycode 67 (keysym 0xffbe, F1), same_screen YES,
    XLookupString gives 0 bytes: 
    XmbLookupString gives 0 bytes: 
    XFilterEvent returns: False

KeyRelease event, serial 40, synthetic NO, window 0x1a00001,
    root 0x2c6, subw 0x0, time 64820284, (-856,-213), root:(1097,247),
    state 0x10, keycode 67 (keysym 0xffbe, F1), same_screen YES,
    XLookupString gives 0 bytes: 
    XFilterEvent returns: False
user55574
источник
2
Обычно <kbd> Fn </ kbd> работает на аппаратном уровне клавиатуры. Надеемся, что коды клавиш , в отличие от клавиш, у F-клавиш все еще различаются, когда они не нажаты. Не могли бы вы xevеще раз запустить и вставить вывод для двух разных F-клавиш?
9000
Я сталкивался с той же проблемой :(. Этот ответ ( askubuntu.com/a/285604/121193 ) может быть полезен, но это было бы неплохо для чего-то ... более простого.
Ash
1
К сожалению, Solaar работает только для беспроводных излучателей, а не для проводных :(
user55574
Я бы начал с просмотра настроек BIOS. Некоторые позволяют менять клавишу Fn, например, F-keys-по-умолчанию ..
Jonas Berlin
действительно противно, что F1 повторно использует код 50, так что вы не можете просто изменить то, что делает 50 тоже ..: P
Jonas Berlin

Ответы:

1

Я получил тот же результат, поменяв местами коды клавиш Fn+Fxи Fxгде х 1,2,...12.

  1. Используйте xmodmap -pkeдля получения списка текущих кодов клавиш и символов клавиш.
  2. Затем запустите xevи нажмите F1через F12сохранение к сведению его клавиатурным.
  3. Затем сделайте обмен в вашем ~/.Xmodmapфайле.

Например, в моей системе результат (1):

keycode 67 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1
keycode 68 = F2 F2 F2 F2 F2 F2 XF86Switch_VT_2
keycode 69 = F3 F3 F3 F3 F3 F3 XF86Switch_VT_3
keycode 70 = F4 F4 F4 F4 F4 F4 XF86Switch_VT_4
...

keycode 121 = XF86AudioMute NoSymbol XF86AudioMute
keycode 122 = XF86AudioLowerVolume NoSymbol XF86AudioLowerVolume
keycode 123 = XF86AudioRaiseVolume NoSymbol XF86AudioRaiseVolume
keycode 198 = XF86AudioMicMute NoSymbol XF86AudioMicMute
..

Затем я поменял его ~/.Xmodmap:

keycode 121 = F1 F1 F1 F1 F1 F1 XF86Switch_VT_1
keycode 122 = F2 F2 F2 F2 F2 F2 XF86Switch_VT_2
keycode 123 = F3 F3 F3 F3 F3 F3 XF86Switch_VT_3
keycode 198 = F4 F4 F4 F4 F4 F4 XF86Switch_VT_4
...


keycode 67 = XF86AudioMute NoSymbol XF86AudioMute
keycode 68 = XF86AudioLowerVolume NoSymbol XF86AudioLowerVolume
keycode 69 = XF86AudioRaiseVolume NoSymbol XF86AudioRaiseVolume
keycode 70 = XF86AudioMicMute NoSymbol XF86AudioMicMute
...

Затем, чтобы принять эффект запустить xmodmap ~/.Xmodmap.

rajames
источник
0

xevне может отображать события, захваченные средой рабочего стола. Лучший способ проверить ключи - использовать showkeyкоманду (в консоли Linux, а не внутри X11). Я предполагаю, что ОС фактически получает комбинацию клавиш Shift + Super + some-key.

Хотя вы могли предположительно переназначить указанную комбинацию просто на клавишу F, это, вероятно, было бы проблематично: вам пришлось бы «отпустить» клавишу Shift (потому что клавиатура имитирует нажатие на нее), и заставить работать Shift + F1 было бы еще сложнее , поскольку это потребовало бы отслеживания, если клавиша Shift была нажата ранее.

Эта проблема очень распространена на ноутбуках, которые часто имеют либо комбинацию клавиш для переключения мультимедийных горячих клавиш, либо опцию в их BIOS / прошивке. Но, как вы упомянули, что это касается конкретной модели внешней клавиатуры, глядя в Интернете, я нашел этот проект:

https://github.com/milgner/k290-fnkeyctl

В описании проекта говорится, что он «перенастраивает работу функциональных клавиш на клавиатурах Logitech K290», поэтому стоит попробовать.

Владимир Пантелеев
источник