粘滞键超时

粘滞键超时

语境

我用来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“- ShiftA
  • 过期后,“卡住”的 Shift 和控制修饰符将被删除,但修饰符不再粘滞 - 点击Shift然后按A,我得到的是常规的a,而不是转移的A

相反,我希望在“混乱随之而来”点之后出现以下行为:

  • 我等待三秒钟,然后删除“卡住”的移位和控制修饰符(即,按下a会产生a),但修饰符仍然粘稠- 敲击Shift然后按下a,我得到一个转变A

我正在使用i3窗口管理器,因此理想情况下,我希望找到一个不依赖于完整桌面管理器套件的解决方案。

替代方案:在键盘不活动一段时间后自动调用脚本(一次)?

作为解决方法,我定义了一个键盘快捷键,xkbset无论按下哪个修饰符,该快捷键都会重置我的配置(即,PrintScrShift+ PrintScrCtrl+ Shift+PrintScr等都绑定到同一脚本)。键盘不活动 5 秒后自动运行此脚本将完成我所追求的任务。

答案1

该问题的解决方案似乎是一个如下所示的脚本xprint空闲确定何时重置锁定状态。请注意,它有一个轮询循环,因此需要持续运行。

#!/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

并举一个例子Ubuntu 维基显示以下命令行来执行此操作:

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

相关内容