diff options
Diffstat (limited to 'main.zig')
| -rw-r--r-- | main.zig | 15 |
1 files changed, 15 insertions, 0 deletions
@@ -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; |
