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:
Daniel Eklöf 2019-07-10 16:27:55 +02:00
parent 8f0d574dcb
commit 1ff1b3a71e
No known key found for this signature in database
GPG key ID: 5BBD4992C116573F
7 changed files with 68 additions and 45 deletions

28
grid.h
View file

@ -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;
}