diff --git a/regress/format-list-default.sh b/regress/format-list-default.sh new file mode 100644 index 000000000..d562e2446 --- /dev/null +++ b/regress/format-list-default.sh @@ -0,0 +1,66 @@ +#!/bin/sh + +# A list with default alignment is drawn like an explicitly left-aligned list. + +PATH=/bin:/usr/bin +TERM=screen +LC_ALL=C.UTF-8 +export PATH TERM LC_ALL + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +TMUX="$TEST_TMUX -LtestA$$ -f/dev/null" +TMUX2="$TEST_TMUX -LtestB$$ -f/dev/null" + +cleanup() +{ + $TMUX2 kill-server >/dev/null 2>&1 + $TMUX kill-server >/dev/null 2>&1 +} +trap cleanup 0 1 15 + +check() +{ + $TMUX set -g 'status-format[0]' "$1" || exit 1 + i=0 + while [ "$i" -lt 50 ]; do + got=$($TMUX2 capture-pane -p -t outer:0.0 | head -n 1) + [ "$got" = "$2" ] && return + sleep 0.1 + i=$((i + 1)) + done + echo "format '$1': got '$got', expected '$2'" >&2 + exit 1 +} + +$TMUX new-session -d -s inner -x 20 -y 8 'sleep 100' || exit 1 +$TMUX set -g status-position top || exit 1 +$TMUX2 new-session -d -s outer -x 20 -y 8 'sleep 100' || exit 1 +$TMUX2 set -g status off || exit 1 +$TMUX2 respawn-pane -k -t outer:0.0 "$TMUX attach -t inner" || exit 1 +sleep 1 + +check '#[list=on]foo#[nolist]' foo +check 'pre#[list=on]middle#[nolist]post' premiddlepost + +# The focus and trimming markers must also match explicit left alignment. +format='#[list=on]#[list=left-marker]<#[list=right-marker]>' +format=$format'#[list=on]0123456789#[list=focus]FOCUS' +format=$format'#[list=on]abcdefghij#[nolist]' +check "#[align=left]$format" '<3456789FOCUSabcdef>' +check "$format" '<3456789FOCUSabcdef>' + +# Window ranges in the list still dispatch status bindings. +$TMUX set -g mouse on || exit 1 +$TMUX set -g @clicked no || exit 1 +$TMUX bind -n MouseDown1Status set -g @clicked yes || exit 1 +check '#[list=on]#[range=window|0]foo#[norange]#[nolist]' foo +seq=$(printf '\033[<0;2;1M\033[<0;2;1m') +$TMUX2 send-keys -t outer:0.0 -l "$seq" || exit 1 +i=0 +while [ "$i" -lt 50 ]; do + [ "$($TMUX show -gv @clicked)" = yes ] && exit 0 + sleep 0.1 + i=$((i + 1)) +done +echo 'list window range did not receive click' >&2 +exit 1 diff --git a/regress/status-ignore-size.sh b/regress/status-ignore-size.sh new file mode 100644 index 000000000..92950cce9 --- /dev/null +++ b/regress/status-ignore-size.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +# A client attached with ignore-size that is shorter than the status line +# must have it turned off rather than kill the server. +# Each inner client runs in an outer pane of its size. + +PATH=/bin:/usr/bin +TERM=screen +LC_ALL=C.UTF-8 +export PATH TERM LC_ALL + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +TMUX="$TEST_TMUX -LtestA$$ -f/dev/null" +TMUX2="$TEST_TMUX -LtestB$$ -f/dev/null" + +cleanup() +{ + $TMUX2 kill-server >/dev/null 2>&1 + $TMUX kill-server >/dev/null 2>&1 +} +trap cleanup 0 1 15 + +fail() +{ + echo "$*" >&2 + exit 1 +} + +# Attach a normal client of size $1 and an ignore-size client of size $2 +# (WxH) to the inner session. +attach() +{ + $TMUX2 kill-server >/dev/null 2>&1 + $TMUX2 new-session -d -s big -x "${1%x*}" -y "${1#*x}" 'sleep 100' || + exit 1 + $TMUX2 set -g status off || exit 1 + $TMUX2 set -g window-size manual || exit 1 + $TMUX2 new-session -d -s small -x "${2%x*}" -y "${2#*x}" 'sleep 100' || + exit 1 + $TMUX2 respawn-pane -k -t big:0.0 "$TMUX attach -t inner" || exit 1 + sleep 0.5 + $TMUX2 respawn-pane -k -t small:0.0 \ + "$TMUX attach -f ignore-size -t inner" || exit 1 + sleep 1 +} + +$TMUX new-session -d -s inner -x 80 -y 24 'sleep 100' || exit 1 + +# A status line taller than the client. +$TMUX set -g status 5 || exit 1 +attach 80x24 80x4 +$TMUX has-session 2>/dev/null || fail "server exited: status line too tall" + +exit 0 diff --git a/regress/tty-clamp.sh b/regress/tty-clamp.sh new file mode 100644 index 000000000..de806de69 --- /dev/null +++ b/regress/tty-clamp.sh @@ -0,0 +1,100 @@ +#!/bin/sh + +# A client narrower than the window must clamp pane output to its visible +# part, including a pane cut off at both sides after panning. Each inner +# client runs in an outer pane of its size. + +PATH=/bin:/usr/bin +TERM=screen +LC_ALL=C.UTF-8 +export PATH TERM LC_ALL + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +TMUX="$TEST_TMUX -LtestA$$ -f/dev/null" +TMUX2="$TEST_TMUX -LtestB$$ -f/dev/null" + +DIR=$(mktemp -d) || exit 1 +TRIGGER=$DIR/trigger +CAPTURE=$DIR/capture + +cleanup() +{ + $TMUX2 kill-server >/dev/null 2>&1 + $TMUX kill-server >/dev/null 2>&1 + rm -f "$TRIGGER" "$CAPTURE" + rmdir "$DIR" +} +trap cleanup 0 1 15 + +fail() +{ + echo "$*" >&2 + [ -s "$CAPTURE" ] && cat "$CAPTURE" >&2 + exit 1 +} + +# Start the inner server with one pane running $1. +start() +{ + $TMUX kill-server >/dev/null 2>&1 + $TMUX2 kill-server >/dev/null 2>&1 + rm -f "$TRIGGER" + + $TMUX new-session -d -s inner -x 200 -y 50 "$1" || exit 1 + $TMUX set -g status off || exit 1 + $TMUX set -g automatic-rename off || exit 1 + $TMUX set -g window-size largest || exit 1 +} +attach() +{ + $TMUX2 new-session -d -s big -x "${1%x*}" -y "${1#*x}" 'sleep 100' || + exit 1 + $TMUX2 set -g status off || exit 1 + $TMUX2 set -g window-size manual || exit 1 + $TMUX2 new-session -d -s small -x "${2%x*}" -y "${2#*x}" 'sleep 100' || + exit 1 + $TMUX2 respawn-pane -k -t big:0.0 "$TMUX attach -t inner" || exit 1 + sleep 0.5 + $TMUX2 respawn-pane -k -t small:0.0 "$TMUX attach -t inner" || exit 1 + sleep 1 + $TMUX has-session 2>/dev/null || fail "server exited on attach" + SMALL=$($TMUX list-clients -F '#{client_width} #{client_name}' | + sort -n | head -n 1 | cut -d' ' -f2) +} +alive() +{ + $TMUX has-session 2>/dev/null || fail "server exited: $1" +} + +# A clear below the cursor in a pane wider than the small client's view. +start "sh -c 'while [ ! -e $TRIGGER ]; do sleep 0.1; done + printf \"\\033[J\"; exec sleep 100'" +attach 167x49 40x12 +: >"$TRIGGER" +sleep 1 +alive "clear in a pane wider than the client" + +# Output in the right pane of a split, cut off on the right. +start 'sleep 100' +$TMUX split-window -h -d "sh -c 'while [ ! -e $TRIGGER ]; do sleep 0.1; done + printf ab; exec sleep 100'" || exit 1 +attach 120x30 80x30 +: >"$TRIGGER" +sleep 1 +alive "output in a pane cut off on the right" + +# A nonzero pane offset is clipped at both sides of a panned viewport. +start 'sleep 100' +$TMUX split-window -h -d -l 100 "sh -c 'while [ ! -e $TRIGGER ]; do sleep 0.1; done + printf \"%010d\" 0 | sed s/0/0123456789/g; exec sleep 100'" || exit 1 +attach 200x30 40x30 +$TMUX refresh-client -t "$SMALL" -R 120 || exit 1 +sleep 0.5 +: >"$TRIGGER" +sleep 1 +alive "panned pane without side status" +$TMUX2 capture-pane -p -t small:0.0 >"$CAPTURE" || exit 1 +row=$(head -n 1 "$CAPTURE") +[ "$row" = 0123456789012345678901234567890123456789 ] || + fail "panned row is '$row'" +exit 0