const std = @import("std"); const vaxis = @import("vaxis"); const ghostty_vt = @import("ghostty-vt"); // basic file navigation // basic shell io // basic layouting: for now following acme and ad // * /home/goblin/05-genizah/plan9port/src/cmd/acme // * /home/goblin/05-genizah/ad // * /usr/lib/zig // * ../03-plano // right click and enter on lines to open files at specified lines pub const Command = struct { prev: ?*Command = null, pub var value: union(enum) { close, ping, nop, quit, tick, key_press: vaxis.Key, winsize: vaxis.Winsize, mouse: vaxis.Mouse, } = .nop; }; const Loop = vaxis.Loop(@TypeOf(Command.value)); const MAX_FILES: usize = 0x200; fn ticker(io: std.Io, loop: *Loop) void { while (true) { io.sleep(.fromMilliseconds(2), .awake) catch return; _ = loop.tryPostEvent(.tick) catch return; } } 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, }); 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 i: usize = 0; while (try walk.next(io)) |e| : (i += 1) { if (i > MAX_FILES) break; 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 = 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()); } }