情境
我用來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
相反,我希望在“混亂隨之而來”點之後出現以下行為:
- 我等待三秒鐘,然後刪除“卡住”的移位和控制修飾符(即,按下
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