X11 send key to specific window with shortcut

0xf4d3c0d3·2022년 5월 11일
0

원래 x11에서 단축키로 다른 윈도우에 특정 키입력을 보낼 경우, 키보드에서 보내는 입력과 프로그램이 보내는 키 입력이 꼬이는 이슈를 다루는 글이었지만, 단축키 트리거 조건을 key release로 바꾸고 프로그램(e.g. xdotool)이 키입력을 할때 --clearmodifiers와 같은 옵션을 주는것으로 더 간단히 해결할 수 있게 되어 원래 내용 대신 솔루션만 남겨두었다.

인터넷에서 뭔가 영상을 보면서 글을 정리하고 싶을때 마우스를 움직여 멈췄다가 뒤로 5초 돌렸다가 다시 재생하고 이를 반복하는 것은 여간 귀찮은 일이 아닐 수 없다.

i3 wm 같은 환경에서라면 마우스를 쓰지 않아도 괜찮지만, 그래도 여전히 윈도우 포커스를 옮기고 키를 누르고 하는 일은 여전히 귀찮은 일이다. 만약 듀얼모니터를 쓴다면 더 까다로워진다.

그래서 나는 윈도에선 ahk를, 리눅스에선 xdotool을 쓴다. 그러나 리눅스에선 몇가지 처리해주어야 할게 있어 나중에 같은 일로 삽질하는 것을 방지하고자 이를 기록으로 남긴다. 삽질은 이미 끝났고 여기선 결과만 기록하므로 생각보다 별 내용은 없다.

아래는 i3 config 일부다. Pause키를 누르면 현재 포커스된 윈도우 id를 tmp/focused-window에 기억해둔다. 그리고 나중에 Control+[, Control+\], Control+\ 키로 현재 작업중인 윈도우의 포커스를 잃지않고 이전에 기억해둔 윈도우에 Left, space, Right를 보낼 수 있다. 많은 UX에서 이 세 키입력은 뒤로가기 일시정지 앞으로가기로 인식되기에 범용성도 좋다. 여기서는 유튜브 이전/다음 영상 넘어가기를 위해 N, P도 맵핑했다. 만약 다른 키를 추가하고 싶은데 어떻게 escape해야 할지 또는 어떤 symbol name을 가지는지 모른다면 xev의 keysym을 확인하면 된다.

bindsym Pause exec --no-startup-id "ID=`xdotool getwindowfocus`; echo $ID>/tmp/focused-window; notify-send \\"$ID[$(xdotool getwindowname $ID)] is focused\\""
bindsym --release Control+bracketleft exec --no-startup-id send_key.sh `cat /tmp/focused-window` Left
bindsym --release KP_Left exec --no-startup-id send_key.sh `cat /tmp/focused-window` Left
bindsym --release Control+bracketright exec --no-startup-id send_key.sh `cat /tmp/focused-window` space
bindsym --release KP_Begin exec --no-startup-id send_key.sh `cat /tmp/focused-window` space
bindsym --release Control+backslash exec --no-startup-id send_key.sh `cat /tmp/focused-window` Right
bindsym --release KP_Right exec --no-startup-id send_key.sh `cat /tmp/focused-window` Right
bindsym --release KP_Up exec --no-startup-id send_key.sh `cat /tmp/focused-window` Up
bindsym --release KP_Down exec --no-startup-id send_key.sh `cat /tmp/focused-window` Down
bindsym --release KP_Home exec --no-startup-id send_key.sh `cat /tmp/focused-window` Shift+P
bindsym --release KP_Prior exec --no-startup-id send_key.sh `cat /tmp/focused-window` Shit+N

send_key.sh는 아래와 같이 생겼다. 나는 이것을 /usr/bin/ 아래 두고 쓰고 있다.

#!/bin/bash

if [ "$#" -ne 2 ]; then
    echo "[!] usage: $0 WINDOW_ID KEYS"
    exit
fi

prev_window=`xdotool getactivewindow`

xdotool windowactivate $1 key --clearmodifiers $2 windowactivate $prev_window

0개의 댓글