Тайм-аут для залипания клавиш

Тайм-аут для залипания клавиш

Контекст

Я использую 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

Связанный контент