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 const writer = tty.writer();
26 var vx = try vaxis.init(alloc, .{});
27 defer vx.deinit(alloc, writer);
28
29 var loop: vaxis.Loop(Event) = .{ .tty = &tty, .vaxis = &vx };
30 try loop.init();
31
32 try loop.start();
33 defer loop.stop();
34
35 try vx.enterAltScreen(writer);
36 try vx.queryTerminal(writer, 1 * std.time.ns_per_s);
37 var env = try std.process.getEnvMap(alloc);
38 defer env.deinit();
39
40 const vt_opts: vaxis.widgets.Terminal.Options = .{
41 .winsize = .{
42 .rows = 24,
43 .cols = 100,
44 .x_pixel = 0,
45 .y_pixel = 0,
46 },
47 .scrollback_size = 0,
48 .initial_working_directory = env.get("HOME") orelse @panic("no $HOME"),
49 };
50 const shell = env.get("SHELL") orelse "bash";
51 const argv = [_][]const u8{shell};
52 var write_buf: [4096]u8 = undefined;
53 var vt = try vaxis.widgets.Terminal.init(
54 alloc,
55 &argv,
56 &env,
57 vt_opts,
58 &write_buf,
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| try vx.resize(alloc, writer, ws),
85 }
86 }
87 if (!redraw) continue;
88 redraw = false;
89
90 const win = vx.window();
91 win.hideCursor();
92 win.clear();
93 const child = win.child(.{
94 .x_off = 4,
95 .y_off = 2,
96 .width = 120,
97 .height = 40,
98 .border = .{
99 .where = .all,
100 },
101 });
102
103 try vt.resize(.{
104 .rows = child.height,
105 .cols = child.width,
106 .x_pixel = 0,
107 .y_pixel = 0,
108 });
109 try vt.draw(alloc, child);
110
111 try vx.render(writer);
112 }
113}