xcape를 사용하는 동안 유효한 xmodmap을 얻는 방법 눌렀다 놓을

처음에는 X의 키 매핑이 나를위한 약간의 검은 예술이라는 것을 인정할 것입니다. 주로 SO 및 SU와 같은 곳에서 예제를 복사하여 붙여 넣고 작동하는지 확인하십시오. 그러나이 경우 xcape와 i3lock이 잘 어울리게 된 일을 더 잘 이해해야합니다.

xcape 유틸리티를 사용하여 길게 누를 때 리턴 키를 대체 컨트롤에 매핑하는 것을 처리하고 눌렀다 놓을 때 여전히 일반 키 누름으로 작동합니다. 이에 대한 설정은 다음과 같습니다.

if [ -e ${XCAPE} ]; then
    killall xcape 2> /dev/null
    ${XMODMAP} -e 'keycode 36 = 0x1234'
    ${XMODMAP} -e 'add control = 0x1234'
    ${XMODMAP} -e 'keycode any = Return'
    ${XCAPE} -e '0x1234=Return'
    KEYMAPS="${KEYMAPS} StRet->Ctrl"
fi

이것을 이해하면 리턴 키 (36)를 가짜 키 (0x1234)로 다시 매핑합니다. 그런 다음 맵을 수정하여 컨트롤도 (0x1234)에 매핑됩니다. 그런 다음 xcape는 “마법”을 수행하여 길게 누를 때 올바른 키 코드가 전송되도록합니다.

이것은 모두 잘 작동하지만 시작하기 전에 X 키보드 맵을 약간 조작하는 화면 잠금 프로그램 (i3lock)을 중단합니다. 다음 메시지와 함께 실패합니다.

Error:    (unknown file):1092:13: syntax error
Error:    Failed to parse input xkb file
[i3lock] xkb_keymap_new_from_file failed
i3lock: Could not load keymap

키 맵을 덤프하기 위해 디버깅을 추가하면 혼란이 발생한 다음 줄이라고 생각했습니다.

xkb_symbols "pc_gb_inet(evdev)_ctrl(nocaps)" {

    name[group1]="English (UK)";
    key     <> {         [          Return ] };
    key  <ESC> {         [          Escape ] };
    key <AE01> {
    ...

무슨 일이 일어 났습니까? 둘은 근본적으로 호환되지 않습니까? i3lock을 실행하기 전에 키맵을 부분적으로 복원해야합니까?



답변

그래서 많은 파기 후에 첫 번째 ‘keycode any = Return’이 i3lock 키 맵 처리를 혼란스럽게하는 키 코드 8을 설정합니다. 또한 암호를 입력 할 수 있도록 키 코드 36이 리턴을 생성하는지 확인해야합니다.

스크립트에서 i3lock 호출을 래핑 했으므로 i3 구성에서는 다음과 같습니다.

# background, screensaver and locking
exec xautolock -time 10 -locker '/home/alex/.config/i3/lock_screen.sh'
bindsym $mod+l exec /home/alex/.config/i3/lock_screen.sh

잠금 화면 스크립트는 간단합니다.

# The initial key-sequence chosen by xcape does confuse i3lock so we reset it
xmodmap -e "keycode 8 = "
# Ensure the return key does work as intended
xmodmap -e 'keycode 36 = Return'
i3lock -c 334433