From d42fb43f4f8e21dcc37e9b090842f61e39e8d6f4 Mon Sep 17 00:00:00 2001 From: Nicholas Marriott Date: Thu, 4 Jun 2009 18:48:24 +0000 Subject: Proper support for tab stops (\033H etc), using a bitstring(3). Makes another vttest test happy. --- screen.c | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'screen.c') diff --git a/screen.c b/screen.c index 53b17bce..5c689c8a 100644 --- a/screen.c +++ b/screen.c @@ -18,6 +18,7 @@ #include +#include #include #include @@ -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); } -- cgit v1.2.3