From c749371bae696af5e6df4fca604548aa28bedeff Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 21 May 2022 16:42:55 -0700 Subject: [PATCH] switch to new screen, bugs! --- src/Grid.zig | 13 +++++--- src/terminal/Terminal.zig | 65 ++++++++++++--------------------------- 2 files changed, 29 insertions(+), 49 deletions(-) diff --git a/src/Grid.zig b/src/Grid.zig index 8526baae3..628ea2884 100644 --- a/src/Grid.zig +++ b/src/Grid.zig @@ -265,16 +265,21 @@ pub fn updateCells(self: *Grid, term: Terminal) !void { // we have plus a full width. This is very likely too much but its // the probably close enough while guaranteeing no more allocations. self.cells.clearRetainingCapacity(); - if (term.screen.items.len == 0) return; try self.cells.ensureTotalCapacity( self.alloc, - (term.screen.items.len * term.cols * 2) + 1, // * 2 for background modes and cursor + + // * 2 for background modes and cursor // + 1 for cursor + (term.screen.rows * term.screen.cols * 2) + 1, ); // Build each cell - for (term.screen.items) |line, y| { - for (line.items) |cell, x| { + var rowIter = term.screen.rowIterator(); + var y: usize = 0; + while (rowIter.next()) |line| { + defer y += 1; + + for (line) |cell, x| { // If the cell has a background, we always draw it. if (cell.bg) |rgb| { self.cells.appendAssumeCapacity(.{ diff --git a/src/terminal/Terminal.zig b/src/terminal/Terminal.zig index c99ffa3f4..6e1226ca6 100644 --- a/src/terminal/Terminal.zig +++ b/src/terminal/Terminal.zig @@ -91,17 +91,18 @@ pub fn resize(self: *Terminal, alloc: Allocator, cols: usize, rows: usize) !void // If we're making the screen smaller, dealloc the unused items. // TODO: we probably want to wrap in the future. - if (rows < self.rows and self.screen.items.len > rows) { - for (self.screen.items[rows..self.screen.items.len]) |*line| - line.deinit(alloc); - self.screen.shrinkRetainingCapacity(rows); - } - if (cols < self.cols) { - for (self.screen.items) |*line| { - if (line.items.len < cols) continue; - line.shrinkRetainingCapacity(cols); - } - } + // TODO: new screen + // if (rows < self.rows and self.screen.items.len > rows) { + // for (self.screen.items[rows..self.screen.items.len]) |*line| + // line.deinit(alloc); + // self.screen.shrinkRetainingCapacity(rows); + // } + // if (cols < self.cols) { + // for (self.screen.items) |*line| { + // if (line.items.len < cols) continue; + // line.shrinkRetainingCapacity(cols); + // } + // } // Set our size self.cols = cols; @@ -291,24 +292,18 @@ pub fn eraseLine( /// /// TODO: test pub fn deleteChars(self: *Terminal, count: usize) !void { - var line = &self.screen.items[self.cursor.y]; + const line = self.screen.getRow(self.cursor.y); // Our last index is at most the end of the number of chars we have // in the current line. - const end = @minimum(line.items.len, self.cols - count); - - // Do nothing if we have no values. - if (self.cursor.x >= line.items.len) return; + const end = self.cols - count; // Shift var i: usize = self.cursor.x; while (i < end) : (i += 1) { const j = i + count; - if (j < line.items.len) { - line.items[i] = line.items[j]; - } else { - line.items[i].char = 0; - } + line[i] = line[j]; + line[j].char = 0; } } @@ -562,30 +557,10 @@ pub fn scrollDown(self: *Terminal, alloc: Allocator) !void { const tracy = trace(@src()); defer tracy.end(); - // TODO: this is horribly expensive. we need to optimize the screen repr - - // We need space for one more row if we aren't at the max. - if (self.screen.capacity < self.rows) { - try self.screen.ensureTotalCapacity(alloc, self.screen.items.len + 1); - } - - // Add one more item if we aren't at the max - if (self.screen.items.len < self.rows) { - self.screen.items.len += 1; - } else { - // We have the max, we need to deinitialize the last row because - // we're going to overwrite it. - self.screen.items[self.screen.items.len - 1].deinit(alloc); - } - - // Shift everything down - var i: usize = self.screen.items.len - 1; - while (i > 0) : (i -= 1) { - self.screen.items[i] = self.screen.items[i - 1]; - } - - // Clear this row - self.screen.items[0] = .{}; + _ = alloc; + self.screen.scroll(1); + const top = self.screen.getRow(0); + for (top) |*cell| cell.char = 0; } /// Set Top and Bottom Margins If bottom is not specified, 0 or bigger than