summaryrefslogtreecommitdiff
path: root/main.zig
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-07-01 17:26:20 -0300
committerGabriel Schneider <[email protected]>2026-08-01 15:02:07 -0300
commit67763fbabfa873f506d4d2a498c08bf83e1fbac5 (patch)
treefdbb968f90293c259b1bc50ab7cd203a69d30ead /main.zig
parent021e579cdd6e231cc3e9128f64a4ce7df2a5eddb (diff)
downloadpardes-67763fbabfa873f506d4d2a498c08bf83e1fbac5.tar.gz
pardes-67763fbabfa873f506d4d2a498c08bf83e1fbac5.zip
sdl: main + tests additions
Diffstat (limited to 'main.zig')
-rw-r--r--main.zig15
1 files changed, 15 insertions, 0 deletions
diff --git a/main.zig b/main.zig
index 3db83d94..732a4710 100644
--- a/main.zig
+++ b/main.zig
@@ -481,9 +481,24 @@ fn forkTerm(gpa: std.mem.Allocator, init_cols: u16, init_rows: u16, cwd: ?[*:0]c
.rows = init_rows,
};
t.stream = t.term.vtStream();
+ // Answer terminal QUERIES back into the pty. Apps (nushell/reedline, helix, fzf
+ // — anything on crossterm) send a DSR cursor-position report (ESC[6n) at startup
+ // and BLOCK waiting for the reply. ghostty computes the reply but drops it unless
+ // this effect is wired, so the app spins forever ("nushell never opens"). Only
+ // real terminals need it (file/image stubs read no pty). See ptyReport.
+ t.stream.handler.effects.write_pty = ptyReport;
return t;
}
+// ghostty calls this with a reply (cursor-position report, operating status, ...)
+// to send back to the child. The handler's `terminal` is our Term.term field, so
+// recover the owning Term and echo the bytes into its pty as if the child typed
+// them. termWrite no-ops on a closed pty, so a late report after EOF is harmless.
+fn ptyReport(handler: *ghostty_vt.TerminalStream.Handler, data: [:0]const u8) void {
+ const t: *Term = @fieldParentPtr("term", handler.terminal);
+ termWrite(t, data);
+}
+
// peel a trailing :NNN (or :NNN:) line suffix: main.zig:100 -> {main.zig, 100}.
fn parsePathLine(tok: []const u8) struct { path: []const u8, line: usize } {
var sep: usize = 0;