summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--usr.bin/tmux/grid-view.c3
-rw-r--r--usr.bin/tmux/grid.c13
-rw-r--r--usr.bin/tmux/screen-write.c4
-rw-r--r--usr.bin/tmux/screen.c17
-rw-r--r--usr.bin/tmux/tmux.h3
5 files changed, 28 insertions, 12 deletions
diff --git a/usr.bin/tmux/grid-view.c b/usr.bin/tmux/grid-view.c
index adb20b93e1b..95041712ff7 100644
--- a/usr.bin/tmux/grid-view.c
+++ b/usr.bin/tmux/grid-view.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: grid-view.c,v 1.24 2016/01/19 15:59:12 nicm Exp $ */
+/* $OpenBSD: grid-view.c,v 1.25 2016/09/02 20:57:20 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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/usr.bin/tmux/grid.c b/usr.bin/tmux/grid.c
index 9fce513f98c..364eaba687b 100644
--- a/usr.bin/tmux/grid.c
+++ b/usr.bin/tmux/grid.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: grid.c,v 1.54 2016/07/15 00:49:08 nicm Exp $ */
+/* $OpenBSD: grid.c,v 1.55 2016/09/02 20:57:20 nicm Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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/usr.bin/tmux/screen-write.c b/usr.bin/tmux/screen-write.c
index fac63708c56..40ce80c7de3 100644
--- a/usr.bin/tmux/screen-write.c
+++ b/usr.bin/tmux/screen-write.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: screen-write.c,v 1.92 2016/07/15 00:49:08 nicm Exp $ */
+/* $OpenBSD: screen-write.c,v 1.93 2016/09/02 20:57:20 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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/usr.bin/tmux/screen.c b/usr.bin/tmux/screen.c
index 2ede81792f8..429aeaa8476 100644
--- a/usr.bin/tmux/screen.c
+++ b/usr.bin/tmux/screen.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: screen.c,v 1.39 2016/07/15 00:49:08 nicm Exp $ */
+/* $OpenBSD: screen.c,v 1.40 2016/09/02 20:57:20 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -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/usr.bin/tmux/tmux.h b/usr.bin/tmux/tmux.h
index 335fb7d4dfa..8fc21251735 100644
--- a/usr.bin/tmux/tmux.h
+++ b/usr.bin/tmux/tmux.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: tmux.h,v 1.641 2016/08/03 09:07:02 nicm Exp $ */
+/* $OpenBSD: tmux.h,v 1.642 2016/09/02 20:57:20 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicholas.marriott@gmail.com>
@@ -691,6 +691,7 @@ struct grid {
u_int sx;
u_int sy;
+ u_int hscrolled;
u_int hsize;
u_int hlimit;