summaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--grid-view.c1
-rw-r--r--grid.c11
-rw-r--r--screen-write.c2
-rw-r--r--screen.c15
-rw-r--r--tmux.h1
5 files changed, 23 insertions, 7 deletions
diff --git a/grid-view.c b/grid-view.c
index 0989f800..8160679d 100644
--- a/grid-view.c
+++ b/grid-view.c
@@ -67,6 +67,7 @@ grid_view_clear_history(struct grid *gd)
grid_collect_history(gd);
grid_scroll_history(gd);
}
+ gd->hscrolled = 0;
}
/* Clear area. */
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);
diff --git a/screen-write.c b/screen-write.c
index 3c4d2758..94ce359f 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -1016,7 +1016,7 @@ screen_write_clearhistory(struct screen_write_ctx *ctx)
struct grid *gd = s->grid;
grid_move_lines(gd, 0, gd->hsize, gd->sy);
- gd->hsize = 0;
+ gd->hscrolled = gd->hsize = 0;
}
/* Write cell data. */
diff --git a/screen.c b/screen.c
index f5f39d37..8e4f8a65 100644
--- a/screen.c
+++ b/screen.c
@@ -177,8 +177,9 @@ screen_resize_y(struct screen *s, u_int sy)
* If the height is decreasing, delete lines from the bottom until
* hitting the cursor, then push lines from the top into the history.
*
- * When increasing, pull as many lines as possible from the history to
- * the top, then fill the remaining with blanks at the bottom.
+ * When increasing, pull as many lines as possible from scrolled
+ * history (not explicitly cleared from view) to the top, then fill the
+ * remaining with blanks at the bottom.
*/
/* Size decreasing. */
@@ -200,9 +201,10 @@ screen_resize_y(struct screen *s, u_int sy)
* lines from the top.
*/
available = s->cy;
- if (gd->flags & GRID_HISTORY)
+ if (gd->flags & GRID_HISTORY) {
+ gd->hscrolled += needed;
gd->hsize += needed;
- else if (needed > 0 && available > 0) {
+ } else if (needed > 0 && available > 0) {
if (available > needed)
available = needed;
grid_view_delete_lines(gd, 0, available);
@@ -219,13 +221,14 @@ screen_resize_y(struct screen *s, u_int sy)
needed = sy - oldy;
/*
- * Try to pull as much as possible out of the history, if is
+ * Try to pull as much as possible out of scrolled history, if is
* is enabled.
*/
- available = gd->hsize;
+ available = gd->hscrolled;
if (gd->flags & GRID_HISTORY && available > 0) {
if (available > needed)
available = needed;
+ gd->hscrolled -= available;
gd->hsize -= available;
s->cy += available;
} else
diff --git a/tmux.h b/tmux.h
index f9ce0309..d1879e54 100644
--- a/tmux.h
+++ b/tmux.h
@@ -691,6 +691,7 @@ struct grid {
u_int sx;
u_int sy;
+ u_int hscrolled;
u_int hsize;
u_int hlimit;