Contexto
Yo uso xkbset
para habilitar las teclas adhesivas:
xkbset sticky -twokey latchlock ## set sticky keys, don't disable via twokey
xkbset exp 1 =sticky ## don't expire sticky keys
Eso hace exactamente lo que quiero, permitiéndome tocar y soltar la Shifttecla, y luego presionar otra tecla y obtener el valor "desplazado". Al tocar dos veces Shiftobtengo CapsLock, y lo mismo funciona para Ctrl, Alt, Hyper.
Sin embargo, a veces me quedo atascado con uno o más de los modificadores en la configuración "bloqueada", y puede ser difícil determinar cuáles se activan para poder liberarlos.
Pregunta: ¿Hay alguna forma de "esperar" las teclas adhesivas?
Es decir, si presioné un modificador fijo o bloqueé un modificador, volver a la normalidad después de aproximadamente 5 segundos sin presionar más teclas.
Sé que puedo usar xkbset
para caducar una configuración después de un tiempo determinado, pero eso desactiva las teclas adhesivas por completo. Lo que quiero es liberar todos los modificadores después de unos segundos de inactividad, pero mantener el comportamiento de las teclas adhesivas la próxima vez que presione una tecla modificadora.
EDITAR
Para aclarar la diferencia, si uso las opciones de caducidad, lo que obtendría es:
- Activo el bloqueo de mayúsculas tocando Shiftdos veces.
- Accidentalmente bloqueo el control al tocar Ctrldos veces.
- Sigue la confusión, ya que al presionar Ase ingresa Ctrl- Shift- .A
- Después del período de caducidad, los modificadores de cambio y control 'atascados' se eliminan, pero los modificadores ya no son fijos: al tocar Shifty luego presionar A, obtengo un regular
a
, no un desplazamientoA
En cambio, me gustaría el siguiente comportamiento después del punto "sigue la confusión":
- Espero tres segundos y luego se eliminan los modificadores de cambio y control "atascados" (es decir, al presionar
a
se produce una
), pero los modificadorestodavía están pegajosos- tocando Shifty luego presionando a, obtengo un desplazamientoA
.
Estoy usando el i3
administrador de ventanas, por lo que idealmente me gustaría una solución que no dependa de un paquete completo de administración de escritorio.
Alternativa: ¿llamar automáticamente un script (una vez) después de un período de inactividad del teclado?
Como solución alternativa, definí un método abreviado de teclado que restablecerá mi xkbset
configuración independientemente de qué modificadores se presionen (es decir, + PrintScr, + + , etc., todos están vinculados al mismo script). Ejecutar este script automáticamente después de 5 segundos de inactividad del teclado haría lo que busco.ShiftPrintScrCtrlShiftPrintScr
Respuesta1
La solución a la pregunta parece ser un script como el siguiente usandoxprintidlepara determinar cuándo restablecer el estado de bloqueo. Tenga en cuenta que tiene un bucle de sondeo, por lo que debe seguir ejecutándose continuamente.
#!/bin/bash
# Sets sticky keys, but has them reset state (e.g. latchlock goes back to normal) after
# a few seconds
IDLE_RESET=3000 # 3 seconds
# Set up sticky keys and double tap to lock
xkbset sticky -twokey latchlock
# Disable XAccess managed sticky mode timeout
xkbset exp =sticky =latchlock
# Sentinel so we only run the reset once every idle period
sentinel=0
while true;do
if [ $(xprintidle) -gt $IDLE_RESET ];then
if [ $sentinel = 0 ];then
# Reset the state
xkbset -sticky -twokey -latchlock;xkbset sticky -twokey latchlock
sentinel=1
fi
else
sentinel=0
fi
sleep 1
done
Respuesta2
El texto de ayuda xkbset
sugiere que cualquier función de AccessX se puede desactivar automáticamente después de un tiempo de espera determinado:
To set the AccessX expire controls:
xkbset exp <options>
where <options> may be all or any of (<ax_timeout> is the timeout (in
seconds) after which no user activity on X will cause the expiry; '-'
indicates the feature will be switched off, '=' incicates the feature
will be left unchanged, otherwise it will be switched on):
<ax_timeout>
[-|=]{bell|b}
[-|=]{repeatkeys|r}
[-|=]{mousekeys|m}
[-|=]{mousekeysaccel|ma}
[-|=]{accessx|a}
[-|=]{sticky|st} [[-|=]twokey|[-|=]latchlock]...
[-|=]{slowkeys|sl}
[-|=]{bouncekeys|bo}
[-|=]{feedback|f} [[-|=]dumbbell|[-|=]led|[-|=]feature|[-|=]slowwarn|
[-|=]slowpress|[-|=]slowaccept|[-|=]slowreject|[-|=]slowrelease|
[-|=]bouncereject|[-|=]stickybeep]...
[-|=]{overlay1|ov1}
[-|=]{overlay2|ov2}
[-|=]ignoregrouplock
Y un ejemplo sobre elwiki de ubuntumuestra la siguiente línea de comando para hacer esto:
# setting the expiry of the accessx settings
/usr/bin/xkbset exp -bell -sticky -twokey -latchlock -accessx -feedback -stickybeep -led