고정 키의 시간 초과

고정 키의 시간 초과

문맥

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.AltHyper

그러나 때로는 '잠김' 설정에서 하나 이상의 수정자가 붙어서 이를 해제하기 위해 어떤 수정자가 트리거되는지 파악하기 어려울 수 있습니다.

질문: 고정 키를 '시간 초과'하는 방법이 있습니까?

즉, 고정 수정자를 눌렀거나 수정자를 잠근 경우 추가 키를 누르지 않고도 약 5초 후에 정상으로 되돌아가게 됩니다.

xkbset설정된 시간이 지나면 설정을 만료하는 데 사용할 수 있다는 것을 알고 있지만 이렇게 하면 고정 키가 완전히 꺼집니다. 내가 원하는 것은 몇 초 동안 활동이 없으면 모든 수정자를 해제하고 다음에 수정자 키를 누를 때 고정 키 동작을 유지하는 것입니다.

편집하다

차이점을 명확히 하기 위해 만료 옵션을 사용하면 다음과 같은 결과를 얻을 수 있습니다.

  • 두 번 탭하여 Shift 잠금을 켭니다 Shift.
  • 실수로 두 번 탭하여 컨트롤을 잠갔습니다 Ctrl.
  • 를 누르면 - -가 입력되므로 A혼란 이 따릅니다 .CtrlShiftA
  • 만료 기간이 지나면 '고착' 시프트 및 제어 수정자는 제거되지만 수정자는 더 이상 고정되지 않습니다. 탭한 Shift다음 을 누르면 시프트가 아닌 A일반 가 표시됩니다.aA

대신 "혼란이 따른다" 지점 이후에 다음과 같은 동작을 원합니다.

  • 3초를 기다린 후 '고정된' Shift 및 Control 수정자가 제거되지만(즉, 누르면 가 a생성됨 a) 수정자는 제거됩니다.아직도 끈적끈적해- 두드린 Shift다음 누르면 a이동이 발생합니다 A.

저는 i3창 관리자를 사용하고 있으므로 이상적으로는 전체 데스크톱 관리자 제품군에 의존하지 않는 솔루션을 원합니다.

대안: 일정 기간 동안 키보드를 사용하지 않으면 자동으로 스크립트를 한 번 호출하시겠습니까?

xkbset해결 방법으로 어떤 수정자를 눌렀는지에 관계없이 구성을 재설정하는 키보드 단축키를 정의했습니다 (예: PrintScr, Shift+ PrintScr, Ctrl++ ShiftPrintScr은 모두 동일한 스크립트에 바인딩됨). 5초 동안 키보드를 사용하지 않으면 자동으로 이 스크립트를 실행하면 원하는 작업이 수행됩니다.

답변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

그리고우분투 위키이를 수행하기 위한 다음 명령줄을 보여줍니다.

# setting the expiry of the accessx settings
/usr/bin/xkbset exp -bell -sticky -twokey -latchlock -accessx -feedback -stickybeep -led

관련 정보