mirror of
https://codeberg.org/dnkl/foot.git
synced 2026-02-04 04:06:06 -05:00
grid: don't pre-allocate the entire grid (with all scrollback lines)
The row array may now contain NULL pointers. This means the corresponding row hasn't yet been allocated and initialized. On a resize, we explicitly allocate the visible rows. Uninitialized rows are then allocated the first time they are referenced.
This commit is contained in:
parent
8f0d574dcb
commit
1ff1b3a71e
7 changed files with 68 additions and 45 deletions
28
grid.h
28
grid.h
|
|
@ -3,18 +3,34 @@
|
|||
#include <stddef.h>
|
||||
#include "terminal.h"
|
||||
|
||||
void grid_swap_row(struct grid *grid, int row_a, int row_b);
|
||||
struct row *grid_row_alloc(int cols);
|
||||
void grid_row_free(struct row *row);
|
||||
|
||||
static inline struct row *
|
||||
grid_row(struct grid *grid, int row)
|
||||
grid_row(struct grid *grid, int row_no)
|
||||
{
|
||||
assert(grid->offset >= 0);
|
||||
return grid->rows[(grid->offset + row + grid->num_rows) % grid->num_rows];
|
||||
|
||||
int real_row = (grid->offset + row_no + grid->num_rows) % grid->num_rows;
|
||||
struct row *row = grid->rows[real_row];
|
||||
|
||||
if (row == NULL) {
|
||||
row = grid_row_alloc(grid->num_cols);
|
||||
grid->rows[real_row] = row;
|
||||
}
|
||||
|
||||
return row;
|
||||
}
|
||||
|
||||
static inline struct row *
|
||||
grid_row_in_view(struct grid *grid, int row)
|
||||
grid_row_in_view(struct grid *grid, int row_no)
|
||||
{
|
||||
assert(grid->view >= 0);
|
||||
return grid->rows[(grid->view + row + grid->num_rows) % grid->num_rows];
|
||||
}
|
||||
|
||||
void grid_swap_row(struct grid *grid, int row_a, int row_b);
|
||||
int real_row = (grid->offset + row_no + grid->num_rows) % grid->num_rows;
|
||||
struct row *row = grid->rows[real_row];
|
||||
|
||||
assert(row != NULL);
|
||||
return row;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue