Implementing Back Color Erase (BCE). - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit b78c5085f72d66de26468e2c07fb3c72d0afe63b
 (DIR) parent b4b513c791e01e46399b460789b830ddfc7cb425
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Sun, 20 Jan 2013 14:54:35 +0100
       
       Implementing Back Color Erase (BCE).
       
       Diffstat:
         M st.c                                |      63 +++++++++++++++++++------------
         M st.info                             |       2 +-
       
       2 files changed, 40 insertions(+), 25 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -152,7 +152,7 @@ typedef struct {
                uchar state; /* state flags    */
        } Glyph;
        
       -typedef Glyph* Line;
       +typedef Glyph *Line;
        
        typedef struct {
                Glyph attr;         /* current char attributes */
       @@ -303,7 +303,7 @@ static void strhandle(void);
        static void strparse(void);
        static void strreset(void);
        
       -static void tclearregion(int, int, int, int);
       +static void tclearregion(int, int, int, int, int);
        static void tcursor(int);
        static void tdeletechar(int);
        static void tdeleteline(int);
       @@ -1113,7 +1113,7 @@ treset(void) {
                term.bot = term.row - 1;
                term.mode = MODE_WRAP;
        
       -        tclearregion(0, 0, term.col-1, term.row-1);
       +        tclearregion(0, 0, term.col-1, term.row-1, 0);
                tmoveto(0, 0);
                tcursor(CURSOR_SAVE);
        }
       @@ -1157,7 +1157,7 @@ tscrolldown(int orig, int n) {
        
                LIMIT(n, 0, term.bot-orig+1);
        
       -        tclearregion(0, term.bot-n+1, term.col-1, term.bot);
       +        tclearregion(0, term.bot-n+1, term.col-1, term.bot, 0);
        
                for(i = term.bot; i >= orig+n; i--) {
                        temp = term.line[i];
       @@ -1177,7 +1177,7 @@ tscrollup(int orig, int n) {
                Line temp;
                LIMIT(n, 0, term.bot-orig+1);
        
       -        tclearregion(0, orig, term.col-1, orig+n-1);
       +        tclearregion(0, orig, term.col-1, orig+n-1, 0);
        
                for(i = orig; i <= term.bot-n; i++) {
                         temp = term.line[i];
       @@ -1305,7 +1305,7 @@ tsetchar(char *c, Glyph *attr, int x, int y) {
        }
        
        void
       -tclearregion(int x1, int y1, int x2, int y2) {
       +tclearregion(int x1, int y1, int x2, int y2, int bce) {
                int x, y, temp;
        
                if(x1 > x2)
       @@ -1320,8 +1320,15 @@ tclearregion(int x1, int y1, int x2, int y2) {
        
                for(y = y1; y <= y2; y++) {
                        term.dirty[y] = 1;
       -                for(x = x1; x <= x2; x++)
       -                        term.line[y][x].state = 0;
       +                for(x = x1; x <= x2; x++) {
       +                        if(bce) {
       +                                term.line[y][x] = term.c.attr;
       +                                memcpy(term.line[y][x].c, " ", 2);
       +                                term.line[y][x].state |= GLYPH_SET;
       +                        } else {
       +                                term.line[y][x].state = 0;
       +                        }
       +                }
                }
        }
        
       @@ -1334,13 +1341,13 @@ tdeletechar(int n) {
                term.dirty[term.c.y] = 1;
        
                if(src >= term.col) {
       -                tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
       +                tclearregion(term.c.x, term.c.y, term.col-1, term.c.y, 0);
                        return;
                }
        
                memmove(&term.line[term.c.y][dst], &term.line[term.c.y][src],
                                size * sizeof(Glyph));
       -        tclearregion(term.col-n, term.c.y, term.col-1, term.c.y);
       +        tclearregion(term.col-n, term.c.y, term.col-1, term.c.y, 0);
        }
        
        void
       @@ -1352,13 +1359,13 @@ tinsertblank(int n) {
                term.dirty[term.c.y] = 1;
        
                if(dst >= term.col) {
       -                tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
       +                tclearregion(term.c.x, term.c.y, term.col-1, term.c.y, 0);
                        return;
                }
        
                memmove(&term.line[term.c.y][dst], &term.line[term.c.y][src],
                                size * sizeof(Glyph));
       -        tclearregion(src, term.c.y, dst - 1, term.c.y);
       +        tclearregion(src, term.c.y, dst - 1, term.c.y, 0);
        }
        
        void
       @@ -1542,8 +1549,10 @@ tsetmode(bool priv, bool set, int *args, int narg) {
                                case 47:
                                case 1047: {
                                        alt = IS_SET(MODE_ALTSCREEN);
       -                                if(alt)
       -                                        tclearregion(0, 0, term.col-1, term.row-1);
       +                                if(alt) {
       +                                        tclearregion(0, 0, term.col-1,
       +                                                        term.row-1, 0);
       +                                }
                                        if(set ^ alt)                /* set is always 1 or 0 */
                                                tswapscreen();
                                        if(*args != 1049)
       @@ -1662,17 +1671,19 @@ csihandle(void) {
                        sel.bx = -1;
                        switch(csiescseq.arg[0]) {
                        case 0: /* below */
       -                        tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
       -                        if(term.c.y < term.row-1)
       -                                tclearregion(0, term.c.y+1, term.col-1, term.row-1);
       +                        tclearregion(term.c.x, term.c.y, term.col-1, term.c.y, 1);
       +                        if(term.c.y < term.row-1) {
       +                                tclearregion(0, term.c.y+1, term.col-1,
       +                                                term.row-1, 1);
       +                        }
                                break;
                        case 1: /* above */
                                if(term.c.y > 1)
       -                                tclearregion(0, 0, term.col-1, term.c.y-1);
       -                        tclearregion(0, term.c.y, term.c.x, term.c.y);
       +                                tclearregion(0, 0, term.col-1, term.c.y-1, 1);
       +                        tclearregion(0, term.c.y, term.c.x, term.c.y, 1);
                                break;
                        case 2: /* all */
       -                        tclearregion(0, 0, term.col-1, term.row-1);
       +                        tclearregion(0, 0, term.col-1, term.row-1, 1);
                                break;
                        default:
                                goto unknown;
       @@ -1681,13 +1692,14 @@ csihandle(void) {
                case 'K': /* EL -- Clear line */
                        switch(csiescseq.arg[0]) {
                        case 0: /* right */
       -                        tclearregion(term.c.x, term.c.y, term.col-1, term.c.y);
       +                        tclearregion(term.c.x, term.c.y, term.col-1,
       +                                        term.c.y, 1);
                                break;
                        case 1: /* left */
       -                        tclearregion(0, term.c.y, term.c.x, term.c.y);
       +                        tclearregion(0, term.c.y, term.c.x, term.c.y, 1);
                                break;
                        case 2: /* all */
       -                        tclearregion(0, term.c.y, term.col-1, term.c.y);
       +                        tclearregion(0, term.c.y, term.col-1, term.c.y, 1);
                                break;
                        }
                        break;
       @@ -1712,7 +1724,8 @@ csihandle(void) {
                        break;
                case 'X': /* ECH -- Erase <n> char */
                        DEFAULT(csiescseq.arg[0], 1);
       -                tclearregion(term.c.x, term.c.y, term.c.x + csiescseq.arg[0], term.c.y);
       +                tclearregion(term.c.x, term.c.y, term.c.x + csiescseq.arg[0],
       +                                term.c.y, 0);
                        break;
                case 'P': /* DCH -- Delete <n> char */
                        DEFAULT(csiescseq.arg[0], 1);
       @@ -2505,6 +2518,7 @@ xinit(void) {
                        xw.fy = 0;
                }
        
       +        /* Events */
                attrs.background_pixel = dc.col[defaultbg].pixel;
                attrs.border_pixel = dc.col[defaultbg].pixel;
                attrs.bit_gravity = NorthWestGravity;
       @@ -2898,6 +2912,7 @@ drawregion(int x1, int y1, int x2, int y2) {
                                                ox = x;
                                                base = new;
                                        }
       +
                                        sl = utf8size(new.c);
                                        memcpy(buf+ib, new.c, sl);
                                        ib += sl;
 (DIR) diff --git a/st.info b/st.info
       @@ -3,7 +3,7 @@
        st| simpleterm,
                acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
                am,
       -#        bce,
       +        bce,
                bel=^G,
        #        blink=\E[5m,
                bold=\E[1m,