Got rid of redundant Glyph state.
authorAlexander Sedov <alex0player@gmail.com>
Mon, 15 Apr 2013 13:13:19 +0000 (17:13 +0400)
committerChristoph Lohmann <20h@r-36.net>
Thu, 18 Apr 2013 04:48:06 +0000 (06:48 +0200)
Now, newly allocated Glyphs are set to spaces and current cursor colors
with tclearregion() routine.

Signed-off-by: Christoph Lohmann <20h@r-36.net>
st.c

diff --git a/st.c b/st.c
index 9587886..53c524f 100644 (file)
--- 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);