| Got rid of redundant Glyph state. - st - simple terminal | |
| git clone git://git.suckless.org/st | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit b7e6a5c825a8d786a0cc4dbacc82df1c90ad7020 | |
| parent 3ae02990648447ec3252b42f5b64e18818c19fd8 | |
| Author: Alexander Sedov <[email protected]> | |
| Date: Mon, 15 Apr 2013 17:13:19 +0400 | |
| Got rid of redundant Glyph state. | |
| Now, newly allocated Glyphs are set to spaces and current cursor colors | |
| with tclearregion() routine. | |
| Signed-off-by: Christoph Lohmann <[email protected]> | |
| Diffstat: | |
| M st.c | 79 +++++++++++++----------------… | |
| 1 file changed, 34 insertions(+), 45 deletions(-) | |
| --- | |
| diff --git a/st.c b/st.c | |
| @@ -98,11 +98,6 @@ enum cursor_state { | |
| CURSOR_ORIGIN = 2 | |
| }; | |
| -enum glyph_state { | |
| - GLYPH_SET = 1, | |
| - GLYPH_DIRTY = 2 | |
| -}; | |
| - | |
| enum term_mode { | |
| MODE_WRAP = 1, | |
| MODE_INSERT = 2, | |
| @@ -154,7 +149,6 @@ typedef struct { | |
| uchar mode; /* attribute flags */ | |
| ushort fg; /* foreground */ | |
| ushort bg; /* background */ | |
| - uchar state; /* state flags */ | |
| } Glyph; | |
| typedef Glyph *Line; | |
| @@ -757,7 +751,7 @@ bpress(XEvent *e) { | |
| void | |
| selcopy(void) { | |
| - char *str, *ptr, *p; | |
| + char *str, *ptr; | |
| int x, y, bufsize, isselected = 0, size; | |
| Glyph *gp, *last; | |
| @@ -773,8 +767,8 @@ selcopy(void) { | |
| gp = &term.line[y][0]; | |
| last = gp + term.col; | |
| - while(--last >= gp && !((last->state & GLYPH_SET) && \ | |
| - selected(last - gp, y) && strc… | |
| + while(--last >= gp && !(selected(last - gp, y) && \ | |
| + strcmp(last->c, " ") != 0)) | |
| /* nothing */; | |
| for(x = 0; gp <= last; x++, ++gp) { | |
| @@ -784,9 +778,8 @@ selcopy(void) { | |
| isselected = 1; | |
| } | |
| - p = (gp->state & GLYPH_SET) ? gp->c : " "; | |
| - size = utf8size(p); | |
| - memcpy(ptr, p, size); | |
| + size = utf8size(gp->c); | |
| + memcpy(ptr, gp->c, size); | |
| ptr += size; | |
| } | |
| @@ -943,13 +936,11 @@ brelease(XEvent *e) { | |
| } else if(TIMEDIFF(now, sel.tclick1) <= doubleclicktim… | |
| /* double click to select word */ | |
| sel.bx = sel.ex; | |
| - while(sel.bx > 0 && term.line[sel.ey][sel.bx-1… | |
| - term.line[sel.ey][sel.bx-1].c[… | |
| + while(sel.bx > 0 && term.line[sel.ey][sel.bx-1… | |
| sel.bx--; | |
| } | |
| sel.b.x = sel.bx; | |
| - while(sel.ex < term.col-1 && term.line[sel.ey]… | |
| - term.line[sel.ey][sel.ex+1].c[… | |
| + while(sel.ex < term.col-1 && term.line[sel.ey]… | |
| sel.ex++; | |
| } | |
| sel.e.x = sel.ex; | |
| @@ -1373,7 +1364,6 @@ tsetchar(char *c, Glyph *attr, int x, int y) { | |
| term.dirty[y] = 1; | |
| term.line[y][x] = *attr; | |
| memcpy(term.line[y][x].c, c, UTF_SIZ); | |
| - term.line[y][x].state |= GLYPH_SET; | |
| } | |
| void | |
| @@ -1395,7 +1385,6 @@ tclearregion(int x1, int y1, int x2, int y2) { | |
| for(x = x1; x <= x2; x++) { | |
| term.line[y][x] = term.c.attr; | |
| memcpy(term.line[y][x].c, " ", 2); | |
| - term.line[y][x].state |= GLYPH_SET; | |
| } | |
| } | |
| } | |
| @@ -2263,11 +2252,12 @@ tputc(char *c, int len) { | |
| int | |
| tresize(int col, int row) { | |
| - int i, x; | |
| + int i; | |
| int minrow = MIN(row, term.row); | |
| int mincol = MIN(col, term.col); | |
| int slide = term.c.y - row + 1; | |
| bool *bp; | |
| + Line *orig; | |
| if(col < 1 || row < 1) | |
| return 0; | |
| @@ -2303,10 +2293,6 @@ tresize(int col, int row) { | |
| term.dirty[i] = 1; | |
| term.line[i] = xrealloc(term.line[i], col * sizeof(Glyph)); | |
| term.alt[i] = xrealloc(term.alt[i], col * sizeof(Glyph)); | |
| - for(x = mincol; x < col; x++) { | |
| - term.line[i][x].state = 0; | |
| - term.alt[i][x].state = 0; | |
| - } | |
| } | |
| /* allocate any new rows */ | |
| @@ -2331,6 +2317,17 @@ tresize(int col, int row) { | |
| tsetscroll(0, row-1); | |
| /* make use of the LIMIT in tmoveto */ | |
| tmoveto(term.c.x, term.c.y); | |
| + /* Clearing both screens */ | |
| + orig = term.line; | |
| + do { | |
| + if(mincol < col && 0 < minrow) { | |
| + tclearregion(mincol, 0, col - 1, minrow - 1); | |
| + } | |
| + if(0 < col && minrow < row) { | |
| + tclearregion(0, minrow, col - 1, row - 1); | |
| + } | |
| + tswapscreen(); | |
| + } while(orig != term.line); | |
| return (slide > 0); | |
| } | |
| @@ -2932,22 +2929,17 @@ void | |
| xdrawcursor(void) { | |
| static int oldx = 0, oldy = 0; | |
| int sl; | |
| - Glyph g = {{' '}, ATTR_NULL, defaultbg, defaultcs, 0}; | |
| + Glyph g = {{' '}, ATTR_NULL, defaultbg, defaultcs}; | |
| LIMIT(oldx, 0, term.col-1); | |
| LIMIT(oldy, 0, term.row-1); | |
| - if(term.line[term.c.y][term.c.x].state & GLYPH_SET) | |
| - memcpy(g.c, term.line[term.c.y][term.c.x].c, UTF_SIZ); | |
| + memcpy(g.c, term.line[term.c.y][term.c.x].c, UTF_SIZ); | |
| /* remove the old cursor */ | |
| - if(term.line[oldy][oldx].state & GLYPH_SET) { | |
| - sl = utf8size(term.line[oldy][oldx].c); | |
| - xdraws(term.line[oldy][oldx].c, term.line[oldy][oldx], oldx, | |
| - oldy, 1, sl); | |
| - } else { | |
| - xtermclear(oldx, oldy, oldx, oldy); | |
| - } | |
| + sl = utf8size(term.line[oldy][oldx].c); | |
| + xdraws(term.line[oldy][oldx].c, term.line[oldy][oldx], oldx, | |
| + oldy, 1, sl); | |
| /* draw the new one */ | |
| if(!(IS_SET(MODE_HIDE))) { | |
| @@ -3045,23 +3037,20 @@ drawregion(int x1, int y1, int x2, int y2) { | |
| new = term.line[y][x]; | |
| if(ena_sel && *(new.c) && selected(x, y)) | |
| new.mode ^= ATTR_REVERSE; | |
| - if(ib > 0 && (!(new.state & GLYPH_SET) | |
| - || ATTRCMP(base, new) | |
| + if(ib > 0 && (ATTRCMP(base, new) | |
| || ib >= DRAW_BUF_SIZ-UTF_SIZ)) { | |
| xdraws(buf, base, ox, y, ic, ib); | |
| ic = ib = 0; | |
| } | |
| - if(new.state & GLYPH_SET) { | |
| - if(ib == 0) { | |
| - ox = x; | |
| - base = new; | |
| - } | |
| - | |
| - sl = utf8size(new.c); | |
| - memcpy(buf+ib, new.c, sl); | |
| - ib += sl; | |
| - ++ic; | |
| + if(ib == 0) { | |
| + ox = x; | |
| + base = new; | |
| } | |
| + | |
| + sl = utf8size(new.c); | |
| + memcpy(buf+ib, new.c, sl); | |
| + ib += sl; | |
| + ++ic; | |
| } | |
| if(ib > 0) | |
| xdraws(buf, base, ox, y, ic, ib); |