Skip to content

Releases: thebanri/limoni

v0.15.0

Choose a tag to compare

@thebanri thebanri released this 20 Oct 02:07

Added

  • Mouse modes: WithMouseMode / WithProgramMouseMode /
    Terminal.SetMouseMode with MouseMotion (every move, the default),
    MouseDrag (moves with a button held, DECSET 1002) and MouseClicks
    (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 through limoni serve and 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

Choose a tag to compare

@thebanri thebanri released this 20 Oct 01:47

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 as Alt+ in the command palette.

Changed

  • KeybindingManager matches Alt as it matches Ctrl: a binding without
    Alt no 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, Select and SplitPane divider are drawn in
    reverse bold, as Button was; List, Table, TreeView and
    VirtualDataView mark their selected row that way and Slider its thumb.
    Before, all of them looked the same with the focus as without it.
    TestFocusAlwaysShows.

v0.13.2

Choose a tag to compare

@thebanri thebanri released this 19 Oct 19:59

Fixed

  • A kitty picture under a modal or layer is not placed even when the dialog
    has a solid picture of its own: kitty 0.49 showed the picture through it,
    dimmed. TestKittyPictureUnderAModalIsNotPlaced.

v0.13.1

Choose a tag to compare

@thebanri thebanri released this 19 Oct 19:47

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 not Opaque) is no longer placed: it floated over the dialog's text.
    The overlay already left such pictures out.
    TestKittyPictureUnderAModalWithoutBackdrop.

v0.13.0

Choose a tag to compare

@thebanri thebanri released this 19 Oct 17:12

Added

  • KeyInsert and KeyF1…KeyF12 re-exported from the root package, so key
    bindings no longer need core/driver for them (#84, @Merith-TK).
  • backdrop-shell: a program in ~/.config/limoni/scenes is a scene by name,
    listed with the built-in ones: fireflies.py there 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 ; height and 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 exactly w columns, cut with
    … or padded. Both cut by grapheme cluster and allocate nothing. Until now
    a line of text meant a Label widget and a Rect, 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.ProtocolOverlay shows 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.SetOverlayPictures turn 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.DecodeGIF and Animation.Frame(elapsed): a GIF's frames composed
    as a browser shows them, for an Image widget; Frame does 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, or backdrop-shell enable with the same flags — and exits.

v0.12.1

Choose a tag to compare

@github-actions github-actions released this 14 Oct 14:35
terminal, graphics: Sixel pictures after the cells, sized, with exact…

pikap v0.2.0

Choose a tag to compare

@github-actions github-actions released this 14 Oct 14:35

v0.12.0

Choose a tag to compare

@thebanri thebanri released this 05 Oct 16:37

Breaking

  • A Program delivers each command's result to Update as 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 the Update
    that handles the first. TestProgramDeliversResultsAsTheyFinish fails 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 uitest or the automation socket (and so limoni-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.KittyCanvas gives 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. A Clip of 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.
  • ResizeImageContain copies 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

Choose a tag to compare

@thebanri thebanri released this 05 Oct 03:13

Fixed

  • A paste longer than one read stays a paste. ParseEvent dropped 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, as ParseBracketedPaste did. 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 as io.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.

pikap v0.1.0

Choose a tag to compare

@github-actions github-actions released this 05 Oct 17:05