mirror of
https://github.com/ghostty-org/ghostty.git
synced 2026-04-14 03:25:50 +00:00
The terminal.Stream next/nextSlice functions can now no longer fail. All prior failure modes were fully isolated in the handler `vt` callbacks. As such, vt callbacks are now required to not return an error and handle their own errors somehow. Allowing streams to be fallible before was an incorrect design. It caused problematic scenarios like in `nextSlice` early terminating processing due to handler errors. This should not be possible. There is no safe way to bubble up vt errors through the stream because if nextSlice is called and multiple errors are returned, we can't coalesce them. We could modify that to return a partial result but its just more work for stream that is unnecessary. The handler can do all of this. This work was discovered due to cleanups to prepare for more C APIs. Less errors make C APIs easier to implement! And, it helps clean up our Zig, too.
41 lines
1.2 KiB
Zig
41 lines
1.2 KiB
Zig
const std = @import("std");
|
|
const ghostty_vt = @import("ghostty-vt");
|
|
|
|
pub fn main() !void {
|
|
var gpa: std.heap.DebugAllocator(.{}) = .init;
|
|
defer _ = gpa.deinit();
|
|
const alloc = gpa.allocator();
|
|
|
|
var t: ghostty_vt.Terminal = try .init(alloc, .{ .cols = 80, .rows = 24 });
|
|
defer t.deinit(alloc);
|
|
|
|
// Create a read-only VT stream for parsing terminal sequences
|
|
var stream = t.vtStream();
|
|
defer stream.deinit();
|
|
|
|
// Basic text with newline
|
|
stream.nextSlice("Hello, World!\r\n");
|
|
|
|
// ANSI color codes: ESC[1;32m = bold green, ESC[0m = reset
|
|
stream.nextSlice("\x1b[1;32mGreen Text\x1b[0m\r\n");
|
|
|
|
// Cursor positioning: ESC[1;1H = move to row 1, column 1
|
|
stream.nextSlice("\x1b[1;1HTop-left corner\r\n");
|
|
|
|
// Cursor movement: ESC[5B = move down 5 lines
|
|
stream.nextSlice("\x1b[5B");
|
|
stream.nextSlice("Moved down!\r\n");
|
|
|
|
// Erase line: ESC[2K = clear entire line
|
|
stream.nextSlice("\x1b[2K");
|
|
stream.nextSlice("New content\r\n");
|
|
|
|
// Multiple lines
|
|
stream.nextSlice("Line A\r\nLine B\r\nLine C\r\n");
|
|
|
|
// Get the final terminal state as a plain string
|
|
const str = try t.plainString(alloc);
|
|
defer alloc.free(str);
|
|
std.debug.print("{s}\n", .{str});
|
|
}
|