diff --git a/examples/main.zig b/examples/main.zig index 0d3f43c..1f3da0b 100644 --- a/examples/main.zig +++ b/examples/main.zig @@ -33,16 +33,16 @@ pub fn main() !void { } }, .winsize => |ws| { - try vx.resize(alloc, ws.rows, ws.cols); + try vx.resize(alloc, ws); }, else => {}, } const win = vx.window(); - const child = win.initChild(20, 20, .expand, .expand); + const child = win.initChild(win.width / 2 - msg.len / 2, win.height / 2, .expand, .expand); for (msg, 0..) |_, i| { const cell: Cell = .{ .char = .{ .grapheme = msg[i .. i + 1] } }; - child.writeCell(cell, i, 0); + child.writeCell(i, 0, cell); } try vx.render(); } diff --git a/src/Screen.zig b/src/Screen.zig index 5c61c00..1151024 100644 --- a/src/Screen.zig +++ b/src/Screen.zig @@ -3,6 +3,8 @@ const assert = std.debug.assert; const Cell = @import("cell.zig").Cell; +const log = std.log.scoped(.screen); + const Screen = @This(); width: usize, @@ -22,6 +24,7 @@ pub fn deinit(self: *Screen, alloc: std.mem.Allocator) void { } pub fn resize(self: *Screen, alloc: std.mem.Allocator, w: usize, h: usize) !void { + log.debug("resizing screen: width={d} height={d}", .{ w, h }); alloc.free(self.buf); self.buf = try alloc.alloc(Cell, w * h); for (self.buf, 0..) |_, i| { @@ -32,7 +35,7 @@ pub fn resize(self: *Screen, alloc: std.mem.Allocator, w: usize, h: usize) !void } /// writes a cell to a location. 0 indexed -pub fn writeCell(self: *Screen, cell: Cell, row: usize, col: usize) void { +pub fn writeCell(self: *Screen, col: usize, row: usize, cell: Cell) void { if (self.width < col) { // column out of bounds return; @@ -41,7 +44,7 @@ pub fn writeCell(self: *Screen, cell: Cell, row: usize, col: usize) void { // height out of bounds return; } - const i = (col * self.width) + row; + const i = (row * self.width) + col; assert(i < self.buf.len); self.buf[i] = cell; } diff --git a/src/Window.zig b/src/Window.zig index b97b356..da1fc1f 100644 --- a/src/Window.zig +++ b/src/Window.zig @@ -3,6 +3,8 @@ const std = @import("std"); const Screen = @import("Screen.zig"); const Cell = @import("cell.zig").Cell; +const log = std.log.scoped(.window); + const Window = @This(); pub const Size = union(enum) { @@ -59,9 +61,10 @@ pub fn initChild( } /// writes a cell to the location in the window -pub fn writeCell(self: Window, cell: Cell, row: usize, col: usize) void { +pub fn writeCell(self: Window, col: usize, row: usize, cell: Cell) void { + if (self.height == 0 or self.width == 0) return; if (self.height < row or self.width < col) return; - self.screen.writeCell(cell, row + self.y_off, col + self.x_off); + self.screen.writeCell(col + self.x_off, row + self.y_off, cell); } test "Window size set" { diff --git a/src/vaxis.zig b/src/vaxis.zig index c6d5a17..9b79745 100644 --- a/src/vaxis.zig +++ b/src/vaxis.zig @@ -3,6 +3,7 @@ const std = @import("std"); const Queue = @import("queue.zig").Queue; const ctlseqs = @import("ctlseqs.zig"); const Tty = @import("Tty.zig"); +const Winsize = Tty.Winsize; const Key = @import("Key.zig"); const Screen = @import("Screen.zig"); const Window = @import("Window.zig"); @@ -91,8 +92,8 @@ pub fn Vaxis(comptime T: type) type { /// resize allocates a slice of cellsequal to the number of cells /// required to display the screen (ie width x height). Any previous screen is /// freed when resizing - pub fn resize(self: *Self, alloc: std.mem.Allocator, w: usize, h: usize) !void { - try self.screen.resize(alloc, w, h); + pub fn resize(self: *Self, alloc: std.mem.Allocator, winsize: Winsize) !void { + try self.screen.resize(alloc, winsize.cols, winsize.rows); } /// returns a Window comprising of the entire terminal screen @@ -124,7 +125,6 @@ pub fn Vaxis(comptime T: type) type { } pub fn render(self: *Self) !void { - log.debug("HERE", .{}); var tty = self.tty orelse return; _ = try tty.write(ctlseqs.home);