mirror of
https://github.com/tmux/tmux.git
synced 2026-10-12 21:54:23 +00:00
102 lines
2.5 KiB
Bash
102 lines
2.5 KiB
Bash
#!/bin/sh
|
|
|
|
# Extended Shift+Tab must remain BackTab when the pane does not request
|
|
# modifyOtherKeys=2, including when the input carries implied Meta.
|
|
|
|
PATH=/bin:/usr/bin
|
|
TERM=screen
|
|
export PATH TERM
|
|
|
|
[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux)
|
|
INNER="$TEST_TMUX -LtestI$$ -f/dev/null"
|
|
OUTER="$TEST_TMUX -LtestO$$ -f/dev/null"
|
|
|
|
fail()
|
|
{
|
|
echo "$*" >&2
|
|
exit 1
|
|
}
|
|
|
|
cleanup()
|
|
{
|
|
$OUTER kill-server 2>/dev/null
|
|
$INNER kill-server 2>/dev/null
|
|
}
|
|
trap cleanup 0
|
|
trap 'exit 1' 1 2 15
|
|
|
|
$INNER new-session -d -s inner -x80 -y24 \
|
|
'stty raw -echo; exec cat -tv' || exit 1
|
|
$INNER set-option -g status off || exit 1
|
|
$INNER set-option -g assume-paste-time 0 || exit 1
|
|
$INNER set-option -s extended-keys on || exit 1
|
|
$INNER set-option -s escape-time 1000 || exit 1
|
|
$INNER unbind-key -a -T root || exit 1
|
|
$OUTER new-session -d -s outer -x80 -y24 "$INNER attach -t inner" ||
|
|
exit 1
|
|
$OUTER set-option -g assume-paste-time 0 || exit 1
|
|
|
|
i=0
|
|
while [ -z "$($INNER list-clients -F '#{client_name}')" ]; do
|
|
[ "$i" -lt 100 ] || fail 'inner client did not attach'
|
|
sleep 0.05
|
|
i=$((i + 1))
|
|
done
|
|
|
|
expected_output=
|
|
|
|
assert_key()
|
|
{
|
|
name=$1
|
|
expected_output=$expected_output$2
|
|
bytes=$(printf '%s' "$3" | od -An -v -tx1)
|
|
$OUTER send-keys -H $bytes || exit 1
|
|
i=0
|
|
while [ "$i" -lt 100 ]; do
|
|
actual=$($INNER capture-pane -p | tr -d '\n')
|
|
[ "$actual" = "$expected_output" ] && return 0
|
|
sleep 0.05
|
|
i=$((i + 1))
|
|
done
|
|
fail "$name: got '$actual', expected '$expected_output'"
|
|
}
|
|
|
|
pane_state='#{pane_key_mode}:#{pane_current_command}'
|
|
for mode in 0 1 2; do
|
|
for format in xterm csi-u; do
|
|
$INNER new-window \
|
|
"printf '\033[>4;${mode}m'; stty raw -echo; exec cat -tv" ||
|
|
exit 1
|
|
key_mode="Ext $mode"
|
|
[ "$mode" -eq 0 ] && key_mode=VT10x
|
|
i=0
|
|
while [ "$($INNER display-message -p "$pane_state")" != \
|
|
"$key_mode:cat" ]; do
|
|
[ "$i" -lt 100 ] || fail "pane did not enter mode $mode"
|
|
sleep 0.05
|
|
i=$((i + 1))
|
|
done
|
|
$INNER set-option -s extended-keys-format "$format" || exit 1
|
|
expected_output=
|
|
# Every modifier combination containing Shift.
|
|
for modifier in 2 4 6 8; do
|
|
if [ "$mode" -eq 2 ]; then
|
|
if [ "$format" = xterm ]; then
|
|
expected="^[[27;${modifier};9~"
|
|
else
|
|
expected="^[[9;${modifier}u"
|
|
fi
|
|
else
|
|
expected='^[[Z'
|
|
fi
|
|
case_name="mode $mode, $format, modifier $modifier"
|
|
assert_key "$case_name, CSI u input" "$expected" \
|
|
"$(printf '\033[9;%su' "$modifier")"
|
|
assert_key "$case_name, xterm input" "$expected" \
|
|
"$(printf '\033[27;%s;9~' "$modifier")"
|
|
done
|
|
done
|
|
done
|
|
|
|
exit 0
|