summaryrefslogtreecommitdiffstats
path: root/screen.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicm@openbsd.org>2009-06-04 18:48:24 +0000
committerNicholas Marriott <nicm@openbsd.org>2009-06-04 18:48:24 +0000
commitd42fb43f4f8e21dcc37e9b090842f61e39e8d6f4 (patch)
tree1503c0a8c01c44b2eee6634092eae1e963d358ba /screen.c
parentd6015824ddcd2b0373232e528ade8b40e12c1a0a (diff)
Proper support for tab stops (\033H etc), using a bitstring(3). Makes another
vttest test happy.
Diffstat (limited to 'screen.c')
-rw-r--r--screen.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/screen.c b/screen.c
index 53b17bce..5c689c8a 100644
--- a/screen.c
+++ b/screen.c
@@ -18,6 +18,7 @@
#include <sys/types.h>
+#include <stdlib.h>
#include <string.h>
#include <vis.h>
@@ -34,6 +35,8 @@ screen_init(struct screen *s, u_int sx, u_int sy, u_int hlimit)
s->title = xstrdup("");
+ s->tabs = NULL;
+
screen_reinit(s);
}
@@ -48,6 +51,8 @@ screen_reinit(struct screen *s)
s->rlower = screen_size_y(s) - 1;
s->mode = MODE_CURSOR;
+
+ screen_reset_tabs(s);
grid_clear_lines(s->grid, s->grid->hsize, s->grid->sy - 1);
@@ -62,6 +67,21 @@ screen_free(struct screen *s)
grid_destroy(s->grid);
}
+/* Reset tabs to default, eight spaces apart. */
+void
+screen_reset_tabs(struct screen *s)
+{
+ u_int i;
+
+ if (s->tabs != NULL)
+ xfree(s->tabs);
+
+ if ((s->tabs = bit_alloc(screen_size_x(s))) == NULL)
+ fatal("bit_alloc failed");
+ for (i = 8; i < screen_size_x(s); i += 8)
+ bit_set(s->tabs, i);
+}
+
/* Set screen title. */
void
screen_set_title(struct screen *s, const char *title)
@@ -83,8 +103,17 @@ screen_resize(struct screen *s, u_int sx, u_int sy)
if (sy < 1)
sy = 1;
- if (sx != screen_size_x(s))
+ if (sx != screen_size_x(s)) {
screen_resize_x(s, sx);
+
+ /*
+ * It is unclear what should happen to tabs on resize. xterm
+ * seems to try and maintain them, rxvt resets them. Resetting
+ * is simpler and more reliable so let's do that.
+ */
+ screen_reset_tabs(s);
+ }
+
if (sy != screen_size_y(s))
screen_resize_y(s, sy);
}