xmodmap para combinación de teclas: ¿cómo alternar el comportamiento de Fn?

9

Con el teclado Logitech K290 a través de USB, las teclas F. no son accesibles de manera predeterminada, y necesito presionar Fnantes de usarlas, lo cual no es realmente utilizable.

La Fnclave por sí sola no dispara ningún evento xev.

Al pulsar F1sin Fnincendios dos eventos clave, código de tecla 50 ( Shift_L) y el código de tecla 133 ( Super_L) y muestra un mensaje "Panel táctil con discapacidad" en mi Kubuntu (el mismo mensaje para cada llaves F1a través de F4)

Si bien la mayoría de las teclas multimedia funcionan, prefiero tener acceso directo a las teclas F. ¿Conoces alguna forma de alternar el Fncomportamiento?

Aquí está la salida para cuando presiono F1sin 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

Y para F2(todavía no 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

F1con Fnda el 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
usuario55574
fuente
2
Por lo general, <kbd> Fn </kbd> funciona en el nivel de hardware del teclado. Con suerte , los códigos de teclas , a diferencia de los símbolos de teclas, de las teclas F aún difieren cuando no se presionan. ¿Puede ejecutar xevuna vez más y pegar la salida para dos teclas F diferentes?
9000
Me he encontrado con el mismo problema :(. Esta respuesta ( askubuntu.com/a/285604/121193 ) podría ser útil, pero sería bueno para algo ... más simple.
Ash
1
Lamentablemente, Solaar solo funciona para emisores inalámbricos, no para cables :(
user55574
Comenzaría buscando en la configuración del BIOS. Algunos permiten intercambiar la tecla Fn, por ejemplo, teclas F por defecto ..
Jonas Berlin
realmente desagradable que F1 reutiliza el código clave 50, por lo que tampoco puedes cambiar lo que hace 50: P
Jonas Berlin

Respuestas:

1

Obtuve el mismo resultado intercambiando los códigos clave entre Fn+Fxy Fxdonde está x 1,2,...12.

  1. Use xmodmap -pkepara obtener una lista de los códigos de teclas y símbolos de teclas actuales.
  2. A continuación, ejecute xevy pulse F1través F12manteniendo nota de su código clave.
  3. Luego haga el intercambio en su ~/.Xmodmaparchivo.

Por ejemplo, en mi sistema el 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
..

Luego lo cambié ~/.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
...

Luego de tomar efecto correr xmodmap ~/.Xmodmap.

rajames
fuente
0

xevno puede mostrar eventos capturados por el entorno de escritorio. Una mejor manera de probar las teclas es usar el showkeycomando (en la consola de Linux, no dentro de X11). Supongo que el sistema operativo realmente está recibiendo una combinación Shift + Super + alguna tecla.

Aunque podría reasignar dicha combinación a solo una tecla F, probablemente sería problemático: tendría que "soltar" la tecla Shift (porque el teclado simula presionarla), y hacer que Shift + F1 funcione sería aún más complicado , ya que requeriría seguimiento si la tecla Mayús se mantuviera presionada anteriormente.

Este problema es muy común en las computadoras portátiles, que a menudo tienen una combinación de teclas para alternar teclas de acceso rápido multimedia o una opción en su BIOS / firmware. Pero como mencionó que se trata de un modelo específico de teclado externo, buscando en línea encontré este proyecto:

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

La descripción del proyecto indica que "reconfigura la forma en que funcionan las teclas de función en los teclados Logitech K290", por lo que puede valer la pena intentarlo.

Vladimir Panteleev
fuente