Got rid of redundant Glyph state. - st - Simple Terminal
       
 (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:
         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;
        
        ttypedef 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
        ttresize(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);