summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@cvs.openbsd.org>2009-06-24 19:12:45 +0000
committerNicholas Marriott <nicm@cvs.openbsd.org>2009-06-24 19:12:45 +0000
commita36d3850b9ad2575290e4099fc678732bbb3df81 (patch)
tree68e53d91091f8d172cb853af1d95b1dfe7cd3325
parentaaf1282134b6983cdd9bb9532d6101324fb84e95 (diff)
Change to match xterm's resizing behaviour, including pushing lines into the
history from the top when reducing vertical size and pulling them again when increasing size. ok todd sthen
-rw-r--r--usr.bin/tmux/screen.c82
1 files changed, 48 insertions, 34 deletions
diff --git a/usr.bin/tmux/screen.c b/usr.bin/tmux/screen.c
index e21cb642361..a611a7dda61 100644
--- a/usr.bin/tmux/screen.c
+++ b/usr.bin/tmux/screen.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: screen.c,v 1.3 2009/06/04 18:48:24 nicm Exp $ */
+/* $OpenBSD: screen.c,v 1.4 2009/06/24 19:12:44 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -169,38 +169,42 @@ void
screen_resize_y(struct screen *s, u_int sy)
{
struct grid *gd = s->grid;
- u_int oy, yy, ny;
+ u_int needed, available, oldy, i;
if (sy == 0)
fatalx("zero size");
+ oldy = screen_size_y(s);
+
+ /*
+ * When resizing:
+ *
+ * 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.
+ */
/* Size decreasing. */
- if (sy < screen_size_y(s)) {
- oy = screen_size_y(s);
-
- if (s->cy != 0) {
- /*
- * The cursor is not at the start. Try to remove as
- * many lines as possible from the top. (Up to the
- * cursor line.)
- */
- ny = s->cy;
- if (ny > oy - sy)
- ny = oy - sy;
-
- grid_view_delete_lines(gd, 0, ny);
-
- s->cy -= ny;
- oy -= ny;
+ if (sy < oldy) {
+ needed = oldy - sy;
+
+ /* Delete as many lines as possible from the bottom. */
+ available = oldy - 1 - s->cy;
+ if (available > 0) {
+ if (available > needed)
+ available = needed;
+ grid_view_delete_lines(gd, oldy - available, available);
}
+ needed -= available;
- if (sy < oy) {
- /* Remove any remaining lines from the bottom. */
- grid_view_delete_lines(gd, sy, oy - sy);
- if (s->cy >= sy)
- s->cy = sy - 1;
- }
- }
+ /*
+ * Now just increase the history size to take over the lines
+ * which are left. XXX Should apply history limit?
+ */
+ gd->hsize += needed;
+ s->cy -= needed;
+ }
/* Resize line arrays. */
gd->size = xrealloc(gd->size, gd->hsize + sy, sizeof *gd->size);
@@ -209,18 +213,28 @@ screen_resize_y(struct screen *s, u_int sy)
gd->udata = xrealloc(gd->udata, gd->hsize + sy, sizeof *gd->udata);
/* Size increasing. */
- if (sy > screen_size_y(s)) {
- oy = screen_size_y(s);
- for (yy = gd->hsize + oy; yy < gd->hsize + sy; yy++) {
- gd->size[yy] = 0;
- gd->data[yy] = NULL;
- gd->usize[yy] = 0;
- gd->udata[yy] = NULL;
+ if (sy > oldy) {
+ needed = sy - oldy;
+
+ /* Try to pull as much as possible out of the history. */
+ available = gd->hsize;
+ if (available > 0) {
+ if (available > needed)
+ available = needed;
+ gd->hsize -= available;
+ s->cy += available;
+ }
+ needed -= available;
+
+ /* Then fill the rest in with blanks. */
+ for (i = gd->hsize + sy - needed; i < gd->hsize + sy; i++) {
+ gd->size[i] = gd->usize[i] = 0;
+ gd->data[i] = gd->udata[i] = NULL;
}
}
+ /* Set the new size, and reset the scroll region. */
gd->sy = sy;
-
s->rupper = 0;
s->rlower = screen_size_y(s) - 1;
}