fixed the scrolling bug and cleaned some stuff. - 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 b8ffa1d7e9cffda8bd8cc7f4ccf612201a617b34
 (DIR) parent d5f4554431f82424af40600ed6835672ab8e44ae
 (HTM) Author: Aurélien Aptel <aurelien.aptel@gmail.com>
       Date:   Wed, 17 Jun 2009 02:58:40 +0200
       
       fixed the scrolling bug and cleaned some stuff.
       
       Diffstat:
         M st.c                                |     129 ++++++++++++++++---------------
       
       1 file changed, 68 insertions(+), 61 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -37,7 +37,7 @@
        enum { ATnone=0 , ATreverse=1 , ATunderline=2, ATbold=4 };
        enum { CSup, CSdown, CSright, CSleft, CShide, CSdraw, CSwrap, CSsave, CSload };
        enum { CRset=1, CRupdate=2 };
       -enum { TMwrap=1, TMinsert=2, TMaltcharset };
       +enum { TMwrap=1, TMinsert=2 };
        enum { SCupdate, SCredraw };
        
        typedef int Color;
       @@ -154,6 +154,7 @@ void xdrawc(int, int, Glyph);
        void xinit(void);
        void xscroll(void);
        
       +void cursor(int);
        
        /* Globals */
        DC dc;
       @@ -201,7 +202,6 @@ sigchld(int a) {
                        exit(EXIT_FAILURE);
        }
        
       -
        void
        ttynew(void) {
                int m, s;
       @@ -328,21 +328,19 @@ void
        tscroll(void) {
                Line temp = term.line[term.top];
                int i;
       -
       +        /* X stuff _before_ the line swapping (results in wrong line index) */
       +        xscroll();
                for(i = term.top; i < term.bot; i++)
                        term.line[i] = term.line[i+1];
                memset(temp, 0, sizeof(Glyph) * term.col);
                term.line[term.bot] = temp;
       -        xscroll();          
        }
        
        void
        tnewline(void) {
                int y = term.c.y + 1;
       -
       -        if(y > term.bot) {
       +        if(y > term.bot)
                        tscroll(), y = term.bot;
       -        }
                tmoveto(0, y);
        }
        
       @@ -477,6 +475,13 @@ tinsertblank(int n) {
        }
        
        void
       +tsetlinestate(int n, int state) {
       +        int i;
       +        for(i = 0; i < term.col; i++)
       +                term.line[n][i].state |= state;
       +}
       +
       +void
        tinsertblankline (int n) {
                int i;
                Line blank;
       @@ -497,10 +502,11 @@ tinsertblankline (int n) {
                        term.line[i-n] = blank;
                        /* blank it */
                        memset(blank, 0, term.col * sizeof(Glyph));
       +                tsetlinestate(i, CRupdate);
       +                tsetlinestate(i-n, CRupdate);
                }
        }
        
       -
        void
        tdeleteline(int n) {
                int i;
       @@ -522,6 +528,8 @@ tdeleteline(int n) {
                        term.line[i+n] = blank;
                        /* blank it */
                        memset(blank, 0, term.col * sizeof(Glyph));
       +                tsetlinestate(i, CRupdate);
       +                tsetlinestate(i-n, CRupdate);
                }
        }
        
       @@ -529,48 +537,48 @@ void
        tsetattr(int *attr, int l) {
                int i;
        
       -                for(i = 0; i < l; i++) {
       -                        switch(attr[i]) {
       -                        case 0:
       -                                memset(&term.c.attr, 0, sizeof(term.c.attr));
       -                                term.c.attr.fg = DefaultFG;
       -                                term.c.attr.bg = DefaultBG;
       -                                break;
       -                        case 1:
       -                                term.c.attr.mode |= ATbold;         
       -                                break;
       -                        case 4: 
       -                                term.c.attr.mode |= ATunderline;
       -                                break;
       -                        case 7: 
       -                                term.c.attr.mode |= ATreverse;        
       -                                break;
       -                        case 8:
       -                                term.c.hidden = CShide;
       -                                break;
       -                        case 22: 
       -                                term.c.attr.mode &= ~ATbold;  
       -                                break;
       -                        case 24: 
       -                                term.c.attr.mode &= ~ATunderline;
       -                                break;
       -                        case 27: 
       -                                term.c.attr.mode &= ~ATreverse;         
       -                                break;
       -                        case 39:
       -                                term.c.attr.fg = DefaultFG;
       -                                break;
       -                        case 49:
       -                                term.c.attr.fg = DefaultBG;
       -                                break;
       -                        default:
       -                                if(BETWEEN(attr[i], 30, 37))
       -                                        term.c.attr.fg = attr[i] - 30;
       -                                else if(BETWEEN(attr[i], 40, 47))
       -                                        term.c.attr.bg = attr[i] - 40;
       -                                break;
       -                        }
       +        for(i = 0; i < l; i++) {
       +                switch(attr[i]) {
       +                case 0:
       +                        memset(&term.c.attr, 0, sizeof(term.c.attr));
       +                        term.c.attr.fg = DefaultFG;
       +                        term.c.attr.bg = DefaultBG;
       +                        break;
       +                case 1:
       +                        term.c.attr.mode |= ATbold;         
       +                        break;
       +                case 4: 
       +                        term.c.attr.mode |= ATunderline;
       +                        break;
       +                case 7: 
       +                        term.c.attr.mode |= ATreverse;        
       +                        break;
       +                case 8:
       +                        term.c.hidden = CShide;
       +                        break;
       +                case 22: 
       +                        term.c.attr.mode &= ~ATbold;  
       +                        break;
       +                case 24: 
       +                        term.c.attr.mode &= ~ATunderline;
       +                        break;
       +                case 27: 
       +                        term.c.attr.mode &= ~ATreverse;         
       +                        break;
       +                case 39:
       +                        term.c.attr.fg = DefaultFG;
       +                        break;
       +                case 49:
       +                        term.c.attr.fg = DefaultBG;
       +                        break;
       +                default:
       +                        if(BETWEEN(attr[i], 30, 37))
       +                                term.c.attr.fg = attr[i] - 30;
       +                        else if(BETWEEN(attr[i], 40, 47))
       +                                term.c.attr.bg = attr[i] - 40;
       +                        break;
                        }
       +        }
        }
        
        void
       @@ -588,9 +596,8 @@ tsetscroll(int t, int b) {
                term.bot = b;         
        }
        
       -
        void
       -eschandle(void) { 
       +eschandle(void) {
                switch(escseq.pre) {
                default:
                        goto unknown_seq;
       @@ -846,7 +853,6 @@ xgetcol(const char *s) {
                return color.pixel;
        }
        
       -
        void
        xclear(int x1, int y1, int x2, int y2) {
                XClearArea(xw.dis, xw.win, 
       @@ -855,7 +861,6 @@ xclear(int x1, int y1, int x2, int y2) {
                                False);
        }
        
       -
        void
        xscroll(void) {
                int srcy = (term.top+1) * xw.ch;
       @@ -867,9 +872,6 @@ xscroll(void) {
                xclear(0, term.bot, term.col-1, term.bot);
        }
        
       -
       -
       -
        void
        xinit(void) {
                XGCValues values;
       @@ -963,14 +965,15 @@ xcursor(int mode) {
                /* remove the old cursor */
                if(term.line[oldy][oldx].state & CRset)
                        xdrawc(oldx, oldy, term.line[oldy][oldx]);
       -        else xclear(oldx, oldy, oldx, oldy); /* XXX: maybe a bug */
       -        if(mode == CSdraw && !term.c.hidden) {
       +        else 
       +                xclear(oldx, oldy, oldx, oldy);
       +        /* draw the new one */
       +        if(mode == CSdraw) {
                        xdrawc(term.c.x, term.c.y, g);
                        oldx = term.c.x, oldy = term.c.y;
                }
        }
        
       -
        void
        draw(int redraw_all) {
                int x, y;
       @@ -978,14 +981,18 @@ draw(int redraw_all) {
        
                if(redraw_all)
                        XClearWindow(xw.dis, xw.win);
       +
                /* XXX: drawing could be optimised */
                for(y = 0; y < term.row; y++) {
                        for(x = 0; x < term.col; x++) {
                                changed = term.line[y][x].state & CRupdate;
                                set = term.line[y][x].state & CRset;
       -                        if((changed && set) || (redraw_all && set)) {
       +                        if(redraw_all || changed) {
                                        term.line[y][x].state &= ~CRupdate;
       -                                xdrawc(x, y, term.line[y][x]);
       +                                if(set)
       +                                        xdrawc(x, y, term.line[y][x]);
       +                                else
       +                                        xclear(x, y, x, y);
                                }
                        }
                }