# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit b8ffa1d7e9cffda8bd8cc7f4ccf612201a617b34
    parent d5f4554431f82424af40600ed6835672ab8e44ae
    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:
    Mst.c | 129++++++++++++++++++++++++++++++++++++++++++-------------------------------------

    1 file changed, 68 insertions(+), 61 deletions(-)
    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);
     			}
     		}
     	}