a modern tui library written in zig

fix: don't forget to flush the Terminal writer

authored by neurocyte.flow-control.dev and committed by rockorager.dev 6eb16bb4 cb00a914

Changed files
+30 -20
examples
src
widgets
terminal
+8 -10
examples/vt.zig
··· 22 22 23 23 var buffer: [1024]u8 = undefined; 24 24 var tty = try vaxis.Tty.init(&buffer); 25 + const writer = tty.writer(); 25 26 var vx = try vaxis.init(alloc, .{}); 26 - defer vx.deinit(alloc, tty.writer()); 27 + defer vx.deinit(alloc, writer); 27 28 28 29 var loop: vaxis.Loop(Event) = .{ .tty = &tty, .vaxis = &vx }; 29 30 try loop.init(); ··· 31 32 try loop.start(); 32 33 defer loop.stop(); 33 34 34 - try vx.enterAltScreen(tty.writer()); 35 - try vx.queryTerminal(tty.writer(), 1 * std.time.ns_per_s); 35 + try vx.enterAltScreen(writer); 36 + try vx.queryTerminal(writer, 1 * std.time.ns_per_s); 36 37 var env = try std.process.getEnvMap(alloc); 37 38 defer env.deinit(); 38 39 ··· 81 82 if (key.matches('c', .{ .ctrl = true })) return; 82 83 try vt.update(.{ .key_press = key }); 83 84 }, 84 - .winsize => |ws| { 85 - try vx.resize(alloc, tty.writer(), ws); 86 - }, 85 + .winsize => |ws| try vx.resize(alloc, writer, ws), 87 86 } 88 87 } 89 88 if (!redraw) continue; ··· 95 94 const child = win.child(.{ 96 95 .x_off = 4, 97 96 .y_off = 2, 98 - .width = 8, 99 - .height = 6, 97 + .width = 120, 98 + .height = 40, 100 99 .border = .{ 101 100 .where = .all, 102 101 }, ··· 110 109 }); 111 110 try vt.draw(alloc, child); 112 111 113 - try vx.render(tty.writer()); 114 - try tty.writer().flush(); 112 + try vx.render(writer); 115 113 } 116 114 }
+22 -10
src/widgets/terminal/Terminal.zig
··· 242 242 243 243 pub fn update(self: *Terminal, event: InputEvent) !void { 244 244 switch (event) { 245 - .key_press => |k| try key.encode(self.writer(), k, true, self.back_screen.csi_u_flags), 245 + .key_press => |k| { 246 + const pty_writer = self.get_pty_writer(); 247 + defer pty_writer.flush() catch {}; 248 + try key.encode(pty_writer, k, true, self.back_screen.csi_u_flags); 249 + }, 246 250 } 247 251 } 248 252 249 - pub fn writer(self: *Terminal) *std.Io.Writer { 253 + pub fn get_pty_writer(self: *Terminal) *std.Io.Writer { 250 254 return &self.pty_writer.interface; 251 255 } 252 256 ··· 502 506 }, 503 507 // Device Attributes 504 508 'c' => { 509 + const pty_writer = self.get_pty_writer(); 510 + defer pty_writer.flush() catch {}; 505 511 if (seq.private_marker) |pm| { 506 512 switch (pm) { 507 513 // Secondary 508 - '>' => try self.writer().writeAll("\x1B[>1;69;0c"), 509 - '=' => try self.writer().writeAll("\x1B[=0000c"), 514 + '>' => try pty_writer.writeAll("\x1B[>1;69;0c"), 515 + '=' => try pty_writer.writeAll("\x1B[=0000c"), 510 516 else => log.info("unhandled CSI: {f}", .{seq}), 511 517 } 512 518 } else { 513 519 // Primary 514 - try self.writer().writeAll("\x1B[?62;22c"); 520 + try pty_writer.writeAll("\x1B[?62;22c"); 515 521 } 516 522 }, 517 523 // Cursor Vertical Position Absolute ··· 575 581 var iter = seq.iterator(u16); 576 582 const ps = iter.next() orelse 0; 577 583 if (seq.intermediate == null and seq.private_marker == null) { 584 + const pty_writer = self.get_pty_writer(); 585 + defer pty_writer.flush() catch {}; 578 586 switch (ps) { 579 - 5 => try self.writer().writeAll("\x1b[0n"), 580 - 6 => try self.writer().print("\x1b[{d};{d}R", .{ 587 + 5 => try pty_writer.writeAll("\x1b[0n"), 588 + 6 => try pty_writer.print("\x1b[{d};{d}R", .{ 581 589 self.back_screen.cursor.row + 1, 582 590 self.back_screen.cursor.col + 1, 583 591 }), ··· 592 600 switch (int) { 593 601 // report mode 594 602 '$' => { 603 + const pty_writer = self.get_pty_writer(); 604 + defer pty_writer.flush() catch {}; 595 605 switch (ps) { 596 - 2026 => try self.writer().writeAll("\x1b[?2026;2$p"), 606 + 2026 => try pty_writer.writeAll("\x1b[?2026;2$p"), 597 607 else => { 598 608 std.log.warn("unhandled mode: {}", .{ps}); 599 - try self.writer().print("\x1b[?{d};0$p", .{ps}); 609 + try pty_writer.print("\x1b[?{d};0$p", .{ps}); 600 610 }, 601 611 } 602 612 }, ··· 616 626 } 617 627 } 618 628 if (seq.private_marker) |pm| { 629 + const pty_writer = self.get_pty_writer(); 630 + defer pty_writer.flush() catch {}; 619 631 switch (pm) { 620 632 // XTVERSION 621 - '>' => try self.writer().print( 633 + '>' => try pty_writer.print( 622 634 "\x1bP>|libvaxis {s}\x1B\\", 623 635 .{"dev"}, 624 636 ),