tAdd tabs field into Term struct - st - [fork] customized build of st, the simp… | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit ee7fd748ac7bfabda2ac37251d230b45adb3e138 | |
parent c6853fe18564437fe0a4cb06565a0a7d63d40b5a | |
Author: Roberto E. Vargas Caballero <[email protected]> | |
Date: Wed, 29 Aug 2012 19:59:37 +0200 | |
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 <[email protected]> | |
--- | |
st.c | 22 +++++++++++++++++++--- | |
1 file changed, 19 insertions(+), 3 deletions(-) | |
Diffstat: | |
M st.c | 22 +++++++++++++++++++--- | |
1 file changed, 19 insertions(+), 3 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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 */ | |
t@@ -172,6 +172,7 @@ typedef struct { | |
int esc; /* escape state flags */ | |
char title[ESC_TITLE_SIZ]; | |
int titlelen; | |
+ bool *tabs; | |
} Term; | |
/* Purely graphic info */ | |
t@@ -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); | |
t@@ -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(); | |
} | |
t@@ -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++) { | |
t@@ -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 */ |