diff --git a/regress/session-group-resize.sh b/regress/session-group-resize.sh new file mode 100755 index 00000000..84eb31a4 --- /dev/null +++ b/regress/session-group-resize.sh @@ -0,0 +1,70 @@ +#!/bin/sh + +# Test that window-size=latest resizes windows correctly when switching +# windows in session groups. When a client switches to a window, it should +# resize immediately to match that client's size. +# +# Tests both switch-client and select-window, which use different code paths. + +PATH=/bin:/usr/bin +TERM=screen + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +TMUX="$TEST_TMUX -Ltest" +$TMUX kill-server 2>/dev/null + +TMP1=$(mktemp) +TMP2=$(mktemp) +TMP3=$(mktemp) +trap "rm -f $TMP1 $TMP2 $TMP3" 0 1 15 + +# Create a session with two windows, staying on window 0. +$TMUX -f/dev/null new -d -s test -x 20 -y 6 || exit 1 +$TMUX neww -t test || exit 1 +$TMUX selectw -t test:0 || exit 1 + +# Attach a small 20x6 client in control-mode and have it select window 1. This makes +# the small client the "latest" for window 1. The sleep keeps stdin open so the +# control client stays attached. +(echo "refresh-client -C 20,6"; echo "selectw -t :1"; sleep 5) | + $TMUX -f/dev/null -C attach -t test >$TMP1 2>&1 & + +# Wait for small client to be on window 1. +n=0 +while [ $n -lt 20 ]; do + $TMUX lsc -F '#{client_name} #{window_index}' 2>/dev/null | grep -q " 1$" && break + sleep 0.1 + n=$((n + 1)) +done + +# Create a grouped session with a larger 30x10 client, also in control mode. It +# starts on window 0 (inherited), then switches to window 1 with +# `switch-client`. +(echo "refresh-client -C 30,10"; echo "switch-client -t :=1"; sleep 5) | + $TMUX -f/dev/null -C new -t test -x 30 -y 10 >$TMP2 2>&1 & + +# Wait briefly for the switch-client command to execute, then check. +# The resize should happen immediately (within 0.2s). +sleep 0.2 +OUT1=$($TMUX display -t test:1 -p '#{window_width}x#{window_height}' 2>/dev/null) + +# Also test selectw (select-window) which uses a different code path. +# Create a third grouped session with a 25x8 client, switch to window 1 +# using selectw instead of switch-client. +(echo "refresh-client -C 25,8"; echo "selectw -t :1"; sleep 5) | + $TMUX -f/dev/null -C new -t test -x 25 -y 8 >$TMP3 2>&1 & + +sleep 0.2 +OUT2=$($TMUX display -t test:1 -p '#{window_width}x#{window_height}' 2>/dev/null) + +# Clean up - kill server (terminates clients). Don't wait for background +# sleeps; they'll be orphaned but harmless. +$TMUX kill-server 2>/dev/null + +# Window 1 should have resized to 30x10 (the second client's size). +[ "$OUT1" = "30x10" ] || { echo "switch-client resize failed: $OUT1"; exit 1; } + +# Window 1 should have resized to 25x8 (the third client's size). +[ "$OUT2" = "25x8" ] || { echo "selectw resize failed: $OUT2"; exit 1; } + +exit 0