add second cursor list

This commit is contained in:
Daniel
2025-07-04 18:26:27 -04:00
parent 908eb6d156
commit de3e77570e

View File

@ -103,11 +103,12 @@ pub const Contents = struct {
// form a single grapheme, and multi-substitutions in fonts, the number // form a single grapheme, and multi-substitutions in fonts, the number
// of glyphs in a row is theoretically unlimited. // of glyphs in a row is theoretically unlimited.
// //
// We have size.rows + 1 lists because index 0 is used for a special // We have size.rows + 2 lists because indexes 0 and size.rows - 1 are
// list containing the cursor cell which needs to be first in the buffer. // used for special lists containing the cursor cell which need to
// be first and last in the buffer, respectively.
var fg_rows = try ArrayListCollection(shaderpkg.CellText).init( var fg_rows = try ArrayListCollection(shaderpkg.CellText).init(
alloc, alloc,
size.rows + 1, size.rows + 2,
size.columns * 3, size.columns * 3,
); );
errdefer fg_rows.deinit(alloc); errdefer fg_rows.deinit(alloc);
@ -118,14 +119,19 @@ pub const Contents = struct {
self.bg_cells = bg_cells; self.bg_cells = bg_cells;
self.fg_rows = fg_rows; self.fg_rows = fg_rows;
// We don't need 3*cols worth of cells for the cursor list, so we can // We don't need 3*cols worth of cells for the cursor lists, so we can
// replace it with a smaller list. This is technically a tiny bit of // replace them with smaller lists. This is technically a tiny bit of
// extra work but resize is not a hot function so it's worth it to not // extra work but resize is not a hot function so it's worth it to not
// waste the memory. // waste the memory.
self.fg_rows.lists[0].deinit(alloc); self.fg_rows.lists[0].deinit(alloc);
self.fg_rows.lists[0] = try std.ArrayListUnmanaged( self.fg_rows.lists[0] = try std.ArrayListUnmanaged(
shaderpkg.CellText, shaderpkg.CellText,
).initCapacity(alloc, 1); ).initCapacity(alloc, 1);
self.fg_rows.lists[size.rows + 1].deinit(alloc);
self.fg_rows.lists[size.rows + 1] = try std.ArrayListUnmanaged(
shaderpkg.CellText,
).initCapacity(alloc, 1);
} }
/// Reset the cell contents to an empty state without resizing. /// Reset the cell contents to an empty state without resizing.
@ -137,6 +143,7 @@ pub const Contents = struct {
/// Set the cursor value. If the value is null then the cursor is hidden. /// Set the cursor value. If the value is null then the cursor is hidden.
pub fn setCursor(self: *Contents, v: ?shaderpkg.CellText) void { pub fn setCursor(self: *Contents, v: ?shaderpkg.CellText) void {
self.fg_rows.lists[0].clearRetainingCapacity(); self.fg_rows.lists[0].clearRetainingCapacity();
self.fg_rows.lists[self.size.rows + 1].clearRetainingCapacity();
if (v) |cell| { if (v) |cell| {
self.fg_rows.lists[0].appendAssumeCapacity(cell); self.fg_rows.lists[0].appendAssumeCapacity(cell);