mirror of
https://github.com/tmux/tmux.git
synced 2026-10-06 17:49:52 +00:00
83 lines
2.2 KiB
Bash
83 lines
2.2 KiB
Bash
#!/bin/sh
|
|
|
|
# send-keys -K injects a key into a client. Commands produced by that key must
|
|
# be inserted immediately after send-keys, before later commands in the same
|
|
# command list. Focus events arriving between a prefix and its following key
|
|
# must be forwarded without cancelling the prefix table.
|
|
|
|
PATH=/bin:/usr/bin
|
|
TERM=screen
|
|
LC_ALL=C.UTF-8
|
|
export PATH TERM LC_ALL
|
|
|
|
[ -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 1 15
|
|
|
|
wait_for_client()
|
|
{
|
|
i=0
|
|
while [ "$i" -lt 50 ]; do
|
|
client=$($INNER list-clients -F '#{client_name}' 2>/dev/null)
|
|
[ -n "$client" ] && return 0
|
|
sleep 0.1
|
|
i=$((i + 1))
|
|
done
|
|
fail "inner client did not attach"
|
|
}
|
|
|
|
wait_for_option()
|
|
{
|
|
option=$1
|
|
expected=$2
|
|
i=0
|
|
while [ "$i" -lt 50 ]; do
|
|
actual=$($INNER show-option -gv "$option" 2>/dev/null)
|
|
[ "$actual" = "$expected" ] && return 0
|
|
sleep 0.1
|
|
i=$((i + 1))
|
|
done
|
|
fail "$option is '$actual', expected '$expected'"
|
|
}
|
|
|
|
cleanup
|
|
$INNER new-session -d -s inner -x40 -y10 'exec sleep 100' || exit 1
|
|
$INNER set-option -g status off || exit 1
|
|
$INNER set-option -g focus-events on || exit 1
|
|
$OUTER new-session -d -s outer -x40 -y10 "$INNER attach -t inner" || exit 1
|
|
$OUTER set-option -g status off || exit 1
|
|
wait_for_client
|
|
|
|
# The binding generated by send-keys -K must run before the command which
|
|
# follows send-keys in this command list. Before the queue-ordering fix this
|
|
# produces AB rather than BA.
|
|
$INNER set-option -g @order '' || exit 1
|
|
$INNER bind-key -n a set-option -gF @order '#{@order}B' || exit 1
|
|
$INNER send-keys -K -c "$client" a \; \
|
|
set-option -gF @order '#{@order}A' || exit 1
|
|
wait_for_option @order BA
|
|
|
|
# Put the real attached client in the prefix table, deliver FocusIn, then the
|
|
# bound key. FocusIn is not bindable and must not reset the prefix table.
|
|
$INNER bind-key x set-option -g @focus-prefix yes || exit 1
|
|
$OUTER send-keys C-b || exit 1
|
|
focus_in=$(printf '\033[I')
|
|
$OUTER send-keys -l "$focus_in" || exit 1
|
|
$OUTER send-keys x || exit 1
|
|
wait_for_option @focus-prefix yes
|
|
|
|
exit 0
|