From 91c5a2ac355b166e82d9051a8ba5c4c12dffa816 Mon Sep 17 00:00:00 2001 From: Gabriel Schneider Date: Fri, 19 Jun 2026 16:48:19 -0300 Subject: clean version --- main.zig | 151 +++++++++++++++++++++++++++++++++------------------------------ 1 file changed, 80 insertions(+), 71 deletions(-) (limited to 'main.zig') diff --git a/main.zig b/main.zig index a55ad637..0c733eb3 100644 --- a/main.zig +++ b/main.zig @@ -2,6 +2,18 @@ const std = @import("std"); const vaxis = @import("vaxis"); const ghostty_vt = @import("ghostty-vt"); +extern "c" fn forkpty( + amaster: *c_int, + name: ?[*:0]u8, + termp: ?*const anyopaque, + winp: ?*const std.posix.winsize, +) c_int; + +extern "c" fn execvp( + file: [*:0]const u8, + argv: [*:null]const ?[*:0]const u8, +) c_int; + // basic file navigation // basic shell io // basic layouting: for now following acme and ad @@ -35,91 +47,88 @@ fn ticker(io: std.Io, loop: *Loop) void { } } +fn fork_pty(argv: [:0]const u8, ws: std.posix.winsize) std.Io.File { + var master: c_int = undefined; + const pid = forkpty(&master, null, null, &ws); + if (pid == 0) { + _ = execvp(argv, &.{}); + std.process.exit(0); + } + + // not sure about the false here + const f: std.Io.File = .{ .handle = master, .flags = .{ .nonblocking = false } }; + return f; +} + +const nrows = 40; +const ncols = 6; + pub fn main(init: std.process.Init) !void { std.debug.print("hello!\n", .{}); - const io = init.io; const gpa = init.gpa; - var t: ghostty_vt.Terminal = try .init(gpa, .{ - .cols = 6, - .rows = 40, + const master = fork_pty("/usr/bin/bash", .{ + .row = nrows, + .col = ncols, + .xpixel = 0, + .ypixel = 0, }); - defer t.deinit(gpa); - - try t.printString("hello there!\nhowdy!"); - const str = try t.plainString(gpa); - - var tty_buf: [0x10000]u8 = undefined; - var lines: [0x1000][0x1000]u8 = undefined; - const dir = std.Io.Dir.cwd(); - const cwd = try std.Io.Dir.openDir(dir, io, ".", .{ .iterate = true }); - var walk = try cwd.walk(gpa); - defer walk.deinit(); + var read_buf: [0x100]u8 = undefined; + var reader = master.readerStreaming(io, &read_buf); + try io.sleep(.fromMilliseconds(100), .real); + const str = try reader.interface.readAlloc(gpa, 2); + std.debug.print("\n\nreader: {} {s}\n\n", .{ reader.size orelse 1234, str }); - { - var i: usize = 0; + var term: ghostty_vt.Terminal = try .init(gpa, .{ + .cols = ncols, + .rows = nrows, + }); + defer term.deinit(gpa); + var stream = term.vtStream(); + defer stream.deinit(); + try term.printString("hello there!\nhowdy!"); - while (try walk.next(io)) |e| : (i += 1) { - if (i > MAX_FILES) break; + // const str = try term.plainString(gpa); - std.debug.print("path: {s}\n", .{e.path}); - @memcpy(lines[i][0..e.path.len], e.path); - std.debug.dumpHex(lines[i][0..2]); - lines[i][e.path.len] = 0; - } - } + var tty_buf: [0x10000]u8 = undefined; var tty = try vaxis.Tty.init(io, &tty_buf); var vx = try vaxis.init(io, gpa, init.environ_map, .{}); defer vx.deinit(gpa, tty.writer()); - try vx.enterAltScreen(tty.writer()); - defer vx.exitAltScreen(tty.writer()) catch {}; - - try vx.setMouseMode(tty.writer(), true); - - var loop: Loop = .init(io, &tty, &vx); - try loop.start(); - defer loop.stop(); - - while (true) { - const event = try loop.nextEvent(); - const win = vx.window(); - const win_child = win.child(.{ .border = .{ .where = .all }, .height = 8, .width = 42 }); - _ = win_child.printSegment(.{ .text = "hey" }, .{}); - - switch (event) { - .key_press => |key| { - if (key.matches('c', .{ .ctrl = true })) { - break; - } - }, - .mouse => |m| { - _ = win.printSegment(.{ .text = str }, .{ .col_offset = 1, .row_offset = 1 }); - - if (m.type == .press) { - // const txt = try std.fmt.allocPrint(gpa, "col={} row={} xo={} yo={}", .{ m.col, m.row, m.xoffset, m.yoffset }); - // constlen = std.mem.findSentinel(u8, 0, @ptrCast(&lines[@intCast(m.row)])); - // _ = win.printSegment( - // .{ - // .text = lines[@intCast(m.row)][0..len], - // .style = .{ .fg = .{ .rgb = .{ 0x00, 0xd0, 0xaa } } }, - // }, - // .{ - // .col_offset = @as(u16, @intCast(m.col)), - // .row_offset = @as(u16, @intCast(m.row)), - // .wrap = .none, - // }, - // ); - } - }, - .winsize => |ws| try vx.resize(gpa, tty.writer(), ws), - else => {}, - } - - try vx.render(tty.writer()); - } + // try vx.enterAltScreen(tty.writer()); + // defer vx.exitAltScreen(tty.writer()) catch {}; + + // try vx.setMouseMode(tty.writer(), true); + + // var loop: Loop = .init(io, &tty, &vx); + // try loop.start(); + // defer loop.stop(); + + // while (true) { + // const event = try loop.nextEvent(); + // const win = vx.window(); + // const win_child = win.child(.{ .border = .{ .where = .all }, .height = 8, .width = 42 }); + // _ = win_child.printSegment(.{ .text = "hey" }, .{}); + + // switch (event) { + // .key_press => |key| { + // if (key.matches('c', .{ .ctrl = true })) { + // break; + // } + // }, + // .mouse => |m| { + // _ = win.printSegment(.{ .text = str }, .{ .col_offset = 1, .row_offset = 1 }); + + // if (m.type == .press) {} + // }, + // .winsize => |ws| try vx.resize(gpa, tty.writer(), ws), + // else => {}, + // } + + // try vx.render(tty.writer()); + // } } -- cgit v1.3