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());
}
}
|