=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/grid.c,v retrieving revision 1.75 retrieving revision 1.76 diff -u -r1.75 -r1.76 --- src/usr.bin/tmux/grid.c 2017/08/30 18:13:47 1.75 +++ src/usr.bin/tmux/grid.c 2017/09/10 14:36:12 1.76 @@ -1,4 +1,4 @@ -/* $OpenBSD: grid.c,v 1.75 2017/08/30 18:13:47 nicm Exp $ */ +/* $OpenBSD: grid.c,v 1.76 2017/09/10 14:36:12 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -94,6 +94,48 @@ return (0); } +/* Free up unused extended cells. */ +static void +grid_compact_line(struct grid_line *gl) +{ + int new_extdsize = 0; + struct grid_cell *new_extddata; + struct grid_cell_entry *gce; + struct grid_cell *gc; + u_int px, idx; + + if (gl->extdsize == 0) + return; + + for (px = 0; px < gl->cellsize; px++) { + gce = &gl->celldata[px]; + if (gce->flags & GRID_FLAG_EXTENDED) + new_extdsize++; + } + + if (new_extdsize == 0) { + free(gl->extddata); + gl->extddata = NULL; + gl->extdsize = 0; + return; + } + new_extddata = xreallocarray(NULL, new_extdsize, sizeof *gl->extddata); + + idx = 0; + for (px = 0; px < gl->cellsize; px++) { + gce = &gl->celldata[px]; + if (gce->flags & GRID_FLAG_EXTENDED) { + gc = &gl->extddata[gce->offset]; + memcpy(&new_extddata[idx], gc, sizeof *gc); + gce->offset = idx++; + } + } + + free(gl->extddata); + gl->extddata = new_extddata; + gl->extdsize = new_extdsize; +} + /* Set cell as extended. */ static struct grid_cell * grid_extended_cell(struct grid_line *gl, struct grid_cell_entry *gce, @@ -285,6 +327,7 @@ grid_empty_line(gd, yy, bg); gd->hscrolled++; + grid_compact_line(&gd->linedata[gd->hsize]); gd->hsize++; }