Tiempo de espera para teclas adhesivas

Tiempo de espera para teclas adhesivas

Contexto

Yo uso xkbsetpara 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 xkbsetpara 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 ase produce un a), pero los modificadorestodavía están pegajosos- tocando Shifty luego presionando a, obtengo un desplazamiento A.

Estoy usando el i3administrador 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 xkbsetconfiguració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 xkbsetsugiere 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

información relacionada