Tempo limite para teclas aderentes

Tempo limite para teclas aderentes

Contexto

Eu uso xkbsetpara ativar teclas aderentes:

xkbset sticky -twokey latchlock ## set sticky keys, don't disable via twokey
xkbset exp 1 =sticky ## don't expire sticky keys

Isso faz exatamente o que eu quero, permitindo-me tocar e soltar a Shifttecla e, em seguida, pressionar outra tecla e obter o valor ‘deslocado’. Tocar duas vezes Shiftme dá , CapsLocke o mesmo funciona para Ctrl,, Alt.Hyper

No entanto, às vezes fico preso com um ou mais modificadores na configuração 'bloqueado' e pode ser difícil descobrir quais deles são acionados para liberá-los.

Pergunta: Existe uma maneira de 'limitar o tempo limite' das teclas aderentes?

Ou seja, se eu pressionei um modificador fixo ou bloqueei um modificador, ele voltará ao normal após cerca de 5 segundos, sem pressionar mais nenhuma tecla.

Eu sei que posso xkbsetexpirar uma configuração após um tempo definido, mas isso desativa totalmente as teclas aderentes. O que eu quero é liberar todos os modificadores após alguns segundos de inatividade, mas manter o comportamento das teclas aderentes na próxima vez que eu pressionar uma tecla modificadora.

EDITAR

Para esclarecer a diferença, se eu usar as opções de expiração, o que obterei é:

  • Eu ligo o bloqueio de mudança tocando Shiftduas vezes.
  • Bloqueio acidentalmente o controle tocando Ctrlduas vezes.
  • Segue-se confusão, pois pressionar Aresulta em Ctrl- Shift- Asendo inserido.
  • Após o período de expiração, os modificadores de shift e controle 'travados' são removidos, mas os modificadores não são mais fixos - tocando Shifte pressionando A, recebo um regular a, não um shiftedA

Em vez disso, gostaria do seguinte comportamento após o ponto "segue-se confusão":

  • Espero três segundos e, em seguida, os modificadores de shift e controle 'travados' são removidos (ou seja, pressionar aproduz um a), mas os modificadoresainda estão pegajosos– tocando Shifte depois pressionando a, recebo um shift A.

Estou usando o i3gerenciador de janelas, então, idealmente, gostaria de uma solução que não dependesse de um conjunto completo de gerenciadores de desktop.

Alternativa: chamar automaticamente um script (uma vez) após um período de inatividade do teclado?

Como solução alternativa, defini um atalho de teclado que redefinirá minha xkbsetconfiguração, independentemente de quais modificadores forem pressionados (ou seja, PrintScr, Shift+ PrintScr, Ctrl+ Shift+ PrintScretc estão todos vinculados ao mesmo script). Executar esse script automaticamente após 5 segundos de inatividade do teclado faria o que procuro.

Responder1

A solução para a questão parece ser um script como o seguinte usandoxprintidlepara descobrir quando redefinir o estado de bloqueio. Observe que ele possui um loop de pesquisa, portanto, precisa continuar funcionando 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

Responder2

O texto de ajuda xkbsetsugere que qualquer recurso do AccessX pode ser desativado automaticamente após um determinado tempo limite:

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

E um exemplo noWiki do Ubuntumostra a seguinte linha de comando para fazer isso:

# setting the expiry of the accessx settings
/usr/bin/xkbset exp -bell -sticky -twokey -latchlock -accessx -feedback -stickybeep -led

informação relacionada