Files
tmux/regress/side-status-image.sh
2026-10-16 09:02:03 +01:00

79 lines
2.8 KiB
Bash

#!/bin/sh
# Images are drawn and erased in the pane's columns with either side status
# position and with the horizontal status off, above or below the window.
PATH=/bin:/usr/bin
TERM=screen
export TERM
[ -z "$TEST_TMUX" ] && TEST_TMUX=$(readlink -f ../tmux)
python3 -B - "$TEST_TMUX" <<'PY'
import sys
from image_test import image_test, sixel
from image_terminal import Terminal
side = 14
w, h = 16, 32
wire = sixel(w, h, [(100, 0, 0)], [0] * (w * h))
def placed(cx, cy):
return {(cx * 8 + x, cy * 16 + y): (255, 0, 0)
for y in range(h) for x in range(w)}
def side_cells(terminal, xoff, yoff, height):
return {(x, y): terminal.cells.get((x, y))
for y in range(yoff, yoff + height)
for x in range(xoff, xoff + side)}
def check(position, status):
with image_test(sys.argv[1]) as test:
test.run("set-option", "-g", "side-status", position)
test.run("set-option", "-g", "side-status-width", str(side))
if status != "off":
test.run("set-option", "-g", "status", "2")
test.run("set-option", "-g", "status-position", status)
xoff = side if position == "left" else 0
yoff = 2 if status == "top" else 0
height = 16 if status == "off" else 14
side_x = 0 if position == "left" else 40 - side
separator = side - 1 if position == "left" else side_x
client = test.attach()
test.emit(b'\033[3;3H' + wire)
# A full redraw.
test.redraw()
terminal = Terminal()
terminal.feed(client.data)
terminal.check(placed(xoff + 2, yoff + 2))
cells = side_cells(terminal, side_x, yoff, height)
assert all(cells[separator, y] not in (None, ' ')
for y in range(yoff, yoff + height)), \
(position, status, 'side status line not drawn')
# Inserting a line above the image redraws the damaged area.
test.emit(b'\033[3;1H\033[L')
terminal.feed(client.data)
terminal.check(placed(xoff + 2, yoff + 3))
assert side_cells(terminal, side_x, yoff, height) == cells, \
(position, status, 'side status erased by damage')
# Leaving copy mode redraws only the pane.
client.clear()
test.run("copy-mode")
test.wait(lambda: test.run("display-message", "-p",
"#{pane_in_mode}") == "1")
test.run("send-keys", "-X", "cancel")
test.wait(lambda: test.run("display-message", "-p",
"#{pane_in_mode}") == "0")
client.read(0.2)
terminal.feed(client.data)
terminal.check(placed(xoff + 2, yoff + 3))
assert side_cells(terminal, side_x, yoff, height) == cells, \
(position, status, 'side status erased by pane redraw')
for position in ("left", "right"):
for status in ("off", "top", "bottom"):
check(position, status)
PY