Skip to content

v0.26.0: kitty transfer-then-place, so zellij graphics mirror

Latest

Choose a tag to compare

@github-actions github-actions released this 06 Aug 12:38

Upgrade note: the browser renderer changed, and the hub serves it — update
the hub to get the new painting.
Nothing else has to move together: the
push wire protocol stays at 2, and session keys, ids and view URLs are
unaffected. A new pusher against an old hub still mirrors its images, just
without stacking order or sub-cell alignment (the old viewer ignores both);
an old pusher against a new hub is unchanged.

shellglass mirrors kitty's transfer-then-place graphics. Until now only a
direct placement at the cursor (a=T) was mirrored, so a multiplexer that
transfers an image once and then places rectangles of it — a=t followed by
a=p, which is how zellij draws graphics — showed nothing in the browser
while the terminal showed the picture. Placements now carry everything the
emitter states about them: the source-pixel rectangle it cut out, the
sub-cell X/Y offset it positioned that rectangle with, and the z it
stacked it at (below the text, or above it, kitty's rule). a=d deletes are
honoured by image id, by cursor cell, and by geometry, so an image the
emitter revokes without repainting the cells under it disappears from the
mirror at the same moment it does locally. Overlapping and floating zellij
panes composite the way they do on the local screen.

kitty placements survive text drawn over them. The mirror used the sixel
model — printing into a cell erased whatever image covered it — so any pane
repaint punched holes in an image, or lost it entirely, while the terminal
still showed it whole. A kitty placement now lives until its emitter deletes
it, the whole display is erased (CSI 2 J), or it scrolls off the screen,
which is exactly when kitty drops one. Sixel and iTerm2 images keep the old
lifetime, because those really are erased by the text.

Images fill the cells they occupy. Every mirrored image used to be
letterboxed inside its cell box, so the tiles of an image split across panes
stopped abutting and the gaps showed as bars through the picture. An image is
now drawn at the exact cell rectangle it claims, snapped to whole device
pixels so neighbouring tiles leave no seam. The trade: when the browser's
cell shape differs from the terminal's, an image is stretched to fit rather
than letterboxed — configure the mirror with the font you run locally and the
two agree.

Several images placed at once all appear. The decode worker kept only the
newest pending job, so a burst that placed distinct images — a sixel or raw
kitty sequence per pane — left all but the last one invisible until something
redrew. Each placement now keeps its own job.

The vendored vt100 recognizes DECRQM (CSI ? $ p) and OSC 4 palette queries
and ignores them, instead of reporting them as escape sequences the mirror
did not handle.