this repo has no description
13
fork

Configure Feed

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

at fa6f3247ee82741d20e5193e532b3fb07a3082bb 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}