compositor: handle invalid screen positions after resize gracefully

The screen resize logic needs to be refactored to be simpler and more
deterministic. Until then, we need to handle attempts to draw outside of the
screen size gracefully, just like the old vim code did.

fixes #9989
This commit is contained in:
Björn Linse
2019-08-11 21:37:35 +02:00
parent 5ad67af3c1
commit ba0aaf012a
2 changed files with 21 additions and 3 deletions

View File

@@ -4375,7 +4375,7 @@ static void grid_put_linebuf(ScreenGrid *grid, int row, int coloff, int endcol,
screen_adjust_grid(&grid, &row, &coloff);
// Safety check. Avoids clang warnings down the call stack.
if (grid->chars == NULL || row >= grid->Rows || col >= grid->Columns) {
if (grid->chars == NULL || row >= grid->Rows || coloff >= grid->Columns) {
DLOG("invalid state, skipped");
return;
}

View File

@@ -480,8 +480,26 @@ static void ui_comp_raw_line(UI *ui, Integer grid, Integer row,
if (curgrid != &default_grid) {
flags = flags & ~kLineFlagWrap;
}
assert(row < default_grid.Rows);
assert(clearcol <= default_grid.Columns);
assert(endcol <= clearcol);
// TODO(bfredl): this should not really be necessary. But on some condition
// when resizing nvim, a window will be attempted to be drawn on the older
// and possibly larger global screen size.
if (row >= default_grid.Rows) {
DLOG("compositor: invalid row %"PRId64" on grid %"PRId64, row, grid);
return;
}
if (clearcol > default_grid.Columns) {
DLOG("compositor: invalid last column %"PRId64" on grid %"PRId64,
clearcol, grid);
if (startcol >= default_grid.Columns) {
return;
}
clearcol = default_grid.Columns;
endcol = MIN(endcol, clearcol);
}
if (flags & kLineFlagInvalid
|| kv_size(layers) > curgrid->comp_index+1
|| curgrid->blending) {