xmodmap para combinação de teclas - como alternar o comportamento Fn?

9

Com o teclado Logitech K290 via USB, as teclas F. não são acessíveis por padrão, e preciso pressionar Fnantes de usá-las, o que não é realmente utilizável.

A Fnchave sozinha não dispara nenhum evento xev.

Pressionando F1sem Fnfogos dois eventos-chave, keycode 50 ( Shift_L) e keycode 133 ( Super_L) e exibe uma mensagem "Touchpad desactivado" no meu Kubuntu (a mesma mensagem para cada chaves F1através F4)

Embora a maioria das teclas de mídia funcione, prefiro ter acesso direto às teclas F. Você conhece alguma maneira de mudar o Fncomportamento?

Aqui está a saída para quando eu pressiono F1sem 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

E para F2(ainda não 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

F1com Fnfornece o resultado esperado:

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
fonte
2
Normalmente, o <kbd> Fn </kbd> funciona no nível de hardware do teclado. Esperançosamente , os códigos de teclas, ao contrário das academias de teclas, das teclas F ainda diferem quando não são pressionadas. Você pode executar xevnovamente e colar a saída para duas teclas F diferentes?
9000
Eu me deparei com o mesmo problema :( Essa resposta (. Askubuntu.com/a/285604/121193 ) pode ser útil, mas seria bom para algo ... mais simples.
Ash
1
Infelizmente, Solaar só funciona para emissores sem fio, queridos não cabeadas :(
user55574
Eu começaria procurando nas configurações do BIOS. Alguns permitem trocar a tecla Fn por exemplo teclas F-por-default ..
Jonas Berlin
realmente desagradável que F1 reutilizações código de acesso 50, para que você não pode simplesmente mudar o que faz 50 quer ..: P
Jonas Berlin

Respostas:

1

Obtive o mesmo resultado trocando os códigos de chave entre Fn+Fxe Fxonde x está 1,2,...12.

  1. Use xmodmap -pkepara obter uma lista dos códigos e símbolos das chaves atuais.
  2. Em seguida, executar xeve pressione F1através F12mantendo nota do seu código.
  3. Em seguida, faça a troca no seu ~/.Xmodmaparquivo.

Por exemplo, no meu sistema, o resultado de (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
..

Então eu troquei ~/.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
...

Então, para executar o efeito xmodmap ~/.Xmodmap.

rajames
fonte
0

xevnão pode mostrar eventos capturados pelo ambiente da área de trabalho. Uma maneira melhor de testar chaves é usando o showkeycomando (no console do Linux, não no X11). Suponho que o sistema operacional esteja realmente recebendo uma combinação de teclas Shift + Super +.

Embora você possa remapear a combinação com apenas uma tecla F, provavelmente seria problemático: você teria que "liberar" a tecla Shift (porque o teclado simula pressioná-la), e fazer o Shift + F1 funcionar seria ainda mais complicado. , pois exigiria rastreamento se a tecla Shift fosse pressionada anteriormente.

Esse problema é muito comum em laptops, que geralmente possuem uma combinação de teclas para alternar teclas de atalho multimídia ou uma opção em seu BIOS / firmware. Mas como você mencionou que isso se refere a um modelo específico de teclado externo, procurando online, encontrei este projeto:

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

A descrição do projeto afirma que "reconfigura a maneira como as teclas de função dos teclados Logitech K290 funcionam"; portanto, vale a pena tentar.

Vladimir Panteleev
fonte