Fix grid clear code to correctly clear with the default background

colour rather than ending up with the used count higher than the total
size, GitHub issue 1829.
This commit is contained in:
nicm 2019-07-16 10:30:56 +00:00
parent eac055bfaf
commit b89f2f28bb
2 changed files with 18 additions and 11 deletions

View File

@ -214,7 +214,6 @@ grid_view_delete_cells(struct grid *gd, u_int px, u_int py, u_int nx, u_int bg)
sx = grid_view_x(gd, gd->sx); sx = grid_view_x(gd, gd->sx);
grid_move_cells(gd, px, px + nx, py, sx - px - nx, bg); grid_move_cells(gd, px, px + nx, py, sx - px - nx, bg);
grid_clear(gd, sx - nx, py, px + nx - (sx - nx), 1, bg);
} }
/* Convert cells into a string. */ /* Convert cells into a string. */

28
grid.c
View File

@ -547,7 +547,7 @@ void
grid_clear(struct grid *gd, u_int px, u_int py, u_int nx, u_int ny, u_int bg) grid_clear(struct grid *gd, u_int px, u_int py, u_int nx, u_int ny, u_int bg)
{ {
struct grid_line *gl; struct grid_line *gl;
u_int xx, yy; u_int xx, yy, ox, sx;
if (nx == 0 || ny == 0) if (nx == 0 || ny == 0)
return; return;
@ -564,16 +564,20 @@ grid_clear(struct grid *gd, u_int px, u_int py, u_int nx, u_int ny, u_int bg)
for (yy = py; yy < py + ny; yy++) { for (yy = py; yy < py + ny; yy++) {
gl = &gd->linedata[yy]; gl = &gd->linedata[yy];
if (px + nx >= gd->sx && px < gl->cellused)
gl->cellused = px; sx = gd->sx;
if (px > gl->cellsize && COLOUR_DEFAULT(bg)) if (sx > gl->cellsize)
continue; sx = gl->cellsize;
if (px + nx >= gl->cellsize && COLOUR_DEFAULT(bg)) { ox = nx;
gl->cellsize = px; if (COLOUR_DEFAULT(bg)) {
continue; if (px > sx)
continue;
if (px + nx > sx)
ox = sx - px;
} }
grid_expand_line(gd, yy, px + nx, 8); /* default bg first */
for (xx = px; xx < px + nx; xx++) grid_expand_line(gd, yy, px + ox, 8); /* default bg first */
for (xx = px; xx < px + ox; xx++)
grid_clear_cell(gd, xx, yy, bg); grid_clear_cell(gd, xx, yy, bg);
} }
} }
@ -1216,6 +1220,10 @@ grid_reflow(struct grid *gd, u_int sx)
struct grid_cell gc; struct grid_cell gc;
u_int yy, width, i, at, first; u_int yy, width, i, at, first;
/* Do not reflow to the same size. */
if (sx == gd->sx)
return;
/* /*
* Create a destination grid. This is just used as a container for the * Create a destination grid. This is just used as a container for the
* line data and may not be fully valid. * line data and may not be fully valid.