aboutsummaryrefslogtreecommitdiffstats
path: root/zellij-server/src (follow)
Commit message (Collapse)AuthorAge
...
* Dep upgrades for debian (#5420)Aram Drevekenin2026-07-28
| | | | | | | | | | | | | * 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
* Nested session handling (#5417)Aram Drevekenin2026-07-27
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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
* chore: replace unmaintained cassowary with maintained fork kasuari (#5416)Aram Drevekenin2026-07-27
| | | | | * chore: replace unmaintained cassowary with maintained fork kasuari * add pr
* fix(windows): prefer PATHEXT variants over bare filename in resolver (#5364)divens2026-07-21
| | | | | | | | | | | | | `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.
* Stacked resize list fixes (#5379)Aram Drevekenin2026-07-18
| | | | | | | * fix: mouse scroll resize stack issue * regression test * cleanups
* fix(panes): clear custom name when renaming (#5369)miro2026-07-17
|
* fix(grid): properly pad rows in CUF (#5377)Aram Drevekenin2026-07-17
| | | | | * fix(grid): properly pad rows in CUF * add pr
* fix(grid): scroll the region when a line wraps at its bottom margin (#5357)Mofan5522026-07-17
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * 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>
* feat(config): add mouse_scroll_resize option (#5283)WeZZard2026-07-17
|
* Allow creating panes/tabs from the CLI without changing focus to them (#5346)Aram Drevekenin2026-07-09
| | | | | | | | | | | * feat: allow opening panes and tabs from the cli without focusing them * rustfmt * fix flake * rustfmt * add pr
* fix: focus last pane correctness issues (#5344)Aram Drevekenin2026-07-09
| | | | | | | * fix: correctness issues with focus-last-pane * rustfmt * add pr
* perf: foreground pane-command discovery without scanning the whole process ↵Chris Frost2026-07-08
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | table (#5324) * build(deps): bump sysinfo to 0.37 for scan-free partial process refresh Bump it to pull in sysinfo 0.37's change "Linux: greatly improve partial processes retrieval", so that refreshing a specific set of pids (ProcessesToUpdate::Some) no longer walks the entire /proc tree. This makes the existing get_cwd/get_cwds polling O(panes) instead of O(host processes) and unblocks doing the same for foreground-command discovery. * perf: discover foreground pane commands w/o scanning all processes Foreground command discovery was reading information about every process on the host, on each pane/tab creation and on every periodic poll. On hosts with many processes (eg, 50k) this stalled pane creation for tens of seconds and overran the action-completion timeout. Replace that O(host processes) lookup with an O(panes) lookup. Instead of looking up the parent pid of every process to find the child, get the foreground process-group leader's pid from a call to tcgetpgrp on the pane's controlling terminal. When the leader is the shell itself (idle prompt or a command sharing the shell's group without job control) the pane is omitted and the caller falls back to the shell command, matching prior behavior; with job control on it now reports the true foreground job instead of possibly a background one. This changes the paths for Linux, macOS, and BSD. It leaves Windows unchanged. * refactor(os_input): extract apply_post_command_hook helper The command -> run_command_hook -> trim/split pipeline was duplicated between the #[cfg(not(unix))] get_all_cmds_by_ppid and the unix get_foreground_cmds. Extract a single apply_post_command_hook helper and call it from both sites, routing the hook-failure fallback through the project's non_fatal() logging idiom (CONTRIBUTING.md "Logging errors") instead of log::error!. * review: simplify tcgetpgrp locking, trim comments, drop changelog entries - Remove the lock-drop dance and its TOCTOU caveat from tcgetpgrp, to make it mirror tcdrain - Prune AI comments - Remove CHANGELOG entries
* Stacked list fixes (#5342)Aram Drevekenin2026-07-08
| | | | | | | | | * clear padding line * better stack ui * fix tests * add pr
* fix(windows): preserve backslashes when quoting spawned-process arguments ↵divens2026-07-07
| | | | | | | | | | | | | | | (#5336) `build_command_line` in the ConPTY backend accumulated runs of backslashes inside a quoted argument but never emitted them before non-quote characters, so `C:\Users\me\Folder With Space\README.md` reached the child as `C:UsersmeFolder With SpaceREADME.md`. Only args routed through the quoted branch were affected, which matches the reported `zellij edit` failure on Windows backslash paths containing spaces. Rewrite the loop to follow `CommandLineToArgvW` rules exactly: n backslashes not followed by a quote emit literally, 2n+1 escape an embedded quote, and trailing backslashes are doubled before the closing quote. Add unit tests for each case, including a regression test for the issue #5293 repro.
* UI tweaks (#5337)Aram Drevekenin2026-07-06
| | | | | | | | | | | | | | | | | | | * remove dimmed * clearer list ui * fix integration tests * rustfmt * move hint to tab-bar * redesign stack list * rustfmt * fix e2e * add pr
* Stacked lists (#5331)Aram Drevekenin2026-07-04
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * initial implementation * improve ui * fix: stacked resize interaction * title list boundaries fix * fix BEL * mouse parity * float/embed + bulk-op features * fix in-place bug * improve ui * config live reload * improve ui * fix issues, add exit status * fix for serialization * fix tests * integration tests * comments * refactor: duplicate title logic * refactor: consolidate logic * fix: flaky tests * add a stacked swap layout * rustfmt * fix e2e * add pr
* chore: upgrade wasmi to 1.1.0 (#5319)Aram Drevekenin2026-06-30
| | | | | | | * chore: upgrade wasmi to 1.1.0 * fix: race when opening build-in editor (flaky test fix) * add pr
* Title frames (#5318)Aram Drevekenin2026-06-29
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * initial implementation * improve single line title design * hint text plugin infra * add proto regen task * display alt text in status bar * don't display text with full frames * style alt hover text * fix + style control own pane hover * make multiplayer indications responsive * update snapshots * plugin api * single pane as tab * better scroll styling * fix tests * tab-bar plus hover * plugin surface tests * integration tests * adjust all integration tests * reduce hover noise * add pane id to in place * more integration tests * style: rustfmt * update plugin assets * update assets and snapshots * add pr
* feat: reload config on theme change (#5135)Hannah Fluch2026-06-26
| | | | | | | | | | | * feat: reload config on theme change * fix: small TOCTOU window and some logging * add pr --------- Co-authored-by: Aram Drevekenin <aram@poor.dev>
* feat(panes): `FocusLastPane` action (#4241)DawidPietrykowski2026-06-25
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * feat(panes): focus last pane (#4142) * add tests * add client id parameter to `add_floating_pane` * add action for floating panes * add tests for floating panes * add keybinds to configs * rebase fixes * simplify focus logic when adding stacked pane * formatting fix * formatting fix 2 * fix: make sure expanding pane always focuses it for all clients in stack * add pr * fix rebase --------- Co-authored-by: Aram Drevekenin <aram@poor.dev>
* chore: new test infra (#5269)Aram Drevekenin2026-06-16
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * initial implementation * refactoring and cleanups * port basic e2e tests * fix tab rotation * migrate client and mouse tests * migrate the rest of the tests * remove old e2e tests * rustfmt * add e2e note * fix stale test * fix: cross platform locking/cleanup * fix: change mode race discovered by tests * rustfmt * fix: attach/detach race in tests * fix plugin test assertion * add pr
* Mobile layout (#5241)Aram Drevekenin2026-06-10
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * phase 2+3 * initial mobile plugin (phases 4 + 5 + 6) * some bugfixes * implement stage 7 * mobile interface improvements * improve mobile pane/tab picker * more ui improvements and fixes * various mobile fixes * some mobile fixes * mobile keyboard triggering fix * some cleanups * initial plugin keyboard implementation * improve keyboard hit zones * improve keyboard * pinch resize * pinching fixes * implement scrolling + panning * initial keyboard resizing * fix: mobile first render issues * keyboard responsiveness * fix some issues with the keyboard * implement fit * fix mobile scrolling * add tilde cell to compact * improve mobile keyboard * fix starting mobile terminal font to natural keyboard size * fix mobile resize blank screen flash * shadow focus for mobile * more keyboard fixes * improve mobile status bar * fix: render plugins to mobile clients * allow opening new panes/tabs from the mobile plugin * allow configuring * fix dot slash * improve mobile native soft keyboard interaction * switch to native keyboard - initial implementation * dirty hacks, but phone keyboard works now * adjust keyboard help strip * fix cursor in mobile * fix keyboard and help line * rename keyboard to modifier bar * allow starting new session * make clicking session name bring us to new session menu * allow switching to desktop from the mobile ui * mobile welcome screen initial implementation * mobile welcome screen fixes * various welcome screen fixes * more mobile fixes * moar mobile fixes * mobile ui redesign * fix: swallowed backspace bug * switch session screen improvement * touch up some interfaces * refactor: move mobile state to own struct * refactor: move fit resizing to the server * remove dead flash code * some cleanups * refactor: clear fit on close * refactor: improve fit api * refactor: pane sync functions * refactor: mouse * refactor: break into modules * some cleanups for the sessions screen * fix scrolling and other stuff * refactor: sessions screen * refactor: panes screen * refactor: new session screen * refactor: menu screen * refactor: render * cleanups * refactor: plugin structure * remove unused welcome screen path * Rename api * refactor input.js * cleanup useless comments * fit/mobile refactoring * take out the garbage * remove more comments * remove mobile flash on startup/attach * fix: various mobile startup issues * fix space bugs * cleanup * rustfmt * fix windows build * adjust modifier bar ui * add pr
* fix: stale grid after forwarding host reply (#5163)Aram Drevekenin2026-05-12
| | | | | * fix: stale grid after forwarding host reply * add pr
* fix: clear bell when focusing with mouse (#5161)Aram Drevekenin2026-05-12
| | | | | * fix: clear bell when focusing with mouse * add pr
* Welcome screen del fix (#5160)Aram Drevekenin2026-05-12
| | | | | | | * fix: session-manager delete * rustfmt * add pr
* fix(plugin): require specific permissions for new tab panes (#5143)mookim.eth2026-05-12
|
* fix: deadlock with blocking panes (#5152)Aram Drevekenin2026-05-08
| | | | | | | * fix: deadlock with blocking panes * rustfmt * add pr
* fix(windows): bump windows-sys to 0.59 (#5139)divens2026-05-06
| | | | | | | | | | | | | | | | | The workspace `windows-sys` constraint was pinned to 0.52 while the Windows source uses APIs and namespaces from 0.59 (e.g. WriteFile in Win32::Storage::FileSystem). CI built fine because Cargo.lock pinned 0.59, but downstream `cargo install`/`cargo binstall` did fresh resolution and selected 0.52, breaking the build for users on Windows. Align the manifest with the code: - Bump workspace dep `windows-sys` from 0.52 to 0.59. - HANDLE is now `*mut c_void` instead of `isize`: replace `handle == 0` / `!= 0` with `is_null()`, initialise HANDLE locals with `std::ptr::null_mut()`, and pass `null_mut()` as the hTemplateFile argument to CreateFileW. - Pass the process HANDLE through the exit-monitor thread as `usize` (raw pointers are not Send; OS handles are safe to use cross-thread). - Note: HPCON is still `isize` in 0.59, so its zero-init is unchanged.
* Independent tab sizes (#5133)Aram Drevekenin2026-05-05
| | | | | | | * feat: allow independent tab resizing * rustfmt * add pr
* Fullscreen resize fixes (#5117)Aram Drevekenin2026-05-01
| | | | | | | * fix: properly handle resize while pane is in fullscreen * fix: re-update fullscreen after closing editor pane * rustfmt
* fix: buffer pty processing while waiting for host query reply (#5113)Aram Drevekenin2026-04-30
| | | | | | | * fix: block pty byte processing while waiting for host terminal reply * rustfmt * add pr
* fix(windows): stop reusing terminal pane ids (#5082)Simoyd2026-04-29
| | | Prevent late ClosePane events from closing newly spawned panes by making Windows terminal IDs monotonic. This matches the Unix backend and avoids stale pane-id collisions after a pane is closed and reopened.
* Implement DECQRM for CSI2031 (#5111)Aram Drevekenin2026-04-29
| | | | | * implement DECQRM for CSI2031 * add pr
* Support CSI2031 (dark/light theme switching) + remove STDIN cache to avoid ↵Aram Drevekenin2026-04-28
| | | | | | | | | | | | | | | | | | | | | | | | | | | stale color queries (#5105) * initial phase 1 implementation * various fies * some fixes * fix fragmented stdin cases * some fixes * renaming * guard against old clients * implement csi 2031 * allow toggling theme with actions * rustfmt * fix: finalize trailing characters in ansi parser as well * add pr
* Some idle CPU and disk/io fixes, new CommandChanged plugin Event (#5063)Aram Drevekenin2026-04-17
| | | | | | | | | | | | | | | * initial implementation * fix mouse cpu spam * prevent excess metadata write and prune sessions on startup * consolidate CommandChanged and PaneCommandChanged * tests * rustfmt * add pr
* fix(windows): skip modifier re-encoding for Char keys in cast_crossterm_key ↵divens2026-04-15
| | | | | | | | (#5014) PR #4967 added VT modifier encoding for non-Char keys but the guard condition also matched Char keys, re-encoding Ctrl+C from [0x03] to CSI u sequence \x1b[3;5u which shells don't understand. Skip the encoding block for Char keys since they already handle modifiers.
* Minor fix before patch version (#5011)Aram Drevekenin2026-04-07
| | | | | | | * bump patch version * fix: preserve row background when scrolling * add pr
* feat(zellij-server): report OSC 52 clipboard support over DA1 (#4545)Michael Hoang2026-04-07
| | | | | | | As Zellij always handles OSC 52 from inner programs and then forwards it appropriately (`copy_command`, `copy_clipboard`), I think it makes sense to unconditionally report OSC 52 support. Co-authored-by: Michael Hoang <enzime@users.noreply.github.com>
* Fix pty race when opening new panes (#5010)Aram Drevekenin2026-04-07
| | | | | | | * fix: race condition when starting panes * rustfmt * add pr
* fix(ansi): reset bold should not entail reset underline (#4962)Kószó Attila2026-04-06
| | | Co-authored-by: kazimazi <attila.koszo.official@gmail.com>
* fix: respect --name flag when creating new panes (#4979)divens2026-04-06
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * fix: respect --name flag when creating and renaming panes Three issues fixed: 1. Pane creation: --name was silently discarded for default shell panes because use_terminal_title was true. Now user-provided names take priority. Also pass initial_pane_title as pane_name to TerminalPane constructor (was hardcoded to empty string). 2. CLI rename without --pane-id: was routed through PaneNameInput which appends to existing name. Now uses a dedicated RenameActivePane action that fully replaces the name, working for any name length including single characters. 3. Interactive rename: entering rename mode preserves the existing name for editing (append/backspace). Esc reverts to the name before rename mode was entered. Adds 28 tests covering rename semantics, interactive editing, undo, OSC title interaction, and a wire-level IPC round-trip test. * refactor: route active-pane rename via Option<PaneId> Replace the dedicated Action::RenameActivePane variant with an Option<PaneId> on the existing Action::RenamePaneByPaneId. route.rs dispatches None to the server-internal ScreenInstruction::RenameActivePane and Some(id) to the existing RenamePaneWithPaneId path. Drops all proto/conversion boilerplate for the removed variant: plugin API additions, IPC tag 137, and both directions of the wire conversion. --------- Co-authored-by: divens <divens.dev@gmail.com>
* fix: position host cursor for CJK IME even when app hides cursor (#4951)Satoru Higa2026-04-03
| | | | | | | | | | | | | | | | | | | | | * fix: position host cursor for CJK IME even when app hides cursor When apps like Claude Code (ink/React library) hide the cursor during rendering, Zellij's render_cursor() was not sending a CUP sequence to the host terminal. This caused IME composition candidates to appear at the wrong position, breaking CJK input in these apps. Change cursor_coordinates() to return the cursor position unconditionally (as long as it is within bounds) along with a bool indicating visibility. render_cursor() now positions the host cursor even when the app has hidden it, so the IME subsystem can read the correct cursor position. * add test * rustfmt --------- Co-authored-by: Aram Drevekenin <aram@poor.dev>
* Fix bce and other issues (#4992)Aram Drevekenin2026-04-02
| | | | | | | * fix bce and other issues * rustfmt * add pr
* Preserve scrollback for partial scroll regions starting at top (#4941)Nitin Gupta2026-03-31
| | | | | | | | | | | | | | | | | | | | | | | | | * Preserve scrollback for partial scroll regions starting at top When a partial scroll region starts at row 0 (the top of the viewport), lines scrolled off the top were silently discarded via viewport.remove(0) instead of being transferred to lines_above (the scrollback buffer). This affected both add_canonical_line and rotate_scroll_region_down. Applications like Codex CLI use partial scroll regions to push rendered content into terminal scrollback (via DECSTBM + newlines). In tmux, these lines are preserved in the scrollback buffer and accessible via copy-mode scrolling. In Zellij, they were lost, causing mouse wheel scrolling to show only stale pre-application content. Transfer lines to lines_above when scroll_region_top == 0 and alternate screen is not active, matching the behavior of tmux. * add selection handling to CSI S, add matching handling for CSI M, add tests * add pr --------- Co-authored-by: Aram Drevekenin <aram@poor.dev>
* Layout string flag (#4956)Aram Drevekenin2026-03-30
| | | | | | | | | * allow sending a stringified layout with --layout-string * add --tab-id to all the things * fix windows tests * add pr
* Support OSC-99 desktop notifications (#4931)Aram Drevekenin2026-03-28
| | | | | | | | | | | | | | | * initial implementation * tests * fix: always report to zellij, only report to app if it wants a report * rustfmt * fix: always report capabilities to panes requesting them * rustfmt * add pr
* CLI focus-pane-id and are-floating-panes-visible actions (#4926)Aram Drevekenin2026-03-27
| | | | | | | | | * add zellij action focus-pane-id * zellij action are-floating-panes-visible * fix e2e tests * add pr
* fix: performance regression when switching tabs (#4918)Aram Drevekenin2026-03-26
| | | | | | | | | | | | | | | | | | | * remove pane render report * only collect pane contents if pane should render * add logs * conditional keybinding serialization * remove logs * rustfmt * fix tests * tests * rustfmt
* Add windows support in strider (#4854)divens2026-03-21
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Add Windows path support to strider plugin Strider is a WASM plugin where std::path::PathBuf uses Unix semantics, so Windows backslash paths break parent(), join(), strip_prefix(), etc. Fix by normalizing all incoming paths to forward slashes at plugin boundaries and converting back to native backslashes for display. A new platform.rs module detects the host OS at runtime from the initial_cwd format and centralizes all platform-aware logic. Also fix scan_host_folder on the server side: canonicalize plugin_host_folder so the starts_with security check works on Windows, where canonicalize() adds the \?\ prefix. * Add virtual root view for drive and WSL navigation in strider On Windows, navigating up from a drive root (e.g. C:\) now shows a "Computer" view listing all available drives and WSL distributions. Drives are enumerated via GetLogicalDriveStringsW and WSL distros via `wsl -l -q` (since read_dir on \wsl.localhost fails with OS error 64/67). Drive letters appear before WSL entries, which are displayed as "Ubuntu-24.04 (WSL)" etc. On non-Windows platforms, behavior is unchanged. * Rename ListHostEntries to ListWindowsVolumes and gate behind FullHdAccess The old name was misleading — on Unix it just returned `/`, which isn't "listing host entries." Rename to ListWindowsVolumes to make the Windows-specific intent explicit, gate behind FullHdAccess permission, and replace the Unix implementation with a log::error since the command is not meaningful on non-Windows platforms. * Replace direct array indexing with .get() in strider platform detection Use safe accessors and matches! macro instead of direct byte indexing for bounds-checked access patterns. --------- Co-authored-by: divens <divens.dev@gmail.com>
* Release notes and fixes (#4879)Aram Drevekenin2026-03-20
| | | | | | | | | * release notes * fix some link issues * rustfmt * fix click wording