Repository navigation
Releases: thebanri/limoni
Releases · thebanri/limoni
Release list
v0.15.0
Added
- Mouse modes:
WithMouseMode/WithProgramMouseMode/
Terminal.SetMouseModewithMouseMotion(every move, the default),
MouseDrag(moves with a button held, DECSET 1002) andMouseClicks
(clicks and the wheel, 1000). Fewer reports are less input to read, and
less noise in the shell if a crash leaves reporting on. Checked in
xterm.js throughlimoni serveand headless Chromium: ten hover moves,
a click and a five-step drag arrive as 10/1/5, 0/1/5 and 0/1/0 events.
Asked for by residual (#84).
Changed
- Turning the mouse off, and every teardown, now clears modes 1000 and 1002
as well as 1003.
v0.14.0
Added
uitest:Expect(...).ToHaveStyle(style)checks the cells a widget is
drawn with, so a test can tell a focus the tree reports from one the user
can see. In process only (Run,Program); the socket sends text. Asked
for by residual (#84).Keybinding.Alt, shown asAlt+in the command palette.
Changed
KeybindingManagermatches Alt as it matches Ctrl: a binding without
Altno longer fires on Alt+key. An application can keep the Alt layer
for itself (a multiplexer in front of its guests).- Focus always shows. Without a focused style of their own, a focused
Checkbox,RadioButton,SelectandSplitPanedivider are drawn in
reverse bold, asButtonwas;List,Table,TreeViewand
VirtualDataViewmark their selected row that way andSliderits thumb.
Before, all of them looked the same with the focus as without it.
TestFocusAlwaysShows.
v0.13.2
v0.13.1
Fixed
- Dialogs and opaque blocks no longer send a solid picture behind themselves
with Sixel or iTerm2. Those pictures live in the terminal's cells, so the
dialog's own cells cover them; the solid picture was encoded again every
frame a dialog animated, and Windows Terminal drew it over the dialog's
text. Kitty, whose pictures float over the text, keeps it.
TestSixelDialogSendsNoBackdropPicture. - A kitty picture under a modal or layer with no solid picture of its own (a
dialog notOpaque) is no longer placed: it floated over the dialog's text.
The overlay already left such pictures out.
TestKittyPictureUnderAModalWithoutBackdrop.
v0.13.0
Added
KeyInsertandKeyF1…KeyF12re-exported from the root package, so key
bindings no longer needcore/driverfor them (#84, @Merith-TK).backdrop-shell: a program in~/.config/limoni/scenesis a scene by name,
listed with the built-in ones:fireflies.pythere is-scene fireflies, a
folder holding a program of its own name (cosmos/cosmos) is-scene cosmos.backdrop-shell: live regions. A program marks rows it printed with
OSC 7799 ; live ; id ; width ; heightand streams frames for them over the
wrapper's socket ($LIMONI_BACKDROP_SOCKET, its user's alone), so they keep
moving after it exits and scroll with the output — a fetch's logo spins on
while you type. Left clicks on them are passed back. The program is stopped
while its rows are out of sight or covered, the rows are found again after a
resize, and it ends when they leave the history. The escape sequence starts
nothing by itself, so printing a file cannot run anything.backdrop-shell: links (OSC 8) a program prints reach the terminal, and
Ctrl+click opens a web link in the browser — the terminal cannot, since the
wrapper has the mouse.Frame.Text(x, y, s, style)draws text cut off at the frame's edges and
returns the column after it, so differently styled runs follow one another;
Frame.TextFit(x, y, w, s, style)draws it in exactlywcolumns, cut with
…or padded. Both cut by grapheme cluster and allocate nothing. Until now
a line of text meant aLabelwidget and aRect, clipped by hand — the
helpers residual wrote for its port.- Pictures at full resolution in terminals with no picture protocol of their
own, such as Alacritty:graphics.ProtocolOverlayshows them in windows
laid over the terminal's X11 window (Xwayland is one), written against the
X11 protocol directly, with no library or desktop behind it. They move,
hide and show with the terminal under any window manager, follow resizes
and font changes, and leave out what a modal covers.LIMONI_GRAPHICS=overlay
asks for it;WithOverlayPictures()/WithProgramOverlayPictures()/
Terminal.SetOverlayPicturesturn half blocks into it once the capability
probe found no protocol. Where no overlay can be opened (Windows, macOS,
SSH, Wayland-only terminals, inline mode) it is half blocks. graphics.DecodeGIFandAnimation.Frame(elapsed): a GIF's frames composed
as a browser shows them, for anImagewidget;Framedoes not allocate.graphics.ContainSize: the size a picture takes fitted into a box.apps/termimg: runs a shell or a command so the sixel, kitty graphics and
iTerm2 pictures it prints show in terminals with none of them —chafa,
mpv --vo=kitty,kitten icat(animations and Unicode placeholders
included) — at full resolution through the overlay. Its own module.
Fixed
-
Cells under an overlay picture keep the background under them; the window
takes the picture's shape, and what it leaves showed the terminal's default
background. -
backdrop-shell -opacity 0.3(or any flags alone) typed inside a running
backdrop-shell opened a plain nested shell and changed nothing. It now says
what to run instead —backdrop-shell opacity 0.3, orbackdrop-shell enablewith the same flags — and exits.
v0.12.1
terminal, graphics: Sixel pictures after the cells, sized, with exact…
pikap v0.2.0
v0.12.0
Breaking
- A
Programdelivers each command's result toUpdateas soon as the
command returns. Results used to be held back into the order the commands
started, so a command that waits — a timer, a request, a stream — delayed
every result after it: a poll's one-second wait held a 30 fps animation to a
few frames a second (found building plakci, a Spotify client). A model that
needs one result after another returns the second command from theUpdate
that handles the first.TestProgramDeliversResultsAsTheyFinishfails on
the old loop.
Fixed
- Sixel pictures of more than 256 colours keep the picture's colours, and
encode about seven times faster. The palette was the first 256 colours met
from the top, so the rest of the picture was matched against the colours
of its first rows (a blue half came out red), and each other colour was
searched for through the whole palette: most of a 31 ms encode of a
220×220 record. The palette is now the 256 most common colours at five bits
a channel, other colours are looked up once for each five-bit colour, and a
4×4 ordered dither, fixed to the pixels, breaks up the bands: 4.6–5.3 ms,
and 14 allocations instead of 36,000. A picture of at most 256 colours is
encoded exactly, as before. - A click from
uitestor the automation socket (and solimoni-mcp) is a
press and then a release, as a terminal sends it. It was a press alone, so a
model that acts on the release — a slider, a drag — never finished one under
test or under an agent, and a model that counts every mouse event as a click
passed tests a real terminal would fail.
Changed
- A kitty picture smaller than its cells is sent at its own resolution, in
the cells' shape, and kitty scales it; it used to be scaled up first, which
made the PNG larger and slower to encode for no sharper picture
(graphics.KittyCanvasgives the size). Kitty PNGs are also compressed at
BestSpeed, as a moving picture is sent many times a second: a 240-pixel
record in 24×12 cells encodes in 1.2 ms instead of 2.6, a little larger on
the wire. AClipof such a picture is cut in the picture's own pixels. - An emoji joined from several code points — a skin tone, a ZWJ family —
no longer leaves a square behind on a terminal that draws code points one
by one (Alacritty 0.17). It drew the tone as a second picture, four columns
where the buffer gave two; the re-anchored cursor kept the row in place,
but the square stayed over cells the diff did not rewrite. Such a terminal
is now sent the emoji's first code point, padded to the cluster's width
(cell.ClusterFallback,cell.AppendDegraded); flags, keycaps, accents
and VS16 go as they are. Terminals that measure clusters are unaffected,
and the diff's speed is unchanged. ResizeImageContaincopies a picture that already fits instead of
resampling it to its own size: letterboxing a 240-pixel record into
240×252 for kitty went from 2.3 ms to 1.5.
Full changelog: v0.11.1...v0.12.0
v0.11.1
Fixed
- A paste longer than one read stays a paste.
ParseEventdropped the
start marker of a paste whose end had not arrived yet, and the pasted text
came through as key presses — shortcuts included. It now waits for the
end marker, asParseBracketedPastedid. Both event loops are tested with
a paste in three reads and its end marker split. - On Windows, Ctrl+Z no longer ends all input. Go reads the console as text
and returns a Ctrl+Z at the start of a read asio.EOF; the console
reader took that for the end and stopped, leaving the application running
with no keyboard or mouse. - In 16 colours, greys and near greys map to black, dark grey, light grey or
white by luminance. By distance alone the slate surfaces of dark themes
(49,50,68) came out blue.