summaryrefslogtreecommitdiff
path: root/main.zig
blob: a55ad637ac3d4ce2d701814b850540587d419f47 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
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());
    }
}