diff options
| author | Gabriel Schneider <[email protected]> | 2026-09-29 02:20:43 -0300 |
|---|---|---|
| committer | Gabriel Schneider <[email protected]> | 2026-10-01 00:12:15 -0300 |
| commit | eece0fbe709142f6731b7dd2e84009c3a18a3806 (patch) | |
| tree | efb4ae067a9009beae607c55ae38078382c5d038 | |
| parent | a4a8b1874d477498fb427f8e2f63382c99f618a0 (diff) | |
| download | pardes-eece0fbe709142f6731b7dd2e84009c3a18a3806.tar.gz pardes-eece0fbe709142f6731b7dd2e84009c3a18a3806.zip | |
A pane closed with its question standing logs answer <serial> -
A follower that saw ask never heard the question end when its pane closed
first. Retiring a pane with a question still up now logs answer <serial> -
before its del.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
| -rw-r--r-- | docs/fs.md | 2 | ||||
| -rw-r--r-- | src/ninep/events.zig | 6 | ||||
| -rw-r--r-- | src/pardes.zig | 11 |
3 files changed, 18 insertions, 1 deletions
@@ -611,7 +611,7 @@ since a terminal is named by its directory), `exit <serial> <N>` before the `del` of a terminal whose shell exited by itself, `ask <serial> <what> <choices>` when a pane asks a question (answered by `answer` on its ctl), `answer <serial> <choice|->` when it is answered, by key or ctl, `-` for -taken back, +taken back or for its pane closing with the question standing, and `save <serial> <name>`, `dump <path>` when a Dump is written and `restore <path>` in a Restore's new log after its panes' `new`s, then `restored <old> <new>` for each pane, diff --git a/src/ninep/events.zig b/src/ninep/events.zig index 2112110a..61aadae2 100644 --- a/src/ninep/events.zig +++ b/src/ninep/events.zig @@ -122,6 +122,12 @@ pub fn noteRetire(p: *Pardes, pane: *Pane) void { pane.fs.unannounced = false; return; } + // A question still standing ends with it, so a follower of its `ask` + // hears the end. + if (pane.prompt == .repl_choice or pane.prompt == .del_side) { + var rec: [32]u8 = undefined; + notePath(p, "answer", std.fmt.bufPrint(&rec, "{d} -", .{pane.serial}) catch ""); + } noteLog(p, .del, pane); } diff --git a/src/pardes.zig b/src/pardes.zig index da9889ff..f55654b6 100644 --- a/src/pardes.zig +++ b/src/pardes.zig @@ -7096,6 +7096,17 @@ test "Del from a key asks which neighbour takes the rows; nothing else asks" { try std.testing.expectEqual(ctlfs.Status.ok, th.wr(p, ctl, "answer -\n").reply.status); try std.testing.expect(p.panes[asked] != null and p.panes[asked].?.prompt == .none); try std.testing.expect(th.logHas(p, try std.fmt.bufPrint(&want, "answer {d} -\n", .{serial}))); + // A pane closed while its question stands ends the question in the log. + p.newScratchBelow(top); + const closing = p.active; + p.sync(); + const closing_serial = p.panes[closing].?.serial; + p.update(.{ .key = .{ .cp = ' ' } }); + p.update(.{ .key = .{ .cp = 'd' } }); + try std.testing.expectEqual(Pane.Prompt.del_side, p.panes[closing].?.prompt); + try p.removePane(closing, null); + try std.testing.expect(th.logHas(p, try std.fmt.bufPrint(&want, "answer {d} -\ndel {d}", .{ closing_serial, closing_serial }))); + p.active = asked; p.update(.{ .key = .{ .cp = ' ' } }); p.update(.{ .key = .{ .cp = 'd' } }); try std.testing.expectEqual(ctlfs.Status.ok, th.wr(p, ctl, "answer k\n").reply.status); |
