mirror of
https://github.com/tmux/tmux.git
synced 2026-06-20 17:25:57 +00:00
190 lines
5.9 KiB
Bash
190 lines
5.9 KiB
Bash
#!/bin/sh
|
|
|
|
# Exercise screen-redraw.c border drawing for non-floating (tiled) panes: the
|
|
# border junctions where panes meet, and pane status lines/titles.
|
|
#
|
|
# Four layouts cover every junction type that tiled panes produce:
|
|
# cross - a 2x2 grid: a full crossing (+ / CELL_LRUD)
|
|
# tee-lr - three columns with the middle split: left and right tees
|
|
# (|- and -| / URD, ULD)
|
|
# tee-up - a top/bottom split with the top split: a bottom tee (_|_ / LRU)
|
|
# tee-down - a top/bottom split with the bottom split: a top tee (T / LRD)
|
|
# Each layout is rendered once for every value of pane-border-lines, so every
|
|
# junction is checked in every border style. One layout per result file.
|
|
#
|
|
# Each scene is rendered in an inner tmux attached inside an outer tmux pane.
|
|
# The outer pane is captured (the full client scene drawn by screen-redraw.c)
|
|
# and compared with a golden file in screen-redraw-results/.
|
|
#
|
|
# Run with GENERATE=1 to (re)create the golden files.
|
|
|
|
PATH=/bin:/usr/bin
|
|
TERM=screen
|
|
LC_ALL=C.UTF-8
|
|
export TERM LC_ALL
|
|
|
|
[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux)
|
|
TMUX="$TEST_TMUX -Ltest -f/dev/null"
|
|
TMUX2="$TEST_TMUX -Ltest2 -f/dev/null"
|
|
RESULTS=screen-redraw-results
|
|
|
|
TMP=$(mktemp)
|
|
trap "rm -f $TMP; $TMUX kill-server 2>/dev/null; $TMUX2 kill-server 2>/dev/null" \
|
|
0 1 15
|
|
|
|
fail() {
|
|
echo "$*" >&2
|
|
exit 1
|
|
}
|
|
|
|
compare() {
|
|
sleep 1
|
|
$TMUX capturep -p >$TMP || exit 1
|
|
if [ -n "$GENERATE" ]; then
|
|
cp $TMP "$RESULTS/$1.result" || exit 1
|
|
echo "generated $1"
|
|
else
|
|
cmp -s $TMP "$RESULTS/$1.result" || \
|
|
fail "scene $1 differs from $RESULTS/$1.result"
|
|
fi
|
|
}
|
|
|
|
# Fresh inner window of fixed size, with one command running.
|
|
new_scene() {
|
|
$TMUX2 neww -d "sh -c 'exec sleep 100'" || exit 1
|
|
$TMUX2 selectw -t:\$ || exit 1
|
|
$TMUX2 resizew -x40 -y14 || exit 1
|
|
}
|
|
|
|
C="sh -c 'exec sleep 100'"
|
|
|
|
# Layouts. Each produces one kind of junction. Splits at fixed window size are
|
|
# deterministic.
|
|
layout_cross() { # 2x2 grid: a full crossing
|
|
new_scene
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
$TMUX2 splitw -v "$C" || exit 1
|
|
$TMUX2 selectp -t0 || exit 1
|
|
$TMUX2 splitw -v "$C" || exit 1
|
|
$TMUX2 select-layout tiled || exit 1
|
|
}
|
|
layout_tee_lr() { # three columns, middle split: left and right tees
|
|
new_scene
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
$TMUX2 selectp -t0 || exit 1
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
$TMUX2 selectp -t1 || exit 1
|
|
$TMUX2 splitw -v "$C" || exit 1
|
|
}
|
|
layout_tee_up() { # top/bottom, top split: a bottom tee
|
|
new_scene
|
|
$TMUX2 splitw -v "$C" || exit 1
|
|
$TMUX2 selectp -t0 || exit 1
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
}
|
|
layout_tee_down() { # top/bottom, bottom split: a top tee
|
|
new_scene
|
|
$TMUX2 splitw -v "$C" || exit 1
|
|
$TMUX2 selectp -t1 || exit 1
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
}
|
|
|
|
$TMUX kill-server 2>/dev/null
|
|
$TMUX2 kill-server 2>/dev/null
|
|
|
|
$TMUX2 new -d -x40 -y14 "sh -c 'exec sleep 100'" || exit 1
|
|
$TMUX2 set -g status off || exit 1
|
|
$TMUX2 set -g window-size manual || exit 1
|
|
$TMUX2 set -g pane-border-format " #{pane_index} " || exit 1
|
|
|
|
$TMUX new -d -x40 -y14 || exit 1
|
|
$TMUX set -g status off || exit 1
|
|
$TMUX set -g window-size manual || exit 1
|
|
$TMUX set -g default-terminal "tmux-256color" || exit 1
|
|
$TMUX send -l "$TMUX2 attach" || exit 1
|
|
$TMUX send Enter || exit 1
|
|
sleep 1
|
|
|
|
# Every junction in every border style. New windows inherit the global option,
|
|
# so set it before building each layout.
|
|
for style in single double heavy simple number spaces none; do
|
|
$TMUX2 set -g pane-border-lines $style || exit 1
|
|
layout_cross; compare cross-$style
|
|
layout_tee_lr; compare tee-lr-$style
|
|
layout_tee_up; compare tee-up-$style
|
|
layout_tee_down; compare tee-down-$style
|
|
done
|
|
$TMUX2 set -g pane-border-lines single || exit 1
|
|
|
|
# Pane status lines and titles (one layout each). Use a format that includes the
|
|
# explicitly-set title; the default title is the hostname, which is not stable,
|
|
# so every pane's title must be set.
|
|
new_scene
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
$TMUX2 setw pane-border-format " #{pane_index}:#{pane_title} " || exit 1
|
|
$TMUX2 setw pane-border-status top || exit 1
|
|
$TMUX2 selectp -t:.0 -T left || exit 1
|
|
$TMUX2 selectp -t:.1 -T right || exit 1
|
|
$TMUX2 selectp -t:.0 || exit 1
|
|
compare pane-status-top
|
|
|
|
new_scene
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
$TMUX2 setw pane-border-format " #{pane_index}:#{pane_title} " || exit 1
|
|
$TMUX2 setw pane-border-status bottom || exit 1
|
|
$TMUX2 selectp -t:.0 -T left || exit 1
|
|
$TMUX2 selectp -t:.1 -T right || exit 1
|
|
$TMUX2 selectp -t:.0 || exit 1
|
|
compare pane-status-bottom
|
|
|
|
# title_all <title-prefix>: set every pane's title (the default is the hostname).
|
|
title_all() {
|
|
for p in $($TMUX2 list-panes -F '#{pane_index}'); do
|
|
$TMUX2 selectp -t:.$p -T $1$p || exit 1
|
|
done
|
|
$TMUX2 selectp -t:.0 || exit 1
|
|
}
|
|
|
|
# Three columns with a status line on top, then on the bottom.
|
|
new_scene
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
$TMUX2 selectp -t0 || exit 1
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
$TMUX2 setw pane-border-format " #{pane_title} " || exit 1
|
|
$TMUX2 setw pane-border-status top || exit 1
|
|
title_all p
|
|
compare pane-status-3-top
|
|
|
|
new_scene
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
$TMUX2 selectp -t0 || exit 1
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
$TMUX2 setw pane-border-format " #{pane_title} " || exit 1
|
|
$TMUX2 setw pane-border-status bottom || exit 1
|
|
title_all p
|
|
compare pane-status-3-bottom
|
|
|
|
# A 2x2 grid with a status line on top: status borders meet pane borders at the
|
|
# internal junctions.
|
|
new_scene
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
$TMUX2 splitw -v "$C" || exit 1
|
|
$TMUX2 selectp -t0 || exit 1
|
|
$TMUX2 splitw -v "$C" || exit 1
|
|
$TMUX2 select-layout tiled || exit 1
|
|
$TMUX2 setw pane-border-format " #{pane_title} " || exit 1
|
|
$TMUX2 setw pane-border-status top || exit 1
|
|
title_all p
|
|
compare pane-status-2x2-top
|
|
|
|
# A zoomed pane: the active pane fills the whole window and the other panes and
|
|
# their borders are not drawn at all (a single full-window pane scene).
|
|
new_scene
|
|
$TMUX2 splitw -h "$C" || exit 1
|
|
$TMUX2 splitw -v "$C" || exit 1
|
|
$TMUX2 selectp -t0 || exit 1
|
|
$TMUX2 resize-pane -Z || exit 1
|
|
compare zoomed-pane
|
|
|
|
exit 0
|