黏滯鍵逾時

黏滯鍵逾時

情境

我用來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 和 Control 修改器將被刪除,但修改器不再黏滯 - 點擊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

相關內容