diff --git a/regress/theme-report.sh b/regress/theme-report.sh new file mode 100755 index 000000000..4c42244b4 --- /dev/null +++ b/regress/theme-report.sh @@ -0,0 +1,57 @@ +#!/bin/sh + +# Test that the theme reported to a pane (mode 2031 / DSR 996) follows the +# terminal's reported theme, not a guess from the background colour. +# +# An inner client is attached inside an outer tmux pane. The outer pane has a +# light background, so the outer server answers the inner client's DSR 996 with +# light. The inner server is given a dark window background, so a guess from the +# background colour would say dark. A pane in the inner server then queries DSR +# 996: the answer must be light (2), following the client's reported theme, not +# dark (1) from the background. + +PATH=/bin:/usr/bin +TERM=screen + +[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux) +INNER="$TEST_TMUX -LtestI$$ -f/dev/null" +OUTER="$TEST_TMUX -LtestO$$ -f/dev/null" +$INNER kill-server 2>/dev/null +$OUTER kill-server 2>/dev/null + +TMP=$(mktemp) +trap "rm -f $TMP; $INNER kill-server 2>/dev/null; $OUTER kill-server 2>/dev/null" \ + 0 1 15 + +# Inner server, dark background, keep panes alive across the query respawn. +$INNER new-session -d -x80 -y24 || exit 1 +$INNER set -g remain-on-exit on +$INNER set -g window-style 'bg=black' + +# Outer server with a light background, running the inner client attached so the +# inner client has a real terminal that reports a theme. +$OUTER new-session -d -x80 -y24 || exit 1 +$OUTER set -g window-style 'bg=white' +$OUTER new-window "$INNER attach" || exit 1 +sleep 2 + +# Query DSR 996 from an inner pane and capture the CSI ? 997 ; Ps n reply. +$INNER respawnw -k -t:0 -- sh -c " + exec 2>/dev/null + stty raw -echo + printf '\033[?996n' + dd bs=1 count=9 2>/dev/null | cat -v > $TMP + sleep 1 +" +sleep 2 + +actual=$(cat "$TMP") +expected='^[[?997;2n' # 2 = light (from the terminal), not 1 = dark (from bg) + +if [ "$actual" = "$expected" ]; then + [ -n "$VERBOSE" ] && echo "[PASS] reported terminal theme ($actual)" + exit 0 +fi + +echo "[FAIL] expected '$expected' (light, from terminal), got '$actual'" +exit 1