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(-)master
parent
c6853fe185
commit
ee7fd748ac
18
st.c
18
st.c
|
@ -164,7 +164,7 @@ typedef struct {
|
||||||
int col; /* nb col */
|
int col; /* nb col */
|
||||||
Line* line; /* screen */
|
Line* line; /* screen */
|
||||||
Line* alt; /* alternate screen */
|
Line* alt; /* alternate screen */
|
||||||
bool* dirty; /* dirtyness of lines */
|
bool* dirty; /* dirtyness of lines */
|
||||||
TCursor c; /* cursor */
|
TCursor c; /* cursor */
|
||||||
int top; /* top scroll limit */
|
int top; /* top scroll limit */
|
||||||
int bot; /* bottom scroll limit */
|
int bot; /* bottom scroll limit */
|
||||||
|
@ -172,6 +172,7 @@ typedef struct {
|
||||||
int esc; /* escape state flags */
|
int esc; /* escape state flags */
|
||||||
char title[ESC_TITLE_SIZ];
|
char title[ESC_TITLE_SIZ];
|
||||||
int titlelen;
|
int titlelen;
|
||||||
|
bool *tabs;
|
||||||
} Term;
|
} Term;
|
||||||
|
|
||||||
/* Purely graphic info */
|
/* Purely graphic info */
|
||||||
|
@ -847,12 +848,16 @@ tcursor(int mode) {
|
||||||
|
|
||||||
void
|
void
|
||||||
treset(void) {
|
treset(void) {
|
||||||
|
unsigned i;
|
||||||
term.c = (TCursor){{
|
term.c = (TCursor){{
|
||||||
.mode = ATTR_NULL,
|
.mode = ATTR_NULL,
|
||||||
.fg = DefaultFG,
|
.fg = DefaultFG,
|
||||||
.bg = DefaultBG
|
.bg = DefaultBG
|
||||||
}, .x = 0, .y = 0, .state = CURSOR_DEFAULT};
|
}, .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.top = 0, term.bot = term.row - 1;
|
||||||
term.mode = MODE_WRAP;
|
term.mode = MODE_WRAP;
|
||||||
tclearregion(0, 0, term.col-1, term.row-1);
|
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.line = malloc(term.row * sizeof(Line));
|
||||||
term.alt = malloc(term.row * sizeof(Line));
|
term.alt = malloc(term.row * sizeof(Line));
|
||||||
term.dirty = malloc(term.row * sizeof(*term.dirty));
|
term.dirty = malloc(term.row * sizeof(*term.dirty));
|
||||||
|
term.tabs = malloc(term.col * sizeof(*term.tabs));
|
||||||
|
|
||||||
for(row = 0; row < term.row; row++) {
|
for(row = 0; row < term.row; row++) {
|
||||||
term.line[row] = malloc(term.col * sizeof(Glyph));
|
term.line[row] = malloc(term.col * sizeof(Glyph));
|
||||||
term.alt [row] = malloc(term.col * sizeof(Glyph));
|
term.alt [row] = malloc(term.col * sizeof(Glyph));
|
||||||
term.dirty[row] = 0;
|
term.dirty[row] = 0;
|
||||||
}
|
}
|
||||||
|
memset(term.tabs, 0, term.col * sizeof(*term.tabs));
|
||||||
/* setup screen */
|
/* setup screen */
|
||||||
treset();
|
treset();
|
||||||
}
|
}
|
||||||
|
@ -1588,6 +1595,7 @@ tresize(int col, int row) {
|
||||||
term.line = realloc(term.line, row * sizeof(Line));
|
term.line = realloc(term.line, row * sizeof(Line));
|
||||||
term.alt = realloc(term.alt, row * sizeof(Line));
|
term.alt = realloc(term.alt, row * sizeof(Line));
|
||||||
term.dirty = realloc(term.dirty, row * sizeof(*term.dirty));
|
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 */
|
/* resize each row to new width, zero-pad if needed */
|
||||||
for(i = 0; i < minrow; i++) {
|
for(i = 0; i < minrow; i++) {
|
||||||
|
@ -1606,7 +1614,15 @@ tresize(int col, int row) {
|
||||||
term.line[i] = calloc(col, sizeof(Glyph));
|
term.line[i] = calloc(col, sizeof(Glyph));
|
||||||
term.alt [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 */
|
/* update terminal size */
|
||||||
term.col = col, term.row = row;
|
term.col = col, term.row = row;
|
||||||
/* make use of the LIMIT in tmoveto */
|
/* make use of the LIMIT in tmoveto */
|
||||||
|
|
Reference in New Issue