this repo has no description
1const std = @import("std");
2const vaxis = @import("vaxis");
3const Cell = vaxis.Cell;
4
5const Event = union(enum) {
6 key_press: vaxis.Key,
7 winsize: vaxis.Winsize,
8};
9
10pub const panic = vaxis.panic_handler;
11
12pub fn main() !void {
13 var gpa = std.heap.GeneralPurposeAllocator(.{}){};
14 defer {
15 const deinit_status = gpa.deinit();
16 //fail test; can't try in defer as defer is executed after we return
17 if (deinit_status == .leak) {
18 std.log.err("memory leak", .{});
19 }
20 }
21 const alloc = gpa.allocator();
22
23 var buffer: [1024]u8 = undefined;
24 var tty = try vaxis.Tty.init(&buffer);
25 var vx = try vaxis.init(alloc, .{});
26 defer vx.deinit(alloc, tty.anyWriter());
27
28 var loop: vaxis.Loop(Event) = .{ .tty = &tty, .vaxis = &vx };
29 try loop.init();
30
31 try loop.start();
32 defer loop.stop();
33
34 var buffered = tty.bufferedWriter();
35
36 try vx.enterAltScreen(tty.anyWriter());
37 try vx.queryTerminal(tty.anyWriter(), 1 * std.time.ns_per_s);
38 var env = try std.process.getEnvMap(alloc);
39 defer env.deinit();
40
41 const vt_opts: vaxis.widgets.Terminal.Options = .{
42 .winsize = .{
43 .rows = 24,
44 .cols = 100,
45 .x_pixel = 0,
46 .y_pixel = 0,
47 },
48 .scrollback_size = 0,
49 .initial_working_directory = env.get("HOME") orelse @panic("no $HOME"),
50 };
51 const shell = env.get("SHELL") orelse "bash";
52 const argv = [_][]const u8{shell};
53 var vt = try vaxis.widgets.Terminal.init(
54 alloc,
55 &argv,
56 &env,
57 &vx.unicode,
58 vt_opts,
59 );
60 defer vt.deinit();
61 try vt.spawn();
62
63 var redraw: bool = false;
64 while (true) {
65 std.Thread.sleep(8 * std.time.ns_per_ms);
66 // try vt events first
67 while (vt.tryEvent()) |event| {
68 redraw = true;
69 switch (event) {
70 .bell => {},
71 .title_change => {},
72 .exited => return,
73 .redraw => {},
74 .pwd_change => {},
75 }
76 }
77 while (loop.tryEvent()) |event| {
78 redraw = true;
79 switch (event) {
80 .key_press => |key| {
81 if (key.matches('c', .{ .ctrl = true })) return;
82 try vt.update(.{ .key_press = key });
83 },
84 .winsize => |ws| {
85 try vx.resize(alloc, tty.anyWriter(), ws);
86 },
87 }
88 }
89 if (!redraw) continue;
90 redraw = false;
91
92 const win = vx.window();
93 win.hideCursor();
94 win.clear();
95 const child = win.child(.{
96 .x_off = 4,
97 .y_off = 2,
98 .width = 8,
99 .height = 6,
100 .border = .{
101 .where = .all,
102 },
103 });
104
105 try vt.resize(.{
106 .rows = child.height,
107 .cols = child.width,
108 .x_pixel = 0,
109 .y_pixel = 0,
110 });
111 try vt.draw(child);
112
113 try vx.render(buffered.writer().any());
114 try buffered.flush();
115 }
116}