Commit Graph
3345 Commits
Author SHA1 Message Date
Aram Drevekenin 12201fdcbd add pr 2026-08-25 10:49:34 +02:00
Aram Drevekenin 92ba1edaae feat: allow opting-out of scroll mode sync 2026-08-25 10:46:46 +02:00
Pilgrim Lyieu 75f9a38715 fix(layout): compose the containing node's cwd into floating panes (#5503) 2026-08-25 09:51:59 +02:00
Aram Drevekenin b0bd3e1e7f fix: fullscreen floating pane editor (#5528)
* fix: fullscreen floating pane editor

* add pr
2026-08-24 20:14:58 +02:00
Aram Drevekenin d8e58e4f14 fix: focus event handling from external in web (#5527)
* fix: focus event handling from external in web

* add pr
2026-08-24 18:05:38 +02:00
Aram Drevekenin 8e627fe643 fix(kitty): apply reported pixel dimensions to existing ptys and clear images of collapsed stack members (#5526)
* fix(kitty): apply reported pixel dimensions to existing ptys and clear images of collapsed stack members

* add pr
2026-08-24 16:11:12 +02:00
Aram Drevekenin ca316433a3 fix: various snotifications issues introduced in 045 (#5523)
* fix: variou snotifications issues introduced in 045

* add pr
2026-08-24 15:21:43 +02:00
Aram Drevekenin 69954b5b6c fix: don't require nested reading of env var to detect nested sessions (#5522)
* fix: don't require nested reading env var to detect nested sessions

* add pr
2026-08-24 10:45:17 +02:00
Aram Drevekenin 3d686e73d5 docs: fix outdated contributing packaging command 2026-08-24 09:31:04 +02:00
Aram Drevekenin bf8d23a4f7 bump development version 2026-08-20 11:12:34 +02:00
Aram Drevekenin faebf2e1e3 fix(ci): force LF checkout for bundled web client assets 2026-08-20 11:09:09 +02:00
Aram Drevekenin 18cb94e1cc Release notes (in the about plugin) for the 0.45 release (#5498)
* vesion 0.45.0 release notes

* update release notes
2026-08-20 09:41:18 +02:00
Aram Drevekenin 070b9c3d1c Fixes before 045 (#5492)
* fix: keep single-pane tabs when serializing, stop the busy-spin on IPC disconnect, and make client-less CLI actions either work or fail loudly

* fix: some tab closing/ordering issues

* test: integration coverage for OSC 133 selection, scroll retention, paste-read opt-in, theme actions, and input fragmentation

* rendering-width regression tests

* fix: forward alt+mouse events into a guest pane the client is descended into

* fix: alt + [] delay in non-kitty

* allow disabling mouse hover tips while keeping the other effects

* more osc133 actions

* fix: base mode race when changing keybinding presets

* fix compilation warnings

* make releases drafts and remove diagnostic logging

* add pr
2026-08-20 08:04:12 +02:00
MsfPablo b961fac6fb Fix typos in comments, docs and error messages (#5490) 2026-08-19 22:18:17 +02:00
Aram Drevekenin 5cb5df5cce chore: remove yanked package versions from lockfile (#5487) 2026-08-18 08:54:02 +02:00
Aram Drevekenin 4156b50233 fix: close session manager if switching sessions (#5486) 2026-08-17 13:37:34 +02:00
Aram Drevekenin 8c5bc6f0b3 Implement host focus gained/lost and missing notifications (#5485)
* implement host focus gained/lost and missing notifications

* add pr
2026-08-17 13:37:17 +02:00
andram 85cc8b1fed fix: put tabs in order of actual position (#5224)
A saved / resurrected session had tabs always in the order of
creation, even if they were subsequently reorder.  This patch fixes
this by sorting the tabs_to_proces in get_layout_metadata() before
they are processed.
2026-08-17 11:17:29 +02:00
Aram Drevekenin 4ccc1cec42 HOTFIX: rustfmt 2026-08-17 11:16:48 +02:00
Roland Huss f7c59bbdd0 fix(plugin): prevent duplicate WASM instances on startup (#5178)
When AddClient arrives while background plugins are already loaded,
the add_client loop now checks if a (plugin_id, client_id) pair
already exists in the plugin map before creating a new instance.
This eliminates the race condition where load_background_plugin and
add_client both create instances for the same plugin.

Fixes #5177
2026-08-17 10:53:57 +02:00
yamam 25bd2de8ad fix(grid): preserve background when ECH erases wide chars (#5180)
When ECH replaces a wide character with spaces, the trailing padding cell
must keep the same style as the replacement cell. Otherwise, wide
characters can appear split in half, with one cell using the pane
background and the other falling back to the terminal default background.

Preserve the background style for the padding cell.
2026-08-17 10:34:22 +02:00
Aram Drevekenin 98a0837077 feat: allow opting-in to reading paste buffer (default false) (#5472)
* feat: allow opting-in to reading paste buffer (default false)

* add pr
2026-08-13 10:19:13 +02:00
Teddy Tennant a9db5664be fix(clipboard): don't kill copy_command processes that own the selection (#5458)
* fix(clipboard): don't kill copy_command processes that own the selection

The reaping added in #4298 kills the copy_command process if it is still
running one second after the copied text was written to its stdin. X11 and
Wayland clipboard helpers are supposed to keep running: they own the
selection and serve it to whoever pastes it, so killing them empties the
clipboard.

Wait for the process instead of polling it with a deadline. Commands that
exit on their own are still reaped as soon as they do, so the zombies #4298
was about don't come back.

* docs(changelog): add PR
2026-08-12 12:26:33 +02:00
Valentyn KitandAram Drevekenin c428ae93b9 fix(scroll): keep scroll position when leaving scroll mode (#5299)
* fix(scroll): keep scroll position when leaving scroll mode

Leaving Scroll mode for Normal or Locked snapped the active pane back to
the bottom. Switching panes requires leaving Scroll mode, so that reset
is what prevented keeping a pane scrolled while working in another.

It is also redundant: the scroll keymap already binds an explicit
ScrollToBottom on exit, so users who want to follow live output keep it,
while a plain exit now preserves the scroll position. Output is still
buffered while a pane is scrolled and replayed when scroll is cleared,
so the buffer-overwrite protection is unaffected.

* fix(scroll): re-enter scroll mode when focusing a scrolled pane

Focusing a scrolled pane now switches the client into Scroll mode, and
focusing an unscrolled one returns it to Normal. Only the Normal<->Scroll
pair is synced, so a client in another mode is left alone.

* fix(scroll): re-enter scroll mode on focus-last-pane too

Cover the FocusLastPane action added in #4241 with the same focus-to-scroll
sync as the other focus moves, so landing on a scrolled pane via focus-last
behaves like landing on it via MoveFocus.

* fix(scroll): sync the default mode with scroll, cover mouse focus

Follow imsnif's review on #5299. The focus sync now switches between Scroll
and the configured default mode read from default_mode_info instead of a
hardcoded Normal, so unlock-first sessions (default Locked) return to Locked
rather than Normal. It also fires on mouse focus changes (click, click-through,
focus-follows-mouse) by hooking the existing active-pane diff in
handle_mouse_event, not only keyboard focus moves.

Tests parameterize the focus-sync assertion over the default mode (Normal and
Locked) and add a mouse-click variant.

* cover some more cases

* sync also on mouse scroll

* rustfmt

---------

Co-authored-by: Aram Drevekenin <aram@poor.dev>
2026-08-11 15:51:55 +02:00
floor3dandEvan Defloor dc6d8209e3 change "iguanadon" to "iguanodon" (#5395)
Co-authored-by: Evan Defloor <evan@ethicalhack.ing>
2026-08-11 09:39:27 +02:00
6343be42c6 fix(stack): scrollback truncation when adding a stacked pane in list mode (#5403)
When `stacked_pane_list` is on and the user adds a stacked pane, the classic
in-grid stack path first collapses the pre-existing pane to `Fixed(1)` and
then `focus_pane` fires `reapply_pane_frames`, which sends `resize_pty!` to
the collapsed pane at 1 row. The stack-list groupify pass (invoked later
during `render`) then extracts the pane to `suppressed_panes` and resizes it
back to the visible size, issuing a second `resize_pty!`. The two rapid
WINCH events cause the shell (nushell, pwsh, bash, …) inside the pane to
redraw its prompt twice, overwriting previously-visible rows of output.
The grid data is preserved in `lines_above`, but the visible viewport ends
up mostly blank — the user sees only the pre-existing rows that had already
scrolled off, giving the impression of a truncated buffer.

Sync stacked-pane-list mode right after the classic mutation, before
`focus_pane`. `groupify_all` moves the collapsed member into
`suppressed_panes` first, so the subsequent `reapply_pane_frames` (which
only iterates `tiled_panes`) never sends a 1-row `resize_pty!` to that
shell. The pane is then resized once to the visible size via
`resize_stack_list_hidden_members`.

Regression test asserts that after adding a stacked pane in this mode, the
pre-existing pane is in `suppressed_panes` and the new visible member has
non-fixed row dimensions — proving groupify happened before any classic
`reapply_pane_frames` step.

Co-authored-by: divens <divens.dev@gmail.com>
Co-authored-by: Aram Drevekenin <aram@poor.dev>
2026-08-11 09:10:54 +02:00
ZykinoandZykino 30c9d2fcb4 Add missings sugar functions NestedListItem::*color* in plugin API (#5412)
Co-authored-by: Zykino <3809938+Zykino@users.noreply.github.com>
2026-08-11 08:43:48 +02:00
Fabien CulpoandAram Drevekenin f42ca3c79c feat: select OSC 133 command output on triple click (#5460)
* feat: select OSC 133 command output on triple click

* performance: avoid scanning the whole buffer

* make osc 133 command selection and word separators configurable

* add pr

---------

Co-authored-by: Aram Drevekenin <aram@poor.dev>
2026-08-10 17:28:50 +02:00
ZrjaKandAram Drevekenin 1d1d5c1101 fix(input): realign raw-byte buffer with the keyboard parser to stop stale bytes eating keystrokes (#5446)
* fix(input): realign raw-byte buffer with the keyboard parser to stop stale bytes eating keystrokes

After a paste (e.g. via a clipboard manager like maccy), zellij's
current_buffer can hold up to a few stale bytes that termwiz's
InputParser has already consumed into events. Those stale bytes are then
attached to the raw payload of subsequent KeyEvent messages, desyncing
each keystroke from the bytes that produced it: keys go missing, come
out garbled, or drop into vi command mode.

The root cause is that parse_with_consumed reports consumption relative
to its internal self.buf, while stdin_handler drains a separately
accumulated current_buffer. The two can drift apart whenever a read
leaves a partial sequence that the parser holds under maybe_more.

Reconcile the two after every parse: trim current_buffer to the
parser's buffered length, so no byte the parser has already decoded is
ever forwarded with a later key event. Add InputParser::buffered_len to
the vendored termwiz for that purpose.

* fix: remove parsed bytes from front rather than back

* rustfmt

---------

Co-authored-by: Aram Drevekenin <aram@poor.dev>
2026-08-10 14:17:09 +02:00
Aram Drevekenin 5254e4fc1d Fix tab close size (#5444)
* fix: properly resize tabs when closing another tab

* rustfmt
2026-08-05 18:54:59 +02:00
Aram Drevekenin 3239d37b40 Native web mobile UI (#5441)
* initial chrome

* mobile state

* feat(mobile-web): implement browser→server actions (fit toggle, single-pane fullscreen, pane/tab focus) with fullscreen-truth reconciliation

* panning

* remove mobile plugin

* fix first load race

* improve web handshake

* rustfmt

* cleanups

* moar cleanups

* add bundle asset check to ci

* fix(mobile-web): tab-scope co-presence, yield single-pane to desktop clients, fix render-mode desync

* make mobile use no-ui fullscreen

* client side welcome screen for mobile

* attach web clients to first tab on tiles surface

* fix: opening new pane in mobile single mode no longer exits mobile single mode

* mobile chrome light theme support

* fix server races and flaky tests

* rustfmt

* fix flakes

* add pr
2026-08-05 15:32:53 +02:00
Aram Drevekenin a7259350a8 fix: resize race when breaking a pane to a new tab (#5434)
* fix: resize race when breaking a pane to a new tab

* style: rustfmt
2026-08-03 15:35:02 +02:00
Aram Drevekenin 34e7491548 fix: allow building without bundled plugin assets (#5433)
* fix: allow building without bundled plugin assets

* add pr
2026-08-03 13:54:55 +02:00
Aram Drevekenin c3c7e65965 fix(sixel): only advertise capability if host terminal supports it (#5432)
* fix(sixel): only advertize capability if host terminal supports it

* add pr
2026-08-03 09:58:42 +02:00
Aram Drevekenin 0e6e440402 Support the Kitty Image Protocol (#5428)
* initial implementation - kinda working

* tests and fixes

* fix bounds

* tests and compatibility fixes

* fix: cursor scroll, clears, deletes, key tolerance, and host id range

* fix: keep images alive across resize, relayout and history scroll

* anchor to lines, not pixels

* fix image/text alignments

* config to allow disabling

* fix pinned pane issue

* never let host graphics replies reach the keyboard parser

* fix nested session

* properly handle fullscreening a pane

* rustfmt

* cleanup of ignored test

* add pr
2026-07-31 19:19:49 +02:00
Aram Drevekenin 0ed2edea0c fix(build): remove manpage, honor CARGO_TARGET_DIR, add cargo argument passthrough, remove clippy (#5426)
* fix(build): remove manpage, honor CARGO_TARGET_DIR, add cargo argument passthrough, remove clippy

* add pr
2026-07-30 16:50:12 +02:00
Aram Drevekenin 19befc2118 Even more debian upgrades (#5424)
* Upgrade axum-extra 0.12, axum-server 0.8, rcgen 0.14

* rustfmt
2026-07-30 10:43:00 +02:00
Aram Drevekenin cab75c58fe More dependency upgrades for debian (#5421)
* upgrade insta, rand, sha2, strum, thiserror, tokio-tungstenite, toml, which; drop unused semver and typetag

* upgrade sysinfo to 0.39.5, bump toolchain (msrv) to 1.95.0

* remote legacy yaml config converter and thus drop serde_yaml

* upgrade unicode-width to 0.2.2

* fix(tests): run ipc roundtrip test on a larger stack
2026-07-29 17:08:08 +02:00
Aram Drevekenin 9969ed10b2 Dep upgrades for debian (#5420)
* chore(deps): upgrade base64 0.22, colored 3.1, crossterm 0.29, dialoguer 0.11, directories 6.0, highway 1.2, prost 0.12.6, strip-ansi-escapes 0.2.1, suggest 0.5.1

* chore(deps): upgrade miette 7.6, nix 0.30, notify 8.2, notify-debouncer-full 0.5

* vte 0.15

* clap 4.6

* workspaceify plugin deps

* don't send empty fs watch events
2026-07-28 12:05:38 +02:00
Aram Drevekenin ea07e2d5b6 Nested session handling (#5417)
* fix: theme query and updated pixel dimensions

* add no-ui-fullscreen key/action/capability

* protocol core

* integration test harness

* fix integration tests

* fix flaky tests

* nested ui (dimming) and directional focus initial implementation

* integration tests for nested ui dimming and directional focus

* initial full screen nesteed implementation

* fix: keep hidden floating panes hidden across nested no-ui fullscreen

* fix integration tests

* no ui fullscreen integration tests

* hardening behavior/tests

* fix(nested): re-derive descend/dim on host tab switch and new-tab so clicking dimmed chrome ascends

* initial modal implementation

* initial ui improvements

* fix integration tests

* improve nested selection ui

* nested session modal refactoring and tests

* improve integration test speed somewhat

* some ui adjustments

* simplify full/auto nested session handling

* hints in compact-bar

* guest stdin leak fix

* allow floating panes to be fullscreen

* make nested session handling configurable

* protocol reannounce

* refactor: naming confusion

* improve ux somewhat

* rustfmt

* merge fixes

* improve integration test rate limiting (fix ci)

* add pr
2026-07-27 18:24:37 +02:00
Fabio ValentiniandAram Drevekenin d0f829f3fd Switch from the unmaintained daemonize crate to a maintained fork (#4512)
* Switch from the unmaintained daemonize crate to a maintained fork

c.f. https://rustsec.org/advisories/RUSTSEC-2025-0069.html

* add pr

---------

Co-authored-by: Aram Drevekenin <aram@poor.dev>
2026-07-27 13:08:50 +02:00
Aram Drevekenin 828a1508c6 chore: replace unmaintained cassowary with maintained fork kasuari (#5416)
* chore: replace unmaintained cassowary with maintained fork kasuari

* add pr
2026-07-27 12:26:02 +02:00
divens 812ad861bc fix(windows): prefer PATHEXT variants over bare filename in resolver (#5364)
`find_executable` used to short-circuit on the first exists()-and-is_file
match and only consult PATHEXT if no bare file was present. That returned
the wrong file for tools whose Windows installer ships both a Unix-style
launcher and a `.bat` alongside it. The reported case is Composer, whose
setup places bare `composer` (a Unix launcher, invalid PE on Windows) next
to `composer.bat`. The bare file was resolved and handed to CreateProcessW,
which rejected it with ERROR_BAD_EXE_FORMAT.

On Windows, when the candidate has no user-supplied extension, walk PATHEXT
first and only fall back to the bare match if nothing matches. This mirrors
cmd.exe's and powershell's resolution.
2026-07-21 12:18:04 +02:00
Aram Drevekenin 68362d4cf0 Stacked resize list fixes (#5379)
* fix: mouse scroll resize stack issue

* regression test

* cleanups
2026-07-18 11:15:17 +02:00
Aram Drevekenin 3039188867 docs(changelog): stdin parse fix 2026-07-17 15:25:57 +02:00
Pierre Kisters d9682a2eef fix: input spam when moving mouse while typing by splitting the input bytes into their respective events (#5323) 2026-07-17 15:24:52 +02:00
Aram Drevekenin 93e700e066 docs(changelog): pane rename clear fix 2026-07-17 15:11:12 +02:00
miro 4bbafdf58d fix(panes): clear custom name when renaming (#5369) 2026-07-17 15:10:32 +02:00
Aram Drevekenin 1889819b52 fix(grid): properly pad rows in CUF (#5377)
* fix(grid): properly pad rows in CUF

* add pr
2026-07-17 12:31:19 +02:00
Mofan552andAram Drevekenin 6b967baacc fix(grid): scroll the region when a line wraps at its bottom margin (#5357)
* fix(grid): scroll the region when a line wraps at its bottom margin

Wrapping at the bottom margin of a DECSTBM scroll region used to move
the cursor below the region instead of scrolling it, after which no
subsequent output could scroll through the region (or reach scrollback
for top-anchored regions) anymore.

line_wrap() now mirrors add_canonical_line(): the region scrolls up one
line, the cursor stays on its bottom row, and the new row is a wrapped
(non-canonical) row. Top-anchored partial regions preserve the
scrolled-off line in scrollback (#4941), other regions discard it, and
the alternate screen never transfers.

* docs(changelog): line wrap scroll region fix

* fix(grid): keep hyperlink tracking aligned when wrap scrolls an inner region

When a line wraps at the bottom of a scroll region that does not start
at the top of the screen, the region's rows shift up but the hyperlink
tracker's recorded positions did not, so a URL wrapping there lost its
clickable anchors. Offset the tracked positions for the rows inside the
region, the way the full-screen and top-anchored paths already do via
offset_cursor_lines.

* refactor shared logic and adjust changelog

---------

Co-authored-by: Aram Drevekenin <aram@poor.dev>
2026-07-17 11:06:57 +02:00