diff options
| author | Gabriel Schneider <[email protected]> | 2026-09-24 10:06:08 -0300 |
|---|---|---|
| committer | Gabriel Schneider <[email protected]> | 2026-10-01 00:12:14 -0300 |
| commit | 3f6ad1bc30570348297ae4aa6d1fd676de229a09 (patch) | |
| tree | b52037635072e90e0ff20c80a15c5d18c578d445 /src/ninep | |
| parent | 82c4f9e7212f569d6343dd03ddbab3520a784993 (diff) | |
| download | pardes-3f6ad1bc30570348297ae4aa6d1fd676de229a09.tar.gz pardes-3f6ad1bc30570348297ae4aa6d1fd676de229a09.zip | |
Ask from the keyboard which neighbour a closed pane's rows go to
Del takes a side: `Del k` gives the closed pane's rows to the nearest
expanded pane above it, `Del j` to the one below, each falling back to the
other side when it has none. DelAbove and DelBelow are those two lines, with
no path of their own under SPC.
A bare Del started from a key -- SPC d, Enter on the tag word, a row run from
an output buffer -- on a pane with expanded panes both above and below asks
instead of guessing. The question is a prompt like Save's or a search's
(Pane.Prompt.del_side), so it is painted on the pane's notice band by the
same path, and the next key answers it before any mode sees it: k or Up,
j or Down, anything else keeps the pane, as does a click. Only a key press
sets Pardes.can_ask, so a click, a 9P ctl or event write, a startup line, a
restore and a shell exiting all close the pane at once, the rows going
where layout.absorbVWeight has always sent them. A collapsed pane is not
asked about (it has only a tag row to give), and collapsed neighbours are
passed over (layout.expandedNeighbor, which Collapse now uses too).
removePane and absorbVWeight take the recipient; every other caller passes
null. Three scripts that closed a middle pane with SPC d answer k, which
is where the rows went before, and their goldens are unchanged. delask.snap
covers the question, Esc, j, a clicked DelBelow and a clicked Del.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
Diffstat (limited to 'src/ninep')
| -rw-r--r-- | src/ninep/screen.zig | 2 | ||||
| -rw-r--r-- | src/ninep/tree.zig | 2 |
2 files changed, 2 insertions, 2 deletions
diff --git a/src/ninep/screen.zig b/src/ninep/screen.zig index 2684aa41..60fb5951 100644 --- a/src/ninep/screen.zig +++ b/src/ninep/screen.zig @@ -237,7 +237,7 @@ test "terminal body snapshots are lazy bounded and released after the pane close try testing.expectEqual(E.INVAL, call(p, .{ .tag = 6, .op = .read, .node = screen_node, .handle = handles[0], .size = 32 }).errno()); _ = call(p, .{ .tag = 7, .op = .release, .node = screen_node, .handle = handles[0] }); try testing.expectEqual(node, p.fs.snapshots[handles[0] - 1].node); - try p.removePane(0); + try p.removePane(0, null); for (handles) |opened_handle| _ = call(p, .{ .tag = 8, .op = .release, .node = node, .handle = opened_handle }); for (p.fs.snapshots) |snapshot| { try testing.expectEqual(@as(u64, 0), snapshot.node); diff --git a/src/ninep/tree.zig b/src/ninep/tree.zig index b13b1472..aca8d109 100644 --- a/src/ninep/tree.zig +++ b/src/ninep/tree.zig @@ -529,7 +529,7 @@ fn remove(p: *Pardes, req: Req) Reply { }; if (t.file != .dir) return Reply.fail(req.tag, E.PERM); const id = p.paneBySerial(t.serial) orelse return Reply.fail(req.tag, E.NOENT); - p.removePane(id) catch return Reply.fail(req.tag, E.IO); + p.removePane(id, null) catch return Reply.fail(req.tag, E.IO); return .{ .tag = req.tag }; } |
