粘滞键超时

Tyl*_*ler 6 keyboard xkb accessibility

语境

xkbset用来启用粘滞键:

xkbset sticky -twokey latchlock ## set sticky keys, don't disable via twokey
xkbset exp 1 =sticky ## don't expire sticky keys
Run Code Online (Sandbox Code Playgroud)

这正是我想要的,允许我点击并释放Shift键,然后按下另一个键并获得“移位”值。双击Shift给我CapsLock,同样适用于Ctrl, Alt, Hyper

然而,我有时会被“锁定”设置中的一个或多个修饰符卡住,并且很难弄清楚哪些被触发以释放它们。

问题:有没有办法“超时”粘滞键?

意思是,如果我按下了一个粘性修饰符,或锁定了一个修饰符,让它在 5 秒左右后恢复正常,而无需进一步按下任何按键。

我知道我可以xkbset在设定的时间后使设置过期,但这会完全关闭粘滞键。我想要的是在几秒钟不活动后释放所有修饰符,但在我下次按下修饰键时保持粘滞键的行为。

编辑

为了澄清差异,如果我使用过期选项,我会得到的是:

  • 我通过点击Shift两次来打开换档锁定。
  • 我不小心通过点击Ctrl两次来锁定控制。
  • 混乱随之而来,因为按下会A导致Ctrl- Shift-A被输入。
  • 到期后,“卡住”的移位和控制修饰符被删除,但修饰符不再是粘性的——点击Shift然后按下A,我得到了一个常规的a,而不是一个移位的A

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

  • 我等了三秒钟,然后“卡住”的 shift 和控制修饰符被删除(即,按下a会产生a),但修饰符仍然很粘——敲击Shift然后按下a,我得到了一个 shift A

我正在使用i3窗口管理器,所以理想情况下我想要一个不依赖于完整桌面管理器套件的解决方案。

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

作为一种变通方法,我定义的快捷键将重置我的xkbset配置无论哪个都压调节剂(即PrintScrShift+ PrintScrCtrl+ Shift+PrintScr等都是绑定到同一个脚本)。在键盘处于非活动状态 5 秒后自动运行此脚本会做我想要的。

Gre*_*ods 0

的帮助文本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
Run Code Online (Sandbox Code Playgroud)

Ubuntu wiki上的示例显示了执行此操作的以下命令行:

# setting the expiry of the accessx settings
/usr/bin/xkbset exp -bell -sticky -twokey -latchlock -accessx -feedback -stickybeep -led
Run Code Online (Sandbox Code Playgroud)