diff options
| -rw-r--r-- | st.c | 22 | 
1 files changed, 19 insertions, 3 deletions
@@ -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 */  | 
