#!/bin/sh # Test pane-side Kitty keyboard protocol state and key encoding. This uses # synthetic protocol sequences and does not require a particular terminal. PATH=/bin:/usr/bin TERM=screen [ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) CONF=$(mktemp) OUT=$(mktemp) TMUX="$TEST_TMUX -LtestK$$ -f$CONF" trap 'rm -f "$CONF" "$OUT"; $TMUX kill-server 2>/dev/null' 0 1 15 printf '%s\n' 'set -g extended-keys on' >"$CONF" wait_for_output() { i=0 while [ ! -s "$OUT" ] && [ "$i" -lt 50 ]; do sleep 0.1 i=$((i + 1)) done [ -s "$OUT" ] } wait_for_mode() { wanted=$1 i=0 while [ "$($TMUX display-message -pt: '#{pane_key_mode}')" != "$wanted" ] && [ "$i" -lt 50 ]; do sleep 0.1 i=$((i + 1)) done [ "$($TMUX display-message -pt: '#{pane_key_mode}')" = "$wanted" ] } check_output() { expected=$1 actual=$(tr -d ' \n' <"$OUT") if [ "$actual" != "$expected" ]; then echo "expected $expected, got $actual" exit 1 fi } $TMUX new-session -d -x80 -y24 \ "stty raw -echo; printf '\033[>1u'; dd bs=1 count=7 2>/dev/null | od -An -v -t x1 >'$OUT'; sleep 5" || exit 1 wait_for_mode 'Kitty 1' $TMUX send-keys -t: C-S-a wait_for_output check_output 1b5b39373b3675 : >"$OUT" $TMUX respawn-pane -k -t: \ "stty raw -echo; printf '\033[>1u'; dd bs=1 count=7 2>/dev/null | od -An -v -t x1 >'$OUT'; sleep 5" wait_for_mode 'Kitty 1' $TMUX send-keys -t: s-a wait_for_output check_output 1b5b39373b3975 : >"$OUT" $TMUX respawn-pane -k -t: \ "stty raw -echo; printf '\033[>8u'; dd bs=1 count=5 2>/dev/null | od -An -v -t x1 >'$OUT'; sleep 5" wait_for_mode 'Kitty 8' $TMUX send-keys -t: a wait_for_output check_output 1b5b393775 : >"$OUT" $TMUX respawn-pane -k -t: \ "stty raw -echo; printf '\033[>1u\033[?u'; dd bs=1 count=5 2>/dev/null | od -An -v -t x1 >'$OUT'; sleep 5" wait_for_output check_output 1b5b3f3175 : >"$OUT" $TMUX respawn-pane -k -t: \ "stty raw -echo; printf '\033[>4;2m\033[?u'; dd bs=1 count=5 2>/dev/null | od -An -v -t x1 >'$OUT'; sleep 5" wait_for_output check_output 1b5b3f3075 : >"$OUT" $TMUX respawn-pane -k -t: \ "stty raw -echo; printf '\033[>1u\033[>8u\033[8u\033[<2u\033[?u'; dd bs=1 count=10 2>/dev/null | od -An -v -t x1 >'$OUT'; sleep 5" wait_for_output check_output 1b5b3f31751b5b3f3075 : >"$OUT" # "always" forces modifyOtherKeys mode 1, not Kitty keys. $TMUX set-option -g extended-keys always $TMUX respawn-pane -k -t: \ "stty raw -echo; printf '\033[>0u\033[?u'; dd bs=1 count=5 2>/dev/null | od -An -v -t x1 >'$OUT'; sleep 5" wait_for_output check_output 1b5b3f3075 wait_for_mode 'Ext 1' $TMUX set-option -g extended-keys on : >"$OUT" $TMUX respawn-pane -k -t: \ "stty raw -echo; printf '\033[>1u\033[?u\033[?1049h\033[?u\033[>8u\033[?u\033[?1049l\033[?u'; dd bs=1 count=20 2>/dev/null | od -An -v -t x1 >'$OUT'; sleep 5" wait_for_output check_output 1b5b3f31751b5b3f30751b5b3f38751b5b3f3175 : >"$OUT" # Modified Enter, Tab and Backspace are disambiguated even under flag 1; # only the unmodified keys stay in legacy form. $TMUX respawn-pane -k -t: \ "stty raw -echo; printf '\033[>1u'; dd bs=1 count=7 2>/dev/null | od -An -v -t x1 >'$OUT'; sleep 5" wait_for_mode 'Kitty 1' $TMUX send-keys -t: S-Enter wait_for_output check_output 1b5b31333b3275 : >"$OUT" $TMUX respawn-pane -k -t: \ "stty raw -echo; printf '\033[>1u'; dd bs=1 count=1 2>/dev/null | od -An -v -t x1 >'$OUT'; sleep 5" wait_for_mode 'Kitty 1' $TMUX send-keys -t: Enter wait_for_output check_output 0d : >"$OUT" # An unshifted uppercase letter, as delivered by a legacy terminal or by # send-keys, is reported as the lowercase code point plus Shift. $TMUX respawn-pane -k -t: \ "stty raw -echo; printf '\033[>9u'; dd bs=1 count=7 2>/dev/null | od -An -v -t x1 >'$OUT'; sleep 5" wait_for_mode 'Kitty 9' $TMUX send-keys -t: A wait_for_output check_output 1b5b39373b3275 : >"$OUT" # A modified F3 must use the unambiguous form even under flag 1 alone, since # its legacy form ("CSI 1;mR") cannot be told apart from a cursor position # report. $TMUX respawn-pane -k -t: \ "stty raw -echo; printf '\033[>1u'; dd bs=1 count=7 2>/dev/null | od -An -v -t x1 >'$OUT'; sleep 5" wait_for_mode 'Kitty 1' $TMUX send-keys -t: S-F3 wait_for_output check_output 1b5b31333b327e # The following are not specific to the Kitty protocol, but were found by # the same testing: send-keys must drop a key name it cannot encode for the # pane's current mode rather than typing the name itself as text, and must # not leave a stray Escape behind while deciding that. : >"$OUT" $TMUX respawn-pane -k -t: \ "stty raw -echo; timeout 2 dd bs=1 2>/dev/null | od -An -v -t x1 >'$OUT'" sleep 0.3 for key in C-Escape C-BSpace M-C-BSpace; do $TMUX send-keys -t: "$key" done sleep 2.3 check_output '' $TMUX kill-server 2>/dev/null exit 0