summaryrefslogtreecommitdiffstats
path: root/grid.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2009-07-14 06:40:33 +0000
committerNicholas Marriott <nicholas.marriott@gmail.com>2009-07-14 06:40:33 +0000
commite63567d51ce76e45013b4a392eba1443fd5b3493 (patch)
tree12a2ff2c3c03c37d7a7c15adc08de027cc07bd45 /grid.c
parentf41ef2198ba430a7b376c205ad799fcc0f5b2685 (diff)
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.c48
1 files changed, 47 insertions, 1 deletions
diff --git a/grid.c b/grid.c
index f0169166..acc9ffb6 100644
--- a/grid.c
+++ b/grid.c
@@ -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++;
+ }
+}