=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/grid.c,v retrieving revision 1.21 retrieving revision 1.22 diff -u -r1.21 -r1.22 --- src/usr.bin/tmux/grid.c 2013/01/18 02:16:21 1.21 +++ src/usr.bin/tmux/grid.c 2013/02/05 11:08:59 1.22 @@ -1,4 +1,4 @@ -/* $OpenBSD: grid.c,v 1.21 2013/01/18 02:16:21 nicm Exp $ */ +/* $OpenBSD: grid.c,v 1.22 2013/02/05 11:08:59 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott @@ -459,4 +459,45 @@ sy++; dy++; } +} + +/* + * Reflow lines from src grid into dst grid based on width sx. Returns number + * of lines fewer in the visible area, or zero. + */ +u_int +grid_reflow(struct grid *dst, const struct grid *src, u_int sx) +{ + u_int px, py, line, cell; + int previous_wrapped; + struct grid_line *gl; + + px = py = 0; + previous_wrapped = 1; + for (line = 0; line < src->sy + src->hsize; line++) { + gl = src->linedata + line; + if (!previous_wrapped) { + px = 0; + py++; + if (py >= dst->hsize + dst->sy) + grid_scroll_history(dst); + } + for (cell = 0; cell < gl->cellsize; cell++) { + if (px == sx) { + dst->linedata[py].flags |= GRID_LINE_WRAPPED; + px = 0; + py++; + if (py >= dst->hsize + dst->sy) + grid_scroll_history(dst); + } + grid_set_cell(dst, px, py, gl->celldata + cell); + px++; + } + previous_wrapped = gl->flags & GRID_LINE_WRAPPED; + } + py++; /* account for final line, which never wraps */ + + if (py > src->sy) + return (0); + return (src->sy - py); }