처음에는 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