diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2009-07-14 06:40:33 +0000 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2009-07-14 06:40:33 +0000 |
commit | e63567d51ce76e45013b4a392eba1443fd5b3493 (patch) | |
tree | 12a2ff2c3c03c37d7a7c15adc08de027cc07bd45 /grid.c | |
parent | f41ef2198ba430a7b376c205ad799fcc0f5b2685 (diff) | |
download | rtmux-e63567d51ce76e45013b4a392eba1443fd5b3493.tar.gz rtmux-e63567d51ce76e45013b4a392eba1443fd5b3493.tar.bz2 rtmux-e63567d51ce76e45013b4a392eba1443fd5b3493.zip |
Support "alternate screen" mode (terminfo smcup/rmcup) typically used by full
screen interactive programs to preserve the screen contents. When activated, it
saves a copy of the visible grid and disables scrolling into and resizing out
of the history; when deactivated the visible data is restored and the history
reenabled.
Diffstat (limited to 'grid.c')
-rw-r--r-- | grid.c | 48 |
1 files changed, 47 insertions, 1 deletions
@@ -1,4 +1,4 @@ -/* $Id: grid.c,v 1.23 2009-07-14 06:38:14 nicm Exp $ */ +/* $Id: grid.c,v 1.24 2009-07-14 06:40:33 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net> @@ -95,6 +95,8 @@ grid_create(u_int sx, u_int sy, u_int hlimit) gd->sx = sx; gd->sy = sy; + gd->flags = GRID_HISTORY; + gd->hsize = 0; gd->hlimit = hlimit; @@ -517,3 +519,47 @@ grid_string_cells(struct grid *gd, u_int px, u_int py, u_int nx) buf[off] = '\0'; return (buf); } + +/* + * Duplicate a set of lines between two grids. If there aren't enough lines in + * either source or destination, the number of lines is limited to the number + * available. + */ +void +grid_duplicate_lines( + struct grid *dst, u_int dy, struct grid *src, u_int sy, u_int ny) +{ + u_int yy; + + GRID_DEBUG(src, "dy=%u, sy=%u, ny=%u", dy, sy, ny); + + if (dy + ny > dst->hsize + dst->sy) + ny = dst->hsize + dst->sy - dy; + if (sy + ny > src->hsize + src->sy) + ny = src->hsize + src->sy - sy; + grid_clear_lines(dst, dy, ny); + + for (yy = 0; yy < ny; yy++) { + dst->size[dy] = src->size[sy]; + if (src->size[sy] == 0) + dst->data[dy] = NULL; + else { + dst->data[dy] = xcalloc( + src->size[sy], sizeof **dst->data); + memcpy(dst->data[dy], src->data[sy], + src->size[sy] * (sizeof **dst->data)); + } + + dst->usize[dy] = src->usize[sy]; + if (src->usize[sy] == 0) + dst->udata[dy] = NULL; + else { + dst->udata[sy] = xcalloc( + src->usize[sy], sizeof **dst->udata); + memcpy(dst->udata[dy], src->udata[sy], + src->usize[sy] * (sizeof **dst->udata)); + } + + sy++; dy++; + } +} |