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(-)
Roberto E. Vargas Caballero k0ga@shike2.com
1 files changed,
19 insertions(+),
3 deletions(-)
jump to
M
st.c
→
st.c
@@ -164,7 +164,7 @@ int row; /* nb row */
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 @@ int mode; /* terminal mode flags */
int esc; /* escape state flags */ char title[ESC_TITLE_SIZ]; int titlelen; + bool *tabs; } Term; /* Purely graphic info */@@ -847,12 +848,16 @@ }
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 @@ term.row = row, term.col = col;
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 @@ /* resize to new height */
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 @@ term.dirty[i] = 1;
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 */