#!/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