スティッキーキーのタイムアウト

スティッキーキーのタイムアウト

コンテクスト

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についても同様です。CtrlAltHyper

ただし、1 つまたは複数の修飾子が「ロック」設定のままになってしまい、どの修飾子がトリガーされて解除されるのかがわかりにくくなることがあります。

質問: スティッキーキーを「タイムアウト」する方法はありますか?

つまり、スティッキー修飾子を押したり、修飾子をロックしたりした場合、それ以上キーを押さなくても 5 秒ほど経つと通常の状態に戻ります。

設定時間が経過すると設定を期限切れにするためにを使用できることはわかっていますxkbsetが、その場合、固定キーが完全にオフになります。私が望むのは、数秒間操作が行われなかった後にすべての修飾キーを解放し、次に修飾キーを押したときに固定キーの動作を維持することです。

編集

違いを明確にするために、有効期限オプションを使用すると、次のようになります。

  • 2回タップしてシフトロックをオンにしますShift
  • 誤って2回タップしてコントロールをロックしてしまいましたCtrl
  • 押すACtrl--ShiftA入力されるため、混乱が生じます。
  • 有効期限が切れると、「スタック」したシフトとコントロールの修飾子は削除されますが、修飾子はもはや固定されません。タップしてShiftから押すと、シフトされたものではなくA通常の が表示されます。aA

代わりに、「混乱が続く」ポイントの後に次の動作を希望します。

  • 3秒待つと、ShiftキーとControlキーの「スタック」が解除されます(つまり、押すと がa表示されますa)。しかし、まだ粘着性がある- をタップしShiftてから押すとa、シフトされた が表示されますA

私はi3ウィンドウ マネージャーを使用しているので、理想的には完全なデスクトップ マネージャー スイートに依存しないソリューションが望ましいです。

代替案: キーボードが一定時間操作されない場合、スクリプトを自動的に (1 回) 呼び出しますか?

回避策として、xkbsetどの修飾子が押されたかに関係なく設定をリセットするキーボード ショートカットを定義しました (つまり、、PrintScr+ ShiftPrintScr++Ctrlなどはすべて同じスクリプトにバインドされています)。キーボードが 5 秒間操作されなかった後にこのスクリプトを自動的に実行すれば、目的ShiftPrintScr動作が実現します。

答え1

この問題の解決策は、次のようなスクリプトを使用するようです。xprintidleロック状態をいつリセットするかを判断します。ポーリング ループがあるため、継続的に実行し続ける必要があることに注意してください。

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

関連情報