Contexto
Eu uso xkbset
para 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 xkbset
expirar 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
a
produz uma
), mas os modificadoresainda estão pegajosos– tocando Shifte depois pressionando a, recebo um shiftA
.
Estou usando o i3
gerenciador 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 xkbset
configuraçã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 xkbset
sugere 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