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.writer());
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 try vx.enterAltScreen(tty.writer());
35 try vx.queryTerminal(tty.writer(), 1 * std.time.ns_per_s);
36 var env = try std.process.getEnvMap(alloc);
37 defer env.deinit();
38
39 const vt_opts: vaxis.widgets.Terminal.Options = .{
40 .winsize = .{
41 .rows = 24,
42 .cols = 100,
43 .x_pixel = 0,
44 .y_pixel = 0,
45 },
46 .scrollback_size = 0,
47 .initial_working_directory = env.get("HOME") orelse @panic("no $HOME"),
48 };
49 const shell = env.get("SHELL") orelse "bash";
50 const argv = [_][]const u8{shell};
51 var write_buf: [4096]u8 = undefined;
52 var vt = try vaxis.widgets.Terminal.init(
53 alloc,
54 &argv,
55 &env,
56 &vx.unicode,
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| {
85 try vx.resize(alloc, tty.writer(), 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(alloc, child);
112
113 try vx.render(tty.writer());
114 try tty.writer().flush();
115 }
116}