语境
我用来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 和控制修饰符将被删除,但修饰符不再粘滞 - 点击Shift然后按A,我得到的是常规的
a
,而不是转移的A
相反,我希望在“混乱随之而来”点之后出现以下行为:
- 我等待三秒钟,然后删除“卡住”的移位和控制修饰符(即,按下
a
会产生a
),但修饰符仍然粘稠- 敲击Shift然后按下a,我得到一个转变A
。
我正在使用i3
窗口管理器,因此理想情况下,我希望找到一个不依赖于完整桌面管理器套件的解决方案。
替代方案:在键盘不活动一段时间后自动调用脚本(一次)?
作为解决方法,我定义了一个键盘快捷键,xkbset
无论按下哪个修饰符,该快捷键都会重置我的配置(即,PrintScr、Shift+ PrintScr、Ctrl+ 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