Got rid of redundant Glyph state. - st - simple terminal (HTM) git clone https://git.parazyd.org/st (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit b7e6a5c825a8d786a0cc4dbacc82df1c90ad7020 (DIR) parent 3ae02990648447ec3252b42f5b64e18818c19fd8 (HTM) Author: Alexander Sedov <alex0player@gmail.com> 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 <20h@r-36.net> Diffstat: M st.c | 79 +++++++++++++------------------ 1 file changed, 34 insertions(+), 45 deletions(-) --- (DIR) 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) && strcmp(last->c, " ") != 0)) + 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) <= doubleclicktimeout) { /* double click to select word */ sel.bx = sel.ex; - while(sel.bx > 0 && term.line[sel.ey][sel.bx-1].state & GLYPH_SET && - term.line[sel.ey][sel.bx-1].c[0] != ' ') { + while(sel.bx > 0 && term.line[sel.ey][sel.bx-1].c[0] != ' ') { sel.bx--; } sel.b.x = sel.bx; - while(sel.ex < term.col-1 && term.line[sel.ey][sel.ex+1].state & GLYPH_SET && - term.line[sel.ey][sel.ex+1].c[0] != ' ') { + while(sel.ex < term.col-1 && term.line[sel.ey][sel.ex+1].c[0] != ' ') { 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);