summaryrefslogtreecommitdiffstats
path: root/grid.c
diff options
context:
space:
mode:
authornicm <nicm>2016-09-02 20:57:20 +0000
committernicm <nicm>2016-09-02 20:57:20 +0000
commit2627ab322e0e8dffbf86b1c2eb969139a8062174 (patch)
tree15cc4f5210c0145ef14433470ba0c96c0860c6ea /grid.c
parent537964b92dcd2b4a30fdf37a370f9a204fff561c (diff)
Remember the number of lines scrolled into the history (versus cleared
into the history) and when resizing only use scrolled lines and not cleared lines (which are probably not intended to reappear). From Chaoren Lin.
Diffstat (limited to 'grid.c')
-rw-r--r--grid.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/grid.c b/grid.c
index f0eda7e0..50766a88 100644
--- a/grid.c
+++ b/grid.c
@@ -99,6 +99,7 @@ grid_create(u_int sx, u_int sy, u_int hlimit)
gd->flags = GRID_HISTORY;
+ gd->hscrolled = 0;
gd->hsize = 0;
gd->hlimit = hlimit;
@@ -170,6 +171,8 @@ grid_collect_history(struct grid *gd)
grid_move_lines(gd, 0, yy, gd->hsize + gd->sy - yy);
gd->hsize -= yy;
+ if (gd->hscrolled > gd->hsize)
+ gd->hscrolled = gd->hsize;
}
/*
@@ -186,6 +189,7 @@ grid_scroll_history(struct grid *gd)
sizeof *gd->linedata);
memset(&gd->linedata[yy], 0, sizeof gd->linedata[yy]);
+ gd->hscrolled++;
gd->hsize++;
}
@@ -196,7 +200,9 @@ grid_clear_history(struct grid *gd)
grid_clear_lines(gd, 0, gd->hsize);
grid_move_lines(gd, 0, gd->hsize, gd->sy);
+ gd->hscrolled = 0;
gd->hsize = 0;
+
gd->linedata = xreallocarray(gd->linedata, gd->sy,
sizeof *gd->linedata);
}
@@ -231,6 +237,7 @@ grid_scroll_history_region(struct grid *gd, u_int upper, u_int lower)
memset(gl_lower, 0, sizeof *gl_lower);
/* Move the history offset down over the line. */
+ gd->hscrolled++;
gd->hsize++;
}
@@ -914,6 +921,10 @@ grid_reflow(struct grid *dst, struct grid *src, u_int new_x)
grid_reflow_join(dst, &py, src_gl, new_x);
}
previous_wrapped = (src_gl->flags & GRID_LINE_WRAPPED);
+
+ /* This is where we started scrolling. */
+ if (line == sy + src->hsize - src->hscrolled - 1)
+ dst->hscrolled = 0;
}
grid_destroy(src);