# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit ee7fd748ac7bfabda2ac37251d230b45adb3e138
    parent c6853fe18564437fe0a4cb06565a0a7d63d40b5a
    Author: Roberto E. Vargas Caballero <k0ga@shike2.com>
    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 <k0ga@shike2.com>
    ---
     st.c |   22 +++++++++++++++++++---
     1 file changed, 19 insertions(+), 3 deletions(-)
    Diffstat:
    Mst.c | 22+++++++++++++++++++---

    1 file changed, 19 insertions(+), 3 deletions(-)
    diff --git 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 */