Контекст
Я использую xkbset
для включения залипания клавиш:
xkbset sticky -twokey latchlock ## set sticky keys, don't disable via twokey
xkbset exp 1 =sticky ## don't expire sticky keys
Это делает именно то, что мне нужно, позволяя мне нажать и отпустить клавишу Shift, а затем нажать другую клавишу и получить «смещенное» значение. Двойное нажатие Shiftдает мне CapsLock, и то же самое работает для Ctrl, Alt, Hyper.
Однако иногда я застреваю с одним или несколькими модификаторами в «заблокированном» состоянии, и бывает сложно понять, какие из них срабатывают, чтобы их разблокировать.
Вопрос: Есть ли способ отключить залипание клавиш?
Это значит, что если я нажал «залипающий» модификатор или заблокировал модификатор, он должен вернуться в обычное состояние примерно через 5 секунд без дальнейших нажатий клавиш.
Я знаю, что я могу использовать, xkbset
чтобы завершить настройку после установленного времени, но это полностью отключает залипание клавиш. Я хочу, чтобы все модификаторы снимались после нескольких секунд бездействия, но чтобы поведение залипания клавиш сохранялось при следующем нажатии клавиши-модификатора.
РЕДАКТИРОВАТЬ
Чтобы прояснить разницу, если я использую параметры истечения срока действия, то я получу следующее:
- Я включаю блокировку Shift Shiftдвойным нажатием.
- Я случайно заблокировал управление, нажав Ctrlдважды.
- возникает путаница, поскольку нажатие Aприводит к вводу Ctrl- Shift- .A
- По истечении срока действия «застрявшие» модификаторы Shift и Control удаляются, но модификаторы больше не залипают — при нажатии Shiftи последующем нажатии Aя получаю обычный
a
, а не смещенный модификатор.A
Вместо этого я хотел бы, чтобы после точки «следует путаница» наблюдалось следующее поведение:
- Я жду три секунды, и затем «застрявшие» модификаторы shift и control удаляются (т.е. нажатие
a
вызываетa
), но модификаторывсе еще липкие- постукивая Shiftи затем нажимая a, я получаю смещенныйA
.
Я использую i3
оконный менеджер, поэтому в идеале мне хотелось бы решение, которое не зависело бы от полного набора менеджеров рабочего стола.
Альтернатива: автоматически вызывать скрипт (один раз) после определенного периода бездействия клавиатуры?
В качестве обходного пути я определил сочетание клавиш, которое будет сбрасывать мою xkbset
конфигурацию независимо от того, какие модификаторы нажаты (т. е. PrintScr, Shift+ PrintScr, Ctrl+ Shift+ PrintScrи т. д. все привязаны к одному и тому же сценарию). Автоматический запуск этого сценария после 5 секунд бездействия клавиатуры сделает то, что мне нужно.
решение1
Решением вопроса, по-видимому, является скрипт, подобный следующему, использующийxprintidleчтобы определить, когда сбросить состояние блокировки. Обратите внимание, что у него есть цикл опроса, поэтому он должен работать непрерывно.
#!/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
решение2
Текст справки xkbset
предполагает, что любая функция AccessX может быть автоматически отключена по истечении заданного времени ожидания:
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
И пример наУбунту википоказывает следующую командную строку для этого:
# setting the expiry of the accessx settings
/usr/bin/xkbset exp -bell -sticky -twokey -latchlock -accessx -feedback -stickybeep -led