Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam 2016-09-03 00:01:14 +01:00
commit 999c1c771b
5 changed files with 23 additions and 7 deletions

View File

@ -67,6 +67,7 @@ grid_view_clear_history(struct grid *gd)
grid_collect_history(gd); grid_collect_history(gd);
grid_scroll_history(gd); grid_scroll_history(gd);
} }
gd->hscrolled = 0;
} }
/* Clear area. */ /* Clear area. */

11
grid.c
View File

@ -99,6 +99,7 @@ grid_create(u_int sx, u_int sy, u_int hlimit)
gd->flags = GRID_HISTORY; gd->flags = GRID_HISTORY;
gd->hscrolled = 0;
gd->hsize = 0; gd->hsize = 0;
gd->hlimit = hlimit; gd->hlimit = hlimit;
@ -170,6 +171,8 @@ grid_collect_history(struct grid *gd)
grid_move_lines(gd, 0, yy, gd->hsize + gd->sy - yy); grid_move_lines(gd, 0, yy, gd->hsize + gd->sy - yy);
gd->hsize -= 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); sizeof *gd->linedata);
memset(&gd->linedata[yy], 0, sizeof gd->linedata[yy]); memset(&gd->linedata[yy], 0, sizeof gd->linedata[yy]);
gd->hscrolled++;
gd->hsize++; gd->hsize++;
} }
@ -196,7 +200,9 @@ grid_clear_history(struct grid *gd)
grid_clear_lines(gd, 0, gd->hsize); grid_clear_lines(gd, 0, gd->hsize);
grid_move_lines(gd, 0, gd->hsize, gd->sy); grid_move_lines(gd, 0, gd->hsize, gd->sy);
gd->hscrolled = 0;
gd->hsize = 0; gd->hsize = 0;
gd->linedata = xreallocarray(gd->linedata, gd->sy, gd->linedata = xreallocarray(gd->linedata, gd->sy,
sizeof *gd->linedata); 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); memset(gl_lower, 0, sizeof *gl_lower);
/* Move the history offset down over the line. */ /* Move the history offset down over the line. */
gd->hscrolled++;
gd->hsize++; 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); grid_reflow_join(dst, &py, src_gl, new_x);
} }
previous_wrapped = (src_gl->flags & GRID_LINE_WRAPPED); 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); grid_destroy(src);

View File

@ -1016,7 +1016,7 @@ screen_write_clearhistory(struct screen_write_ctx *ctx)
struct grid *gd = s->grid; struct grid *gd = s->grid;
grid_move_lines(gd, 0, gd->hsize, gd->sy); grid_move_lines(gd, 0, gd->hsize, gd->sy);
gd->hsize = 0; gd->hscrolled = gd->hsize = 0;
} }
/* Write cell data. */ /* Write cell data. */

View File

@ -177,8 +177,9 @@ screen_resize_y(struct screen *s, u_int sy)
* If the height is decreasing, delete lines from the bottom until * If the height is decreasing, delete lines from the bottom until
* hitting the cursor, then push lines from the top into the history. * hitting the cursor, then push lines from the top into the history.
* *
* When increasing, pull as many lines as possible from the history to * When increasing, pull as many lines as possible from scrolled
* the top, then fill the remaining with blanks at the bottom. * history (not explicitly cleared from view) to the top, then fill the
* remaining with blanks at the bottom.
*/ */
/* Size decreasing. */ /* Size decreasing. */
@ -200,9 +201,10 @@ screen_resize_y(struct screen *s, u_int sy)
* lines from the top. * lines from the top.
*/ */
available = s->cy; available = s->cy;
if (gd->flags & GRID_HISTORY) if (gd->flags & GRID_HISTORY) {
gd->hscrolled += needed;
gd->hsize += needed; gd->hsize += needed;
else if (needed > 0 && available > 0) { } else if (needed > 0 && available > 0) {
if (available > needed) if (available > needed)
available = needed; available = needed;
grid_view_delete_lines(gd, 0, available); grid_view_delete_lines(gd, 0, available);
@ -219,13 +221,14 @@ screen_resize_y(struct screen *s, u_int sy)
needed = sy - oldy; 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. * is enabled.
*/ */
available = gd->hsize; available = gd->hscrolled;
if (gd->flags & GRID_HISTORY && available > 0) { if (gd->flags & GRID_HISTORY && available > 0) {
if (available > needed) if (available > needed)
available = needed; available = needed;
gd->hscrolled -= available;
gd->hsize -= available; gd->hsize -= available;
s->cy += available; s->cy += available;
} else } else

1
tmux.h
View File

@ -693,6 +693,7 @@ struct grid {
u_int sx; u_int sx;
u_int sy; u_int sy;
u_int hscrolled;
u_int hsize; u_int hsize;
u_int hlimit; u_int hlimit;