mirror of
https://github.com/tmux/tmux.git
synced 2026-10-06 17:49:52 +00:00
159 lines
4.7 KiB
Bash
159 lines
4.7 KiB
Bash
#!/bin/sh
|
|
|
|
# Moving, resizing and reordering an over-zoom float must leave the tiled
|
|
# pane zoomed, and the changes must survive an explicit unzoom.
|
|
|
|
PATH=/bin:/usr/bin
|
|
TERM=screen
|
|
|
|
[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux)
|
|
TMUX="$TEST_TMUX -LtestA$$ -f/dev/null"
|
|
trap '$TMUX kill-server 2>/dev/null' 0
|
|
trap 'exit 1' 1 2 15
|
|
|
|
fail()
|
|
{
|
|
echo "$*" >&2
|
|
exit 1
|
|
}
|
|
|
|
run()
|
|
{
|
|
$TMUX "$@" || fail "failed: $*"
|
|
}
|
|
|
|
check()
|
|
{
|
|
got=$(run display-message -p -t "$1" "$2") || exit 1
|
|
[ "$got" = "$3" ] || fail "$1 $2: got '$got', expected '$3'"
|
|
}
|
|
|
|
check_zoom()
|
|
{
|
|
check "$base" '#{window_zoomed_flag}:#{pane_zoomed_flag}' '1:1'
|
|
check "$float" '#{pane_floating_flag}:#{pane_active}' "1:$active"
|
|
check "$base" '#{@unzoomed}' ''
|
|
}
|
|
|
|
run new-session -d -x 80 -y 24
|
|
base=$(run display-message -p '#{pane_id}') || exit 1
|
|
other=$(run split-window -dPF '#{pane_id}') || exit 1
|
|
layout=$(run display-message -p '#{window_layout}') || exit 1
|
|
run set-hook -g window-unzoomed 'set -g @unzoomed 1'
|
|
|
|
# Cover creation before and after zoom, with both the float and the tiled
|
|
# pane active. Modal panes use the same over-zoom flag.
|
|
for mode in before after detached modal; do
|
|
if [ "$mode" != before ]; then
|
|
run resize-pane -Z -t "$base"
|
|
fi
|
|
case "$mode" in
|
|
detached) flags=-Ad; active=0 ;;
|
|
modal) flags=-O; active=1 ;;
|
|
*) flags=-A; active=1 ;;
|
|
esac
|
|
float=$(run new-pane "$flags" -PF '#{pane_id}' -t "$base" \
|
|
-x 20 -y 8 -X 8 -Y 3 '') || exit 1
|
|
if [ "$mode" = before ]; then
|
|
run resize-pane -Z -t "$base"
|
|
fi
|
|
run set -gu @unzoomed
|
|
check_zoom
|
|
|
|
run move-pane -t "$float" -D
|
|
check "$float" '#{pane_top}' 5
|
|
check_zoom
|
|
run move-pane -t "$float" -U 2 -R 3 -L 1
|
|
check "$float" '#{pane_left}:#{pane_top}' '11:3'
|
|
check_zoom
|
|
run move-pane -t "$float" -X 25% -Y 25%
|
|
check "$float" '#{pane_left}:#{pane_top}' '21:7'
|
|
check_zoom
|
|
run move-pane -t "$float" -P bottom-right
|
|
check "$float" '#{pane_left}:#{pane_top}' '61:17'
|
|
check_zoom
|
|
run resize-pane -t "$float" -x 30 -y 10
|
|
check "$float" '#{pane_width}:#{pane_height}' '28:8'
|
|
check_zoom
|
|
run resize-pane -t "$float" -U 1 -L 2
|
|
check "$float" '#{pane_left}:#{pane_top}:#{pane_width}:#{pane_height}' \
|
|
'59:16:30:9'
|
|
check_zoom
|
|
run move-pane -t "$float" -P centre
|
|
check "$float" '#{pane_left}:#{pane_top}' '25:7'
|
|
check_zoom
|
|
|
|
# Failed commands must not change zoom either.
|
|
for command in 'move-pane -D invalid' 'move-pane -P invalid' \
|
|
'move-pane -z invalid' 'resize-pane -x invalid' \
|
|
'resize-pane -D invalid'; do
|
|
$TMUX $command -t "$float" 2>/dev/null &&
|
|
fail "unexpected success: $command"
|
|
check_zoom
|
|
done
|
|
|
|
run resize-pane -Z -t "$base"
|
|
check "$float" '#{pane_left}:#{pane_top}:#{pane_width}:#{pane_height}' \
|
|
'25:7:30:9'
|
|
run kill-pane -t "$float"
|
|
check "$base" '#{window_layout}' "$layout"
|
|
done
|
|
|
|
# Put an ordinary (hidden while zoomed) float between two over-zoom floats
|
|
# in the stacking order. Reordering must skip it when counting visible
|
|
# positions, but keep all floats ahead of the tiled panes after unzoom.
|
|
back=$(run new-pane -AdPF '#{pane_id}' -t "$base" '') || exit 1
|
|
hidden=$(run new-pane -dPF '#{pane_id}' -t "$base" '') || exit 1
|
|
float=$(run new-pane -AdPF '#{pane_id}' -t "$base" '') || exit 1
|
|
active=0
|
|
run resize-pane -Z -t "$base"
|
|
run set -gu @unzoomed
|
|
|
|
for position in backward back forward-loop; do
|
|
run move-pane -t "$float" -P front
|
|
run move-pane -t "$float" -P "$position"
|
|
check "$float" '#{pane_z}' 1
|
|
check "$back" '#{pane_z}' 0
|
|
check_zoom
|
|
done
|
|
for position in forward front backward-loop; do
|
|
run move-pane -t "$float" -P back
|
|
run move-pane -t "$float" -P "$position"
|
|
check "$float" '#{pane_z}' 0
|
|
check "$back" '#{pane_z}' 1
|
|
check_zoom
|
|
done
|
|
for z in 1 0 99; do
|
|
run move-pane -t "$float" -z "$z"
|
|
want=$z
|
|
[ "$z" = 99 ] && want=1
|
|
check "$float" '#{pane_z}' "$want"
|
|
check_zoom
|
|
done
|
|
run resize-pane -Z -t "$base"
|
|
check "$float" '#{pane_z}' 2
|
|
check "$base" '#{pane_z}' 4
|
|
run kill-pane -t "$hidden"
|
|
run kill-pane -t "$back"
|
|
|
|
# Explicit zoom toggling and operations on tiled panes retain their
|
|
# existing behaviour. The over-zoom flag alone does not make a pane a float:
|
|
# zooming the float itself gives it a tiled cell until unzoom.
|
|
run resize-pane -Z -t "$float"
|
|
check "$float" '#{pane_zoomed_flag}:#{pane_floating_flag}' '1:0'
|
|
run resize-pane -t "$float" -x 25
|
|
check "$float" '#{window_zoomed_flag}:#{pane_floating_flag}:#{pane_width}' \
|
|
'0:1:23'
|
|
run resize-pane -Z -t "$base"
|
|
run resize-pane -t "$other" -D 1
|
|
check "$base" '#{window_zoomed_flag}' 0
|
|
|
|
# A hidden ordinary float must still be unzoomed before resizing it.
|
|
hidden=$(run new-pane -dPF '#{pane_id}' -t "$base" '') || exit 1
|
|
run resize-pane -Z -t "$base"
|
|
run resize-pane -t "$hidden" -x 25
|
|
check "$hidden" '#{window_zoomed_flag}:#{pane_floating_flag}:#{pane_width}' \
|
|
'0:1:23'
|
|
|
|
exit 0
|