From 6877a61ef40ad0d8e762a28d0a3f5fa9bfefaff2 Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Mon, 27 Jul 2026 10:52:32 -0300 Subject: an output pane is not a document: +Search/+Help split below the pane that asked, never into a column of their own placeDoc classified any file pane as a doc, so a +Search opened from a lone shell took layoutInsertColumn(0) - a whole new leftmost column, shoving every existing column sideways - and an open results list was then eligible as the split parent for a real file, stacking documents under the list. An output buffer has no file behind it and no Save; it is the result list belonging to the pane that asked for it. Now it is that on both sides of the rule: it splits below from_id whatever kind of pane that is (a source that died falls back to stackDocLeft, the same last resort a full column bar uses), and it is skipped when a real doc hunts for its split parent, so a file opened from a search row joins the docs instead of the results. Real docs are untouched: fsearch/rsearch/look-file/tutor/lookpanes all pass unchanged. psearch is the proof - its results snap was two columns (the shell pushed to x=70, its gutter run at 70-71) and is now one 140-wide column with the +Search stacked below at the same x origin. --- src/pardes.zig | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'src/pardes.zig') diff --git a/src/pardes.zig b/src/pardes.zig index d3376273..31757732 100644 --- a/src/pardes.zig +++ b/src/pardes.zig @@ -4940,19 +4940,24 @@ pub const Pardes = struct { p.placeDoc(id, free, np); } - /// place a fresh doc pane. Any doc already open is the split parent (the + /// place a fresh doc pane. An OUTPUT buffer (+Search/+Help) is NOT a + /// document: it is the result list belonging to the pane that asked for it, + /// so it never claims a column and is never anyone else's split parent — it + /// lands right below `from_id`, be that a shell, a file or another list. + /// A real doc joins the docs: any doc already open is the split parent (the /// source if it IS one, else the first found) and the newcomer lands right /// below it, so all docs share one column. The FIRST doc of the session /// instead gets a column of its own on the left (acme: files left, shells - /// right) — nothing is displaced, the other columns just narrow. Only a - /// full column bar falls back to stacking into the leftmost one. + /// right) — nothing is displaced, the other columns just narrow. A full + /// column bar, or a result list whose source died, stacks into the leftmost. fn placeDoc(p: *Pardes, from_id: usize, free: usize, nt: *Pane) void { + const doc = if (nt.file) |f| !f.output else true; // an image is a doc var src_id: ?usize = null; - if (p.panes[from_id]) |src| if (src.file != null or src.image != null) { + if (p.panes[from_id]) |src| if (!doc or (if (src.file) |f| !f.output else src.image != null)) { src_id = from_id; }; - if (src_id == null) for (p.panes, 0..) |sl, i| { - if (sl) |pp| if ((pp.file != null or pp.image != null) and i != free) { + if (doc and src_id == null) for (p.panes, 0..) |sl, i| { + if (sl) |pp| if (i != free and (if (pp.file) |f| !f.output else pp.image != null)) { src_id = i; break; }; @@ -4965,7 +4970,7 @@ pub const Pardes = struct { p.active = free; return; } - if (p.ncol < MAX_COLS) { + if (doc and p.ncol < MAX_COLS) { p.layoutInsertColumn(0, free); p.active = free; return; -- cgit v1.3