this repo has no description
13
fork

Configure Feed

Select the types of activity you want to include in your feed.

at 3943a6f42f7f4c73ab9493dfb0a4e123be15d302 113 lines 3.0 kB view raw
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}