aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto E. Vargas Caballero <k0ga@shike2.com>2012-08-29 19:59:37 +0200
committerRoberto E. Vargas Caballero <k0ga@shike2.com>2012-08-29 19:59:37 +0200
commitee7fd748ac7bfabda2ac37251d230b45adb3e138 (patch)
treeb350439ebeb67f710486ce3d881b6a86ed973cb3
parentc6853fe18564437fe0a4cb06565a0a7d63d40b5a (diff)
Add tabs field into Term struct
Tabs stop are simulated in st using a fixed size of 8, always, without be worried about sequences changing the tab stops. A user can put a tab stop in each horizontal position of the screen, so we need at least one flag for each column of the screen. In the same way as dirty flags is used for the rows, it is used a bool dinamic array. Signed-off-by: Roberto E. Vargas Caballero <k0ga@shike2.com> --- st.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-)
-rw-r--r--st.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/st.c b/st.c
index 4fc4d3d..d169ddf 100644
--- a/st.c
+++ b/st.c
@@ -164,7 +164,7 @@ typedef struct {
int col; /* nb col */
Line* line; /* screen */
Line* alt; /* alternate screen */
- bool* dirty; /* dirtyness of lines */
+ bool* dirty; /* dirtyness of lines */
TCursor c; /* cursor */
int top; /* top scroll limit */
int bot; /* bottom scroll limit */
@@ -172,6 +172,7 @@ typedef struct {
int esc; /* escape state flags */
char title[ESC_TITLE_SIZ];
int titlelen;
+ bool *tabs;
} Term;
/* Purely graphic info */
@@ -847,12 +848,16 @@ tcursor(int mode) {
void
treset(void) {
+ unsigned i;
term.c = (TCursor){{
.mode = ATTR_NULL,
.fg = DefaultFG,
.bg = DefaultBG
}, .x = 0, .y = 0, .state = CURSOR_DEFAULT};
-
+
+ memset(term.tabs, 0, term.col * sizeof(*term.tabs));
+ for (i = TAB; i < term.col; i += TAB)
+ term.tabs[i] = 1;
term.top = 0, term.bot = term.row - 1;
term.mode = MODE_WRAP;
tclearregion(0, 0, term.col-1, term.row-1);
@@ -865,12 +870,14 @@ tnew(int col, int row) {
term.line = malloc(term.row * sizeof(Line));
term.alt = malloc(term.row * sizeof(Line));
term.dirty = malloc(term.row * sizeof(*term.dirty));
+ term.tabs = malloc(term.col * sizeof(*term.tabs));
for(row = 0; row < term.row; row++) {
term.line[row] = malloc(term.col * sizeof(Glyph));
term.alt [row] = malloc(term.col * sizeof(Glyph));
term.dirty[row] = 0;
}
+ memset(term.tabs, 0, term.col * sizeof(*term.tabs));
/* setup screen */
treset();
}
@@ -1588,6 +1595,7 @@ tresize(int col, int row) {
term.line = realloc(term.line, row * sizeof(Line));
term.alt = realloc(term.alt, row * sizeof(Line));
term.dirty = realloc(term.dirty, row * sizeof(*term.dirty));
+ term.tabs = realloc(term.tabs, col * sizeof(*term.tabs));
/* resize each row to new width, zero-pad if needed */
for(i = 0; i < minrow; i++) {
@@ -1606,7 +1614,15 @@ tresize(int col, int row) {
term.line[i] = calloc(col, sizeof(Glyph));
term.alt [i] = calloc(col, sizeof(Glyph));
}
-
+ if (col > term.col) {
+ bool *bp = term.tabs + term.col;
+
+ memset(bp, 0, sizeof(*term.tabs) * (col - term.col));
+ while (--bp > term.tabs && !*bp)
+ /* nothing */ ;
+ for (bp += TAB; bp < term.tabs + col; bp += TAB)
+ *bp = 1;
+ }
/* update terminal size */
term.col = col, term.row = row;
/* make use of the LIMIT in tmoveto */