diff --git a/regress/screen-redraw-bidi.sh b/regress/screen-redraw-bidi.sh new file mode 100644 index 00000000..c7a18fdb --- /dev/null +++ b/regress/screen-redraw-bidi.sh @@ -0,0 +1,79 @@ +#!/bin/sh + +# Exercise screen-redraw.c bidirectional-isolate handling. When the client is +# UTF-8 and its terminal has the Bidi capability, each drawn span is wrapped in +# directional isolate characters (U+2066 .. U+2069) so a bidi terminal does not +# reorder pane contents across borders (the REDRAW_ISOLATES path). +# +# The Bidi capability is added with terminal-overrides before the client +# attaches, so the attached client picks it up. The isolate characters appear in +# the captured output around each span. +# +# 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 +} + +new_scene() { + $TMUX2 neww -d "sh -c 'exec sleep 100'" || exit 1 + $TMUX2 selectw -t:\$ || exit 1 + $TMUX2 resizew -x40 -y12 || exit 1 +} + +C="sh -c 'exec sleep 100'" + +$TMUX kill-server 2>/dev/null +$TMUX2 kill-server 2>/dev/null + +$TMUX2 new -d -x40 -y12 "sh -c 'exec sleep 100'" || exit 1 +$TMUX2 set -g status off || exit 1 +$TMUX2 set -g window-size manual || exit 1 +# Add the Bidi capability before the client attaches. +$TMUX2 set -ag terminal-overrides ",*:Bidi=\\E[8h" || exit 1 + +$TMUX new -d -x40 -y12 || 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 + +# Single pane: content is wrapped in isolates. +new_scene +compare bidi-single + +# Two panes: borders and both panes are isolated. +new_scene +$TMUX2 splitw -h "$C" || exit 1 +compare bidi-split + +exit 0 diff --git a/regress/screen-redraw-floating.sh b/regress/screen-redraw-floating.sh new file mode 100644 index 00000000..c5b9d460 --- /dev/null +++ b/regress/screen-redraw-floating.sh @@ -0,0 +1,167 @@ +#!/bin/sh + +# Exercise screen-redraw.c drawing of floating panes: their borders and titles, +# clipping at the window edge, and the interaction with the area outside the +# window (when the window is smaller than the attached client). +# +# 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 $2 >$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 +} + +# new_scene : fresh inner window of the given window size. +new_scene() { + $TMUX2 neww -d "sh -c 'printf base; exec sleep 100'" || exit 1 + $TMUX2 selectw -t:\$ || exit 1 + $TMUX2 resizew -x$1 -y$2 || exit 1 +} + +# tile_2x2: split the current window into a 2x2 grid of tiled panes. +tile_2x2() { + C="sh -c 'exec sleep 100'" + $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 +} + +$TMUX kill-server 2>/dev/null +$TMUX2 kill-server 2>/dev/null + +$TMUX2 new -d -x40 -y12 "sh -c 'printf base; 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_title} " || exit 1 + +$TMUX new -d -x40 -y12 || 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 + +# Basic floating pane, well inside the window. +new_scene 40 12 +$TMUX2 new-pane -x20 -y6 -X8 -Y3 "sh -c 'printf FLOAT; exec sleep 100'" || exit 1 +compare floating-basic + +# Floating pane with a title on its border. pane-border-status also draws the +# base pane's title, so set it explicitly (the default is the hostname, which is +# not stable). +new_scene 40 12 +$TMUX2 setw pane-border-status top || exit 1 +$TMUX2 selectp -t:.0 -T base || exit 1 +$TMUX2 new-pane -x20 -y6 -X8 -Y2 -T title \ + "sh -c 'printf FLOAT; exec sleep 100'" || exit 1 +compare floating-title + +# Larger floating pane with double border lines. +new_scene 40 12 +$TMUX2 new-pane -x28 -y8 -X4 -Y1 -B double \ + "sh -c 'printf FLOAT; exec sleep 100'" || exit 1 +compare floating-border-double + +# Floating pane positioned past the right and bottom edges: must clip. +new_scene 40 12 +$TMUX2 new-pane -x20 -y6 -X30 -Y8 "sh -c 'printf CLIP; exec sleep 100'" || exit 1 +compare floating-clip-edge + +# Window smaller than the client (outside area filled), with a floating pane +# that overlaps the boundary into the outside region. +new_scene 28 8 +$TMUX2 new-pane -x16 -y5 -X18 -Y4 "sh -c 'printf OUT; exec sleep 100'" || exit 1 +compare floating-outside + +# Floating pane clipped at the top-left corner (negative offsets). +new_scene 40 12 +$TMUX2 new-pane -x18 -y6 -X-4 -Y-2 "sh -c 'printf TL; exec sleep 100'" || exit 1 +compare floating-clip-topleft + +# Floating pane over a tiled 2x2 grid: the float draws a complete box and must +# NOT merge its borders with the tiled pane borders underneath. +new_scene 40 12 +tile_2x2 +$TMUX2 new-pane -x16 -y6 -X11 -Y3 "sh -c 'printf FLT; exec sleep 100'" || exit 1 +compare floating-over-tiled + +# Same, but the float uses double border lines while the tiled panes use single: +# the two border styles must coexist without merging. +new_scene 40 12 +tile_2x2 +$TMUX2 new-pane -x16 -y6 -X11 -Y3 -B double \ + "sh -c 'printf FLT; exec sleep 100'" || exit 1 +compare floating-over-tiled-double + +# Two overlapping floating panes: the later (top) float draws over the earlier. +new_scene 40 12 +$TMUX2 new-pane -x16 -y6 -X4 -Y2 "sh -c 'printf AAA; exec sleep 100'" || exit 1 +$TMUX2 new-pane -x16 -y6 -X14 -Y6 "sh -c 'printf BBB; exec sleep 100'" || exit 1 +compare floating-overlap + +# Two floating panes with different per-pane configuration: one has its status on +# top with single borders, the other has its status on the bottom with heavy +# borders (pane-border-status and pane-border-lines are per-pane options). +new_scene 40 12 +$TMUX2 setw pane-border-format " #{pane_title} " || exit 1 +$TMUX2 new-pane -x16 -y4 -X3 -Y1 -T one \ + "sh -c 'printf ONE; exec sleep 100'" || exit 1 +$TMUX2 set -p pane-border-status top || exit 1 +$TMUX2 set -p pane-border-lines single || exit 1 +$TMUX2 new-pane -x16 -y4 -X18 -Y6 -T two \ + "sh -c 'printf TWO; exec sleep 100'" || exit 1 +$TMUX2 set -p pane-border-status bottom || exit 1 +$TMUX2 set -p pane-border-lines heavy || exit 1 +compare floating-mixed-config + +# Floating pane over a pane that has a scrollbar: the float must draw over the +# scrollbar. Captured with -e since the scrollbar is drawn with styles. +new_scene 40 12 +$TMUX2 setw pane-scrollbars on || exit 1 +$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=0" || exit 1 +$TMUX2 new-pane -x16 -y6 -X22 -Y3 "sh -c 'printf OVERSB; exec sleep 100'" || exit 1 +compare floating-over-scrollbar -e + +# Floating pane overlapping the client status line: the status line is not part +# of the window scene, so the float is clipped at the window's bottom edge. +new_scene 40 11 +$TMUX2 set status on || exit 1 +$TMUX2 set status-position bottom || exit 1 +$TMUX2 set status-format[0] "" || exit 1 +$TMUX2 new-pane -x20 -y6 -X8 -Y7 "sh -c 'printf OVERST; exec sleep 100'" || exit 1 +compare floating-over-status + +exit 0 diff --git a/regress/screen-redraw-indicators.sh b/regress/screen-redraw-indicators.sh new file mode 100644 index 00000000..f24ea400 --- /dev/null +++ b/regress/screen-redraw-indicators.sh @@ -0,0 +1,176 @@ +#!/bin/sh + +# Exercise screen-redraw.c pane-border-indicators: the arrow indicators that +# point at the active pane, and the two-pane border colour split. +# +# Arrows are drawn as glyphs (captured plain). The two-pane colour split is +# drawn with styles, so that scene is captured with escapes (-e) and uses +# distinct active/inactive border styles so the split is visible. +# +# Each scene is rendered in an inner tmux attached inside an outer tmux pane. +# The outer pane is captured and compared with a golden 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 [-e]: capture the outer pane and compare (or generate). +compare() { + sleep 1 + $TMUX capturep -p $2 >$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 +} + +new_scene() { + $TMUX2 neww -d "sh -c 'exec sleep 100'" || exit 1 + $TMUX2 selectw -t:\$ || exit 1 + $TMUX2 resizew -x40 -y12 || exit 1 +} + +C="sh -c 'exec sleep 100'" + +$TMUX kill-server 2>/dev/null +$TMUX2 kill-server 2>/dev/null + +$TMUX2 new -d -x40 -y12 "sh -c 'exec sleep 100'" || exit 1 +$TMUX2 set -g status off || exit 1 +$TMUX2 set -g window-size manual || exit 1 + +$TMUX new -d -x40 -y12 || 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 + +# --- Arrows: must appear for whichever pane is active (GitHub #4780). --- + +$TMUX2 set -g pane-border-indicators arrows || exit 1 + +# Two panes, left active: arrow points left. +new_scene +$TMUX2 splitw -h "$C" || exit 1 +$TMUX2 selectp -t0 || exit 1 +compare arrows-2pane-left + +# Two panes, right active: arrow points right (the case that regressed). +new_scene +$TMUX2 splitw -h "$C" || exit 1 +$TMUX2 selectp -t1 || exit 1 +compare arrows-2pane-right + +# Three columns, middle active. +new_scene +$TMUX2 splitw -h "$C" || exit 1 +$TMUX2 selectp -t0 || exit 1 +$TMUX2 splitw -h "$C" || exit 1 +$TMUX2 selectp -t1 || exit 1 +compare arrows-3pane + +# Four panes (2x2), one active. +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 selectp -t0 || exit 1 +compare arrows-4pane + +# --- Two-pane border colour split. --- + +# Distinct active/inactive styles so the coloured halves are visible; captured +# with -e to record the SGR. +$TMUX2 set -g pane-border-indicators colour || exit 1 + +# Left/right split: the border is vertical and is split into a top half (active +# pane colour) and a bottom half (the LAYOUT_LEFTRIGHT case). +new_scene +$TMUX2 setw pane-active-border-style fg=red || exit 1 +$TMUX2 setw pane-border-style fg=green || exit 1 +$TMUX2 splitw -h "$C" || exit 1 +$TMUX2 selectp -t0 || exit 1 +compare two-pane-colour-vertical -e + +# Top/bottom split: the border is horizontal and is split into a left half and a +# right half instead (the LAYOUT_TOPBOTTOM case). +new_scene +$TMUX2 setw pane-active-border-style fg=red || exit 1 +$TMUX2 setw pane-border-style fg=green || exit 1 +$TMUX2 splitw -v "$C" || exit 1 +$TMUX2 selectp -t0 || exit 1 +compare two-pane-colour-horizontal -e + +# --- Marked pane. --- + +# A marked pane (select-pane -m) has its border drawn reversed. Captured with -e +# to record the reverse attribute. The marked pane is made non-active so its +# reversed border is distinct from the active pane. +$TMUX2 set -g pane-border-indicators off || exit 1 + +# Left/right split, right pane marked. +new_scene +$TMUX2 splitw -h "$C" || exit 1 +$TMUX2 selectp -t0 || exit 1 +$TMUX2 selectp -t1 -m || exit 1 +compare marked-pane-lr -e + +# Top/bottom split, bottom pane marked. +new_scene +$TMUX2 splitw -v "$C" || exit 1 +$TMUX2 selectp -t0 || exit 1 +$TMUX2 selectp -t1 -m || exit 1 +compare marked-pane-tb -e + +# Three columns, middle pane marked (reversed border on both sides). +new_scene +$TMUX2 splitw -h "$C" || exit 1 +$TMUX2 selectp -t0 || exit 1 +$TMUX2 splitw -h "$C" || exit 1 +$TMUX2 selectp -t0 || exit 1 +$TMUX2 selectp -t1 -m || exit 1 +compare marked-pane-three -e + +# Floating pane marked: the whole floating box border is reversed. +new_scene +$TMUX2 new-pane -x20 -y6 -X8 -Y3 "$C" || exit 1 +$TMUX2 selectp -t0 || exit 1 +$TMUX2 selectp -t1 -m || exit 1 +compare marked-pane-float -e + +# Marked pane together with a pane status line: the title border is reversed too. +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 -t0 || exit 1 +$TMUX2 selectp -t1 -m || exit 1 +compare marked-pane-status -e + +exit 0 diff --git a/regress/screen-redraw-outside.sh b/regress/screen-redraw-outside.sh new file mode 100644 index 00000000..d90e05b8 --- /dev/null +++ b/regress/screen-redraw-outside.sh @@ -0,0 +1,116 @@ +#!/bin/sh + +# Exercise screen-redraw.c when the window is smaller than the attached client, +# so part of the client is outside the window. screen-redraw.c fills the outside +# area and draws a real border along the window's right and/or bottom edge (not +# just where panes meet). This checks redraw_get_window_offset and the OUTSIDE +# span handling, including how the window-edge border joins the pane borders. +# +# Each scene is rendered in an inner tmux attached inside an outer tmux pane. +# The outer client is 40x14; the inner window is made smaller with resizew. The +# outer pane is captured and compared with a golden 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 +} + +# new_scene : fresh inner window smaller than the 40x14 client. +new_scene() { + $TMUX2 neww -d "sh -c 'printf base; exec sleep 100'" || exit 1 + $TMUX2 selectw -t:\$ || exit 1 + $TMUX2 resizew -x$1 -y$2 || exit 1 +} + +C="sh -c 'exec sleep 100'" + +$TMUX kill-server 2>/dev/null +$TMUX2 kill-server 2>/dev/null + +$TMUX2 new -d -x40 -y14 "sh -c 'printf base; exec sleep 100'" || exit 1 +$TMUX2 set -g status off || exit 1 +$TMUX2 set -g window-size manual || 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 + +# Single pane, narrower than the client: a border along the right edge. +new_scene 28 14 +compare outside-right-single + +# Narrower than the client with a left/right split: the inter-pane border plus a +# real border on the window's right edge, then the outside area. +new_scene 28 14 +$TMUX2 splitw -h "$C" || exit 1 +compare outside-right-split + +# Shorter than the client with a top/bottom split: a real border on the window's +# bottom edge. +new_scene 40 9 +$TMUX2 splitw -v "$C" || exit 1 +compare outside-bottom-split + +# Smaller in both dimensions with a 2x2 grid: borders on the right and bottom +# edges meeting the internal pane borders at the corner. +new_scene 28 9 +$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 +compare outside-both-2x2 + +# Window BIGGER than the client: only part of the window is viewed and the view +# can be panned (refresh-client). This exercises a non-zero scene offset. +# A 2x2 grid in a 60x20 window viewed through the 40x14 client. +new_scene 60 20 +$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 + +# Default view: the top-left of the window. +$TMUX2 refresh-client -U 100 || exit 1 +$TMUX2 refresh-client -L 100 || exit 1 +compare bigger-topleft + +# Panned to the bottom-right of the window (down and right to the limit). +$TMUX2 refresh-client -D 100 || exit 1 +$TMUX2 refresh-client -R 100 || exit 1 +compare bigger-bottomright + +exit 0 diff --git a/regress/screen-redraw-popups.sh b/regress/screen-redraw-popups.sh new file mode 100644 index 00000000..f0700df8 --- /dev/null +++ b/regress/screen-redraw-popups.sh @@ -0,0 +1,92 @@ +#!/bin/sh + +# Exercise drawing of popups (display-popup) over the window scene. A popup is an +# overlay drawn on top of the redraw scene (the overlay_draw path in +# screen-redraw.c), so this guards against regressions in how popups appear. +# +# A popup is modal and stays open until its command exits, so each scene fully +# re-creates the servers and re-attaches; the popup is opened in the background +# (display-popup blocks the client that runs it) and the outer pane is captured +# while it is open. +# +# 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 +} + +C="sh -c 'exec sleep 100'" + +# setup: fresh inner window attached inside a fresh outer pane, 40x14. +setup() { + $TMUX kill-server 2>/dev/null + $TMUX2 kill-server 2>/dev/null + $TMUX2 new -d -x40 -y14 "$C" || exit 1 + $TMUX2 set -g status off || exit 1 + $TMUX2 set -g window-size manual || exit 1 + $TMUX2 resizew -x40 -y14 || 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 +} + +# popup : open a popup running a fixed command, in the background (it stays +# open because the command sleeps; the servers are killed at the next setup). +popup() { + $TMUX2 display-popup "$@" -E "sh -c 'printf POPUP; exec sleep 100'" & + sleep 1 +} + +# Basic popup over a single pane. +setup +popup -w20 -h6 -x6 -y3 +compare popup-basic + +# Popup over a split: drawn on top of the pane border. +setup +$TMUX2 splitw -h "$C" || exit 1 +popup -w24 -h8 -x8 -y3 +compare popup-over-split + +# Popup with no border lines (-B). +setup +popup -B -w20 -h6 -x6 -y3 +compare popup-noborder + +# Popup with double border lines. +setup +popup -b double -w20 -h6 -x6 -y3 +compare popup-double + +exit 0 diff --git a/regress/screen-redraw-results/arrows-2pane-left.result b/regress/screen-redraw-results/arrows-2pane-left.result new file mode 100644 index 00000000..2f59b596 --- /dev/null +++ b/regress/screen-redraw-results/arrows-2pane-left.result @@ -0,0 +1,12 @@ + │ + ← + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/arrows-2pane-right.result b/regress/screen-redraw-results/arrows-2pane-right.result new file mode 100644 index 00000000..fe308030 --- /dev/null +++ b/regress/screen-redraw-results/arrows-2pane-right.result @@ -0,0 +1,12 @@ + │ + → + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/arrows-3pane.result b/regress/screen-redraw-results/arrows-3pane.result new file mode 100644 index 00000000..b9d3ef6f --- /dev/null +++ b/regress/screen-redraw-results/arrows-3pane.result @@ -0,0 +1,12 @@ + │ │ + → ← + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ diff --git a/regress/screen-redraw-results/arrows-4pane.result b/regress/screen-redraw-results/arrows-4pane.result new file mode 100644 index 00000000..695fec7e --- /dev/null +++ b/regress/screen-redraw-results/arrows-4pane.result @@ -0,0 +1,12 @@ + │ + ← + │ + │ + │ +─↑─────────────────┼──────────────────── + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/bidi-isolates.result b/regress/screen-redraw-results/bidi-isolates.result new file mode 100644 index 00000000..7d8e1456 --- /dev/null +++ b/regress/screen-redraw-results/bidi-isolates.result @@ -0,0 +1,14 @@ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/bidi-single.result b/regress/screen-redraw-results/bidi-single.result new file mode 100644 index 00000000..1901ba93 --- /dev/null +++ b/regress/screen-redraw-results/bidi-single.result @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/regress/screen-redraw-results/bidi-split.result b/regress/screen-redraw-results/bidi-split.result new file mode 100644 index 00000000..7d889921 --- /dev/null +++ b/regress/screen-redraw-results/bidi-split.result @@ -0,0 +1,12 @@ + ⁩│⁦ + ⁩│⁦ + ⁩│⁦ + ⁩│⁦ + ⁩│⁦ + ⁩│⁦ + ⁩│⁦ + ⁩│⁦ + ⁩│⁦ + ⁩│⁦ + ⁩│⁦ + ⁩│⁦ diff --git a/regress/screen-redraw-results/bigger-bottomright.result b/regress/screen-redraw-results/bigger-bottomright.result new file mode 100644 index 00000000..17a5df71 --- /dev/null +++ b/regress/screen-redraw-results/bigger-bottomright.result @@ -0,0 +1,14 @@ + │ + │ + │ +─────────┼────────────────────────────── + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/bigger-topleft.result b/regress/screen-redraw-results/bigger-topleft.result new file mode 100644 index 00000000..6538e3aa --- /dev/null +++ b/regress/screen-redraw-results/bigger-topleft.result @@ -0,0 +1,14 @@ +base │ + │ + │ + │ + │ + │ + │ + │ + │ +─────────────────────────────┼────────── + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/cross-double.result b/regress/screen-redraw-results/cross-double.result new file mode 100644 index 00000000..3d298721 --- /dev/null +++ b/regress/screen-redraw-results/cross-double.result @@ -0,0 +1,14 @@ + ║ + ║ + ║ + ║ + ║ + ║ +═══════════════════╬════════════════════ + ║ + ║ + ║ + ║ + ║ + ║ + ║ diff --git a/regress/screen-redraw-results/cross-heavy.result b/regress/screen-redraw-results/cross-heavy.result new file mode 100644 index 00000000..f379db1c --- /dev/null +++ b/regress/screen-redraw-results/cross-heavy.result @@ -0,0 +1,14 @@ + ┃ + ┃ + ┃ + ┃ + ┃ + ┃ +━━━━━━━━━━━━━━━━━━━╋━━━━━━━━━━━━━━━━━━━━ + ┃ + ┃ + ┃ + ┃ + ┃ + ┃ + ┃ diff --git a/regress/screen-redraw-results/cross-none.result b/regress/screen-redraw-results/cross-none.result new file mode 100644 index 00000000..5cf5d3dc --- /dev/null +++ b/regress/screen-redraw-results/cross-none.result @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/regress/screen-redraw-results/cross-number.result b/regress/screen-redraw-results/cross-number.result new file mode 100644 index 00000000..8376b237 --- /dev/null +++ b/regress/screen-redraw-results/cross-number.result @@ -0,0 +1,14 @@ + 1 + 1 + 1 + 1 + 1 + 1 +0000000000000000000011111111111111111111 + 2 + 2 + 2 + 2 + 2 + 2 + 2 diff --git a/regress/screen-redraw-results/cross-simple.result b/regress/screen-redraw-results/cross-simple.result new file mode 100644 index 00000000..1c6d94f9 --- /dev/null +++ b/regress/screen-redraw-results/cross-simple.result @@ -0,0 +1,14 @@ + | + | + | + | + | + | +-------------------+-------------------- + | + | + | + | + | + | + | diff --git a/regress/screen-redraw-results/cross-single.result b/regress/screen-redraw-results/cross-single.result new file mode 100644 index 00000000..d46a2834 --- /dev/null +++ b/regress/screen-redraw-results/cross-single.result @@ -0,0 +1,14 @@ + │ + │ + │ + │ + │ + │ +───────────────────┼──────────────────── + │ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/cross-spaces.result b/regress/screen-redraw-results/cross-spaces.result new file mode 100644 index 00000000..5cf5d3dc --- /dev/null +++ b/regress/screen-redraw-results/cross-spaces.result @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/regress/screen-redraw-results/floating-basic.result b/regress/screen-redraw-results/floating-basic.result new file mode 100644 index 00000000..f51ccbe2 --- /dev/null +++ b/regress/screen-redraw-results/floating-basic.result @@ -0,0 +1,12 @@ +base + + ┌────────────────────┐ + │FLOAT │ + │ │ + │ │ + │ │ + │ │ + │ │ + └────────────────────┘ + + diff --git a/regress/screen-redraw-results/floating-border-double.result b/regress/screen-redraw-results/floating-border-double.result new file mode 100644 index 00000000..a1b1cd7a --- /dev/null +++ b/regress/screen-redraw-results/floating-border-double.result @@ -0,0 +1,12 @@ +bas╔════════════════════════════╗ + ║FLOAT ║ + ║ ║ + ║ ║ + ║ ║ + ║ ║ + ║ ║ + ║ ║ + ║ ║ + ╚════════════════════════════╝ + + diff --git a/regress/screen-redraw-results/floating-clip-edge.result b/regress/screen-redraw-results/floating-clip-edge.result new file mode 100644 index 00000000..9998eff4 --- /dev/null +++ b/regress/screen-redraw-results/floating-clip-edge.result @@ -0,0 +1,12 @@ +base + + + + + + + ┌────────── + │CLIP + │ + │ + │ diff --git a/regress/screen-redraw-results/floating-clip-topleft.result b/regress/screen-redraw-results/floating-clip-topleft.result new file mode 100644 index 00000000..f79255d9 --- /dev/null +++ b/regress/screen-redraw-results/floating-clip-topleft.result @@ -0,0 +1,12 @@ +base + │ + │ + │ + ─────────────┘ + + + + + + + diff --git a/regress/screen-redraw-results/floating-mixed-config.result b/regress/screen-redraw-results/floating-mixed-config.result new file mode 100644 index 00000000..ae6f2efb --- /dev/null +++ b/regress/screen-redraw-results/floating-mixed-config.result @@ -0,0 +1,12 @@ +ba┌── one ─────────┐ + │ONE │ + │ │ + │ │ + │ │ + └──────────────┏━━━━━━━━━━━━━━━━┓ + ┃TWO ┃ + ┃ ┃ + ┃ ┃ + ┃ ┃ + ┗━━ two ━━━━━━━━━┛ + diff --git a/regress/screen-redraw-results/floating-outside.result b/regress/screen-redraw-results/floating-outside.result new file mode 100644 index 00000000..f24f0f02 --- /dev/null +++ b/regress/screen-redraw-results/floating-outside.result @@ -0,0 +1,12 @@ +base │··········· + │··········· + │··········· + ┌──────────│··········· + │OUT │··········· + │ │··········· + │ │··········· + │ │··········· +────────────────────────────┘··········· +········································ +········································ +········································ diff --git a/regress/screen-redraw-results/floating-over-scrollbar.result b/regress/screen-redraw-results/floating-over-scrollbar.result new file mode 100644 index 00000000..80ecc8c3 --- /dev/null +++ b/regress/screen-redraw-results/floating-over-scrollbar.result @@ -0,0 +1,12 @@ +base  +  + ┌────────────────┐ + │OVERSB  │ + │  │ + │  │ + │  │ + │  │ + │  │ + └────────────────┘ +  +  diff --git a/regress/screen-redraw-results/floating-over-status.result b/regress/screen-redraw-results/floating-over-status.result new file mode 100644 index 00000000..76c6ebac --- /dev/null +++ b/regress/screen-redraw-results/floating-over-status.result @@ -0,0 +1,12 @@ +base + + + + + + ┌────────────────────┐ + │OVERST │ + │ │ + │ │ + │ │ + diff --git a/regress/screen-redraw-results/floating-over-tiled-double.result b/regress/screen-redraw-results/floating-over-tiled-double.result new file mode 100644 index 00000000..8c4b5eaf --- /dev/null +++ b/regress/screen-redraw-results/floating-over-tiled-double.result @@ -0,0 +1,12 @@ +base │ + │ + ╔════════════════╗ + ║FLT ║ + ║ ║ +──────────║ ║──────────── + ║ ║ + ║ ║ + ║ ║ + ╚════════════════╝ + │ + │ diff --git a/regress/screen-redraw-results/floating-over-tiled.result b/regress/screen-redraw-results/floating-over-tiled.result new file mode 100644 index 00000000..4ddf95ed --- /dev/null +++ b/regress/screen-redraw-results/floating-over-tiled.result @@ -0,0 +1,12 @@ +base │ + │ + ┌────────────────┐ + │FLT │ + │ │ +──────────│ │──────────── + │ │ + │ │ + │ │ + └────────────────┘ + │ + │ diff --git a/regress/screen-redraw-results/floating-overlap.result b/regress/screen-redraw-results/floating-overlap.result new file mode 100644 index 00000000..58f00b60 --- /dev/null +++ b/regress/screen-redraw-results/floating-overlap.result @@ -0,0 +1,12 @@ +base + ┌────────────────┐ + │AAA │ + │ │ + │ │ + │ ┌────────────────┐ + │ │BBB │ + │ │ │ + └─────────│ │ + │ │ + │ │ + │ │ diff --git a/regress/screen-redraw-results/floating-title.result b/regress/screen-redraw-results/floating-title.result new file mode 100644 index 00000000..896a715b --- /dev/null +++ b/regress/screen-redraw-results/floating-title.result @@ -0,0 +1,12 @@ +── base ──────────────────────────────── +base ┌── title ───────────┐ + │FLOAT │ + │ │ + │ │ + │ │ + │ │ + │ │ + └────────────────────┘ + + + diff --git a/regress/screen-redraw-results/marked-pane-float.result b/regress/screen-redraw-results/marked-pane-float.result new file mode 100644 index 00000000..2be62da7 --- /dev/null +++ b/regress/screen-redraw-results/marked-pane-float.result @@ -0,0 +1,12 @@ + + + ┌────────────────────┐ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + └────────────────────┘ + + diff --git a/regress/screen-redraw-results/marked-pane-lr.result b/regress/screen-redraw-results/marked-pane-lr.result new file mode 100644 index 00000000..842f95c3 --- /dev/null +++ b/regress/screen-redraw-results/marked-pane-lr.result @@ -0,0 +1,12 @@ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/marked-pane-status.result b/regress/screen-redraw-results/marked-pane-status.result new file mode 100644 index 00000000..2e9830d2 --- /dev/null +++ b/regress/screen-redraw-results/marked-pane-status.result @@ -0,0 +1,12 @@ +── 0:left ──────────┬── 1:right ──────── + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/marked-pane-tb.result b/regress/screen-redraw-results/marked-pane-tb.result new file mode 100644 index 00000000..86181f19 --- /dev/null +++ b/regress/screen-redraw-results/marked-pane-tb.result @@ -0,0 +1,12 @@ + + + + + + +──────────────────────────────────────── + + + + + diff --git a/regress/screen-redraw-results/marked-pane-three.result b/regress/screen-redraw-results/marked-pane-three.result new file mode 100644 index 00000000..3f4f671e --- /dev/null +++ b/regress/screen-redraw-results/marked-pane-three.result @@ -0,0 +1,12 @@ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ diff --git a/regress/screen-redraw-results/outside-both-2x2.result b/regress/screen-redraw-results/outside-both-2x2.result new file mode 100644 index 00000000..193d66aa --- /dev/null +++ b/regress/screen-redraw-results/outside-both-2x2.result @@ -0,0 +1,14 @@ +base │ │··········· + │ │··········· + │ │··········· + │ │··········· +─────────────┼──────────────┤··········· + │ │··········· + │ │··········· + │ │··········· + │ │··········· +─────────────┴──────────────┘··········· +········································ +········································ +········································ +········································ diff --git a/regress/screen-redraw-results/outside-bottom-split.result b/regress/screen-redraw-results/outside-bottom-split.result new file mode 100644 index 00000000..af6ac8a5 --- /dev/null +++ b/regress/screen-redraw-results/outside-bottom-split.result @@ -0,0 +1,14 @@ +base + + + +──────────────────────────────────────── + + + + +──────────────────────────────────────── +········································ +········································ +········································ +········································ diff --git a/regress/screen-redraw-results/outside-right-single.result b/regress/screen-redraw-results/outside-right-single.result new file mode 100644 index 00000000..27d98e8d --- /dev/null +++ b/regress/screen-redraw-results/outside-right-single.result @@ -0,0 +1,14 @@ +base │··········· + │··········· + │··········· + │··········· + │··········· + │··········· + │··········· + │··········· + │··········· + │··········· + │··········· + │··········· + │··········· + │··········· diff --git a/regress/screen-redraw-results/outside-right-split.result b/regress/screen-redraw-results/outside-right-split.result new file mode 100644 index 00000000..fd57ef0e --- /dev/null +++ b/regress/screen-redraw-results/outside-right-split.result @@ -0,0 +1,14 @@ +base │ │··········· + │ │··········· + │ │··········· + │ │··········· + │ │··········· + │ │··········· + │ │··········· + │ │··········· + │ │··········· + │ │··········· + │ │··········· + │ │··········· + │ │··········· + │ │··········· diff --git a/regress/screen-redraw-results/pane-status-2x2-top.result b/regress/screen-redraw-results/pane-status-2x2-top.result new file mode 100644 index 00000000..14f8dc0b --- /dev/null +++ b/regress/screen-redraw-results/pane-status-2x2-top.result @@ -0,0 +1,14 @@ +── p0 ─────────────┬── p1 ────────────── + │ + │ + │ + │ + │ +── p2 ─────────────┼── p3 ────────────── + │ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/pane-status-3-bottom.result b/regress/screen-redraw-results/pane-status-3-bottom.result new file mode 100644 index 00000000..a0e3dc03 --- /dev/null +++ b/regress/screen-redraw-results/pane-status-3-bottom.result @@ -0,0 +1,14 @@ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ +── p0 ────┴── p1 ───┴── p2 ───────────── diff --git a/regress/screen-redraw-results/pane-status-3-top.result b/regress/screen-redraw-results/pane-status-3-top.result new file mode 100644 index 00000000..ce3808e0 --- /dev/null +++ b/regress/screen-redraw-results/pane-status-3-top.result @@ -0,0 +1,14 @@ +── p0 ────┬── p1 ───┬── p2 ───────────── + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ diff --git a/regress/screen-redraw-results/pane-status-bottom.result b/regress/screen-redraw-results/pane-status-bottom.result new file mode 100644 index 00000000..c848089f --- /dev/null +++ b/regress/screen-redraw-results/pane-status-bottom.result @@ -0,0 +1,14 @@ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ +── 0:left ──────────┴── 1:right ──────── diff --git a/regress/screen-redraw-results/pane-status-mixed.result b/regress/screen-redraw-results/pane-status-mixed.result new file mode 100644 index 00000000..7d8e1456 --- /dev/null +++ b/regress/screen-redraw-results/pane-status-mixed.result @@ -0,0 +1,14 @@ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/pane-status-top.result b/regress/screen-redraw-results/pane-status-top.result new file mode 100644 index 00000000..a1145d6e --- /dev/null +++ b/regress/screen-redraw-results/pane-status-top.result @@ -0,0 +1,14 @@ +── 0:left ──────────┬── 1:right ──────── + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/popup-basic.result b/regress/screen-redraw-results/popup-basic.result new file mode 100644 index 00000000..20d19f43 --- /dev/null +++ b/regress/screen-redraw-results/popup-basic.result @@ -0,0 +1,14 @@ + ┌──────────────────┐ + │POPUP │ + │ │ + │ │ + │ │ + └──────────────────┘ + + + + + + + + diff --git a/regress/screen-redraw-results/popup-double.result b/regress/screen-redraw-results/popup-double.result new file mode 100644 index 00000000..b3b15c3a --- /dev/null +++ b/regress/screen-redraw-results/popup-double.result @@ -0,0 +1,14 @@ + ╔══════════════════╗ + ║POPUP ║ + ║ ║ + ║ ║ + ║ ║ + ╚══════════════════╝ + + + + + + + + diff --git a/regress/screen-redraw-results/popup-noborder.result b/regress/screen-redraw-results/popup-noborder.result new file mode 100644 index 00000000..46208a3a --- /dev/null +++ b/regress/screen-redraw-results/popup-noborder.result @@ -0,0 +1,14 @@ + POPUP + + + + + + + + + + + + + diff --git a/regress/screen-redraw-results/popup-over-split.result b/regress/screen-redraw-results/popup-over-split.result new file mode 100644 index 00000000..7302f964 --- /dev/null +++ b/regress/screen-redraw-results/popup-over-split.result @@ -0,0 +1,14 @@ + ┌──────────────────────┐ + │POPUP │ + │ │ + │ │ + │ │ + │ │ + │ │ + └──────────────────────┘ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/scrollbar-copy-mode.result b/regress/screen-redraw-results/scrollbar-copy-mode.result new file mode 100644 index 00000000..864d138f --- /dev/null +++ b/regress/screen-redraw-results/scrollbar-copy-mode.result @@ -0,0 +1,12 @@ +1  +2  +3  +4  +5  +6  +7  +8  +9  +10  +11  +12  diff --git a/regress/screen-redraw-results/scrollbar-floating.result b/regress/screen-redraw-results/scrollbar-floating.result new file mode 100644 index 00000000..8adb4da4 --- /dev/null +++ b/regress/screen-redraw-results/scrollbar-floating.result @@ -0,0 +1,12 @@ +base  +  + ┌────────────────────┐  + │FLOAT  │  + │  │  + │  │  + │  │  + │  │  + │  │  + └────────────────────┘  +  +  diff --git a/regress/screen-redraw-results/scrollbar-left-pad.result b/regress/screen-redraw-results/scrollbar-left-pad.result new file mode 100644 index 00000000..4a578e78 --- /dev/null +++ b/regress/screen-redraw-results/scrollbar-left-pad.result @@ -0,0 +1,12 @@ +  base +  +  +  +  +  +  +  +  +  +  +  diff --git a/regress/screen-redraw-results/scrollbar-left-w1.result b/regress/screen-redraw-results/scrollbar-left-w1.result new file mode 100644 index 00000000..84d27862 --- /dev/null +++ b/regress/screen-redraw-results/scrollbar-left-w1.result @@ -0,0 +1,12 @@ + base +  +  +  +  +  +  +  +  +  +  +  diff --git a/regress/screen-redraw-results/scrollbar-right-pad.result b/regress/screen-redraw-results/scrollbar-right-pad.result new file mode 100644 index 00000000..dff530e2 --- /dev/null +++ b/regress/screen-redraw-results/scrollbar-right-pad.result @@ -0,0 +1,12 @@ +base  +  +  +  +  +  +  +  +  +  +  +  diff --git a/regress/screen-redraw-results/scrollbar-right-w1.result b/regress/screen-redraw-results/scrollbar-right-w1.result new file mode 100644 index 00000000..dff530e2 --- /dev/null +++ b/regress/screen-redraw-results/scrollbar-right-w1.result @@ -0,0 +1,12 @@ +base  +  +  +  +  +  +  +  +  +  +  +  diff --git a/regress/screen-redraw-results/scrollbar-right-w2.result b/regress/screen-redraw-results/scrollbar-right-w2.result new file mode 100644 index 00000000..a82d8621 --- /dev/null +++ b/regress/screen-redraw-results/scrollbar-right-w2.result @@ -0,0 +1,12 @@ +base  +  +  +  +  +  +  +  +  +  +  +  diff --git a/regress/screen-redraw-results/status-3-bottom.result b/regress/screen-redraw-results/status-3-bottom.result new file mode 100644 index 00000000..1a62240d --- /dev/null +++ b/regress/screen-redraw-results/status-3-bottom.result @@ -0,0 +1,12 @@ +TOP + + + +────────────────────────────── +BOT + + + + + + diff --git a/regress/screen-redraw-results/status-3-top.result b/regress/screen-redraw-results/status-3-top.result new file mode 100644 index 00000000..8b8d0274 --- /dev/null +++ b/regress/screen-redraw-results/status-3-top.result @@ -0,0 +1,12 @@ + + + +TOP + + + +────────────────────────────── +BOT + + + diff --git a/regress/screen-redraw-results/status-bottom.result b/regress/screen-redraw-results/status-bottom.result new file mode 100644 index 00000000..47979559 --- /dev/null +++ b/regress/screen-redraw-results/status-bottom.result @@ -0,0 +1,12 @@ +TOP + + + + +────────────────────────────── +BOT + + + + + diff --git a/regress/screen-redraw-results/status-off.result b/regress/screen-redraw-results/status-off.result new file mode 100644 index 00000000..e56d82be --- /dev/null +++ b/regress/screen-redraw-results/status-off.result @@ -0,0 +1,12 @@ +TOP + + + + + +────────────────────────────── +BOT + + + + diff --git a/regress/screen-redraw-results/status-top.result b/regress/screen-redraw-results/status-top.result new file mode 100644 index 00000000..e06a0679 --- /dev/null +++ b/regress/screen-redraw-results/status-top.result @@ -0,0 +1,12 @@ + +TOP + + + + +────────────────────────────── +BOT + + + + diff --git a/regress/screen-redraw-results/tee-down-double.result b/regress/screen-redraw-results/tee-down-double.result new file mode 100644 index 00000000..f67bb874 --- /dev/null +++ b/regress/screen-redraw-results/tee-down-double.result @@ -0,0 +1,14 @@ + + + + + + + +════════════════════╦═══════════════════ + ║ + ║ + ║ + ║ + ║ + ║ diff --git a/regress/screen-redraw-results/tee-down-heavy.result b/regress/screen-redraw-results/tee-down-heavy.result new file mode 100644 index 00000000..19bbdeb1 --- /dev/null +++ b/regress/screen-redraw-results/tee-down-heavy.result @@ -0,0 +1,14 @@ + + + + + + + +━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━ + ┃ + ┃ + ┃ + ┃ + ┃ + ┃ diff --git a/regress/screen-redraw-results/tee-down-none.result b/regress/screen-redraw-results/tee-down-none.result new file mode 100644 index 00000000..5cf5d3dc --- /dev/null +++ b/regress/screen-redraw-results/tee-down-none.result @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/regress/screen-redraw-results/tee-down-number.result b/regress/screen-redraw-results/tee-down-number.result new file mode 100644 index 00000000..3081640b --- /dev/null +++ b/regress/screen-redraw-results/tee-down-number.result @@ -0,0 +1,14 @@ + + + + + + + +0000000000000000000022222222222222222222 + 2 + 2 + 2 + 2 + 2 + 2 diff --git a/regress/screen-redraw-results/tee-down-simple.result b/regress/screen-redraw-results/tee-down-simple.result new file mode 100644 index 00000000..5c68949e --- /dev/null +++ b/regress/screen-redraw-results/tee-down-simple.result @@ -0,0 +1,14 @@ + + + + + + + +--------------------+------------------- + | + | + | + | + | + | diff --git a/regress/screen-redraw-results/tee-down-single.result b/regress/screen-redraw-results/tee-down-single.result new file mode 100644 index 00000000..405ec7f6 --- /dev/null +++ b/regress/screen-redraw-results/tee-down-single.result @@ -0,0 +1,14 @@ + + + + + + + +────────────────────┬─────────────────── + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/tee-down-spaces.result b/regress/screen-redraw-results/tee-down-spaces.result new file mode 100644 index 00000000..5cf5d3dc --- /dev/null +++ b/regress/screen-redraw-results/tee-down-spaces.result @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/regress/screen-redraw-results/tee-lr-double.result b/regress/screen-redraw-results/tee-lr-double.result new file mode 100644 index 00000000..422c2136 --- /dev/null +++ b/regress/screen-redraw-results/tee-lr-double.result @@ -0,0 +1,14 @@ + ║ ║ + ║ ║ + ║ ║ + ║ ║ + ║ ║ + ║ ║ + ║ ║ + ╠═════════╣ + ║ ║ + ║ ║ + ║ ║ + ║ ║ + ║ ║ + ║ ║ diff --git a/regress/screen-redraw-results/tee-lr-heavy.result b/regress/screen-redraw-results/tee-lr-heavy.result new file mode 100644 index 00000000..708453bc --- /dev/null +++ b/regress/screen-redraw-results/tee-lr-heavy.result @@ -0,0 +1,14 @@ + ┃ ┃ + ┃ ┃ + ┃ ┃ + ┃ ┃ + ┃ ┃ + ┃ ┃ + ┃ ┃ + ┣━━━━━━━━━┫ + ┃ ┃ + ┃ ┃ + ┃ ┃ + ┃ ┃ + ┃ ┃ + ┃ ┃ diff --git a/regress/screen-redraw-results/tee-lr-none.result b/regress/screen-redraw-results/tee-lr-none.result new file mode 100644 index 00000000..5cf5d3dc --- /dev/null +++ b/regress/screen-redraw-results/tee-lr-none.result @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/regress/screen-redraw-results/tee-lr-number.result b/regress/screen-redraw-results/tee-lr-number.result new file mode 100644 index 00000000..9595d048 --- /dev/null +++ b/regress/screen-redraw-results/tee-lr-number.result @@ -0,0 +1,14 @@ + 0 1 + 0 1 + 0 1 + 0 1 + 0 1 + 0 1 + 0 1 + 22222222222 + 2 2 + 2 2 + 2 2 + 2 2 + 2 2 + 2 2 diff --git a/regress/screen-redraw-results/tee-lr-simple.result b/regress/screen-redraw-results/tee-lr-simple.result new file mode 100644 index 00000000..73fb7f59 --- /dev/null +++ b/regress/screen-redraw-results/tee-lr-simple.result @@ -0,0 +1,14 @@ + | | + | | + | | + | | + | | + | | + | | + +---------+ + | | + | | + | | + | | + | | + | | diff --git a/regress/screen-redraw-results/tee-lr-single.result b/regress/screen-redraw-results/tee-lr-single.result new file mode 100644 index 00000000..4f8645ab --- /dev/null +++ b/regress/screen-redraw-results/tee-lr-single.result @@ -0,0 +1,14 @@ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ + ├─────────┤ + │ │ + │ │ + │ │ + │ │ + │ │ + │ │ diff --git a/regress/screen-redraw-results/tee-lr-spaces.result b/regress/screen-redraw-results/tee-lr-spaces.result new file mode 100644 index 00000000..5cf5d3dc --- /dev/null +++ b/regress/screen-redraw-results/tee-lr-spaces.result @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/regress/screen-redraw-results/tee-up-double.result b/regress/screen-redraw-results/tee-up-double.result new file mode 100644 index 00000000..6df4582a --- /dev/null +++ b/regress/screen-redraw-results/tee-up-double.result @@ -0,0 +1,14 @@ + ║ + ║ + ║ + ║ + ║ + ║ + ║ +════════════════════╩═══════════════════ + + + + + + diff --git a/regress/screen-redraw-results/tee-up-heavy.result b/regress/screen-redraw-results/tee-up-heavy.result new file mode 100644 index 00000000..1e7d9637 --- /dev/null +++ b/regress/screen-redraw-results/tee-up-heavy.result @@ -0,0 +1,14 @@ + ┃ + ┃ + ┃ + ┃ + ┃ + ┃ + ┃ +━━━━━━━━━━━━━━━━━━━━┻━━━━━━━━━━━━━━━━━━━ + + + + + + diff --git a/regress/screen-redraw-results/tee-up-none.result b/regress/screen-redraw-results/tee-up-none.result new file mode 100644 index 00000000..5cf5d3dc --- /dev/null +++ b/regress/screen-redraw-results/tee-up-none.result @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/regress/screen-redraw-results/tee-up-number.result b/regress/screen-redraw-results/tee-up-number.result new file mode 100644 index 00000000..89434121 --- /dev/null +++ b/regress/screen-redraw-results/tee-up-number.result @@ -0,0 +1,14 @@ + 1 + 1 + 1 + 1 + 1 + 1 + 1 +0000000000000000000011111111111111111111 + + + + + + diff --git a/regress/screen-redraw-results/tee-up-simple.result b/regress/screen-redraw-results/tee-up-simple.result new file mode 100644 index 00000000..5cf438f5 --- /dev/null +++ b/regress/screen-redraw-results/tee-up-simple.result @@ -0,0 +1,14 @@ + | + | + | + | + | + | + | +--------------------+------------------- + + + + + + diff --git a/regress/screen-redraw-results/tee-up-single.result b/regress/screen-redraw-results/tee-up-single.result new file mode 100644 index 00000000..1f94c93b --- /dev/null +++ b/regress/screen-redraw-results/tee-up-single.result @@ -0,0 +1,14 @@ + │ + │ + │ + │ + │ + │ + │ +────────────────────┴─────────────────── + + + + + + diff --git a/regress/screen-redraw-results/tee-up-spaces.result b/regress/screen-redraw-results/tee-up-spaces.result new file mode 100644 index 00000000..5cf5d3dc --- /dev/null +++ b/regress/screen-redraw-results/tee-up-spaces.result @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/regress/screen-redraw-results/two-pane-colour-horizontal.result b/regress/screen-redraw-results/two-pane-colour-horizontal.result new file mode 100644 index 00000000..6d4e431d --- /dev/null +++ b/regress/screen-redraw-results/two-pane-colour-horizontal.result @@ -0,0 +1,12 @@ + + + + + + +──────────────────────────────────────── + + + + + diff --git a/regress/screen-redraw-results/two-pane-colour-vertical.result b/regress/screen-redraw-results/two-pane-colour-vertical.result new file mode 100644 index 00000000..6beaf020 --- /dev/null +++ b/regress/screen-redraw-results/two-pane-colour-vertical.result @@ -0,0 +1,12 @@ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/window-style-active.result b/regress/screen-redraw-results/window-style-active.result new file mode 100644 index 00000000..9059228b --- /dev/null +++ b/regress/screen-redraw-results/window-style-active.result @@ -0,0 +1,8 @@ + │ + │ + │ + │ + │ + │ + │ + │ diff --git a/regress/screen-redraw-results/window-style-single.result b/regress/screen-redraw-results/window-style-single.result new file mode 100644 index 00000000..5a2e4bfb --- /dev/null +++ b/regress/screen-redraw-results/window-style-single.result @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/regress/screen-redraw-scrollbars.sh b/regress/screen-redraw-scrollbars.sh new file mode 100644 index 00000000..aa44bfb8 --- /dev/null +++ b/regress/screen-redraw-scrollbars.sh @@ -0,0 +1,121 @@ +#!/bin/sh + +# Exercise screen-redraw.c drawing of pane scrollbars: position (right/left), +# width, and pad (which is handled separately from width). Scrollbars are drawn +# as styled (coloured) cells rather than glyphs, so these scenes are captured +# with escape sequences (-e); without that the scrollbar is invisible. +# +# Each scene is rendered in an inner tmux attached inside an outer tmux pane. +# The outer pane is captured and compared with a golden 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 : capture the outer pane with escapes and compare (or generate). +compare() { + sleep 1 + $TMUX capturep -pe >$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 +} + +# new_scene: fresh inner window, single full-size pane. +new_scene() { + $TMUX2 neww -d "sh -c 'printf base; exec sleep 100'" || exit 1 + $TMUX2 selectw -t:\$ || exit 1 + $TMUX2 resizew -x40 -y12 || exit 1 +} + +$TMUX kill-server 2>/dev/null +$TMUX2 kill-server 2>/dev/null + +$TMUX2 new -d -x40 -y12 "sh -c 'printf base; exec sleep 100'" || exit 1 +$TMUX2 set -g status off || exit 1 +$TMUX2 set -g window-size manual || exit 1 +$TMUX2 set -g pane-scrollbars on || exit 1 + +$TMUX new -d -x40 -y12 || 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 + +# Right, width 1, no pad. +new_scene +$TMUX2 setw pane-scrollbars-position right || exit 1 +$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=0" || exit 1 +compare scrollbar-right-w1 + +# Left, width 1, no pad. +new_scene +$TMUX2 setw pane-scrollbars-position left || exit 1 +$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=0" || exit 1 +compare scrollbar-left-w1 + +# Right, width 2, no pad. +new_scene +$TMUX2 setw pane-scrollbars-position right || exit 1 +$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=2,pad=0" || exit 1 +compare scrollbar-right-w2 + +# Right, width 1, pad 1. The pad is drawn between the pane content and the +# scrollbar; for a right scrollbar that pad cell is at the right edge, so capture +# trims it and this matches scrollbar-right-w1. The golden still pins that +# behaviour (and the pad draw path runs); the left scene below shows pad visibly. +new_scene +$TMUX2 setw pane-scrollbars-position right || exit 1 +$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=1" || exit 1 +compare scrollbar-right-pad + +# Left, width 1, pad 1: the pad cell sits between the slider and the content, so +# it is visible (one extra column before the pane content). +new_scene +$TMUX2 setw pane-scrollbars-position left || exit 1 +$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=1" || exit 1 +compare scrollbar-left-pad + +# Floating pane with a scrollbar. +new_scene +$TMUX2 setw pane-scrollbars-position right || exit 1 +$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=0" || exit 1 +$TMUX2 new-pane -x20 -y6 -X8 -Y3 "sh -c 'printf FLOAT; exec sleep 100'" || exit 1 +compare scrollbar-floating + +# Scrollbar slider in copy mode: with scrollback the slider is shorter than the +# track, so this exercises the slider geometry (which only runs when the pane is +# in a mode). copy-mode -H hides the position indicator, which is not stable. +$TMUX2 neww -d "sh -c 'seq 40; exec sleep 100'" || exit 1 +$TMUX2 selectw -t:\$ || exit 1 +$TMUX2 resizew -x40 -y12 || exit 1 +$TMUX2 setw pane-scrollbars-position right || exit 1 +$TMUX2 setw pane-scrollbars-style "bg=black,fg=white,width=1,pad=0" || exit 1 +$TMUX2 copy-mode -H || exit 1 +$TMUX2 send -X history-top || exit 1 +compare scrollbar-copy-mode -e + +exit 0 diff --git a/regress/screen-redraw-status.sh b/regress/screen-redraw-status.sh new file mode 100644 index 00000000..12ca20bb --- /dev/null +++ b/regress/screen-redraw-status.sh @@ -0,0 +1,92 @@ +#!/bin/sh + +# Exercise how the client status line affects the window scene drawn by +# screen-redraw.c. The status line is not part of the scene, but its size and +# position change the scene's offset and height (status_line_size and the +# REDRAW_STATUS_TOP flag in screen-redraw.c). The status line content does not +# matter, so status-format is set empty; only the offset effect is tested. +# +# A top/bottom split makes the offset visible: the horizontal border and the +# pane contents move as the status line grows or changes side. +# +# Each scene is rendered in an inner tmux attached inside an outer tmux pane. +# The outer pane is captured and compared with a golden 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 +} + +$TMUX kill-server 2>/dev/null +$TMUX2 kill-server 2>/dev/null + +# Inner: a top/bottom split. The window tracks the attached client size, so the +# status line shrinks/shifts the window scene. Status content is blanked. +$TMUX2 new -d -x30 -y12 "sh -c 'printf TOP; exec sleep 100'" || exit 1 +$TMUX2 set -g window-size latest || exit 1 +i=0 +while [ $i -le 4 ]; do + $TMUX2 set -g status-format[$i] "" || exit 1 + i=$((i + 1)) +done +$TMUX2 splitw -v "sh -c 'printf BOT; exec sleep 100'" || exit 1 + +$TMUX new -d -x30 -y12 || 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 + +# No status line: the window fills the whole client. +$TMUX2 set -g status off || exit 1 +compare status-off + +# One line at the bottom: the scene loses its bottom row. +$TMUX2 set -g status on || exit 1 +$TMUX2 set -g status-position bottom || exit 1 +compare status-bottom + +# One line at the top: the whole scene is shifted down one row. +$TMUX2 set -g status-position top || exit 1 +compare status-top + +# Three lines at the bottom. +$TMUX2 set -g status 3 || exit 1 +$TMUX2 set -g status-position bottom || exit 1 +compare status-3-bottom + +# Three lines at the top: the scene is shifted down three rows. +$TMUX2 set -g status-position top || exit 1 +compare status-3-top + +exit 0 diff --git a/regress/screen-redraw-tiled.sh b/regress/screen-redraw-tiled.sh new file mode 100644 index 00000000..fd2b6d2a --- /dev/null +++ b/regress/screen-redraw-tiled.sh @@ -0,0 +1,180 @@ +#!/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 : 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 + +exit 0 diff --git a/regress/screen-redraw-window-style.sh b/regress/screen-redraw-window-style.sh new file mode 100644 index 00000000..0b4e07d7 --- /dev/null +++ b/regress/screen-redraw-window-style.sh @@ -0,0 +1,77 @@ +#!/bin/sh + +# Exercise window-style and window-active-style, which set the default cell +# (background) style for a window's panes. screen-redraw.c uses these for the +# default grid cell of each pane (the active pane uses window-active-style, the +# others window-style). Captured with -e to record the background colours. +# +# 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 -pe >$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 +} + +new_scene() { + $TMUX2 neww -d "sh -c 'exec sleep 100'" || exit 1 + $TMUX2 selectw -t:\$ || exit 1 + $TMUX2 resizew -x40 -y8 || exit 1 +} + +C="sh -c 'exec sleep 100'" + +$TMUX kill-server 2>/dev/null +$TMUX2 kill-server 2>/dev/null + +$TMUX2 new -d -x40 -y8 "sh -c 'exec sleep 100'" || exit 1 +$TMUX2 set -g status off || exit 1 +$TMUX2 set -g window-size manual || exit 1 + +$TMUX new -d -x40 -y8 || 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 + +# Single pane with a window background style. +new_scene +$TMUX2 setw window-style "bg=blue" || exit 1 +compare window-style-single + +# Split: the active pane uses window-active-style, the other window-style. +new_scene +$TMUX2 setw window-style "bg=blue" || exit 1 +$TMUX2 setw window-active-style "bg=red" || exit 1 +$TMUX2 splitw -h "$C" || exit 1 +$TMUX2 selectp -t0 || exit 1 +compare window-style-active + +exit 0