diff options
| author | Aurélien Aptel <aurelien.aptel@gmail.com> | 2009-06-17 02:58:40 +0200 | 
|---|---|---|
| committer | Aurélien Aptel <aurelien.aptel@gmail.com> | 2009-06-17 02:58:40 +0200 | 
| commit | b8ffa1d7e9cffda8bd8cc7f4ccf612201a617b34 (patch) | |
| tree | f14b7c1a189687dbad04116044d49dfcefe93307 | |
| parent | d5f4554431f82424af40600ed6835672ab8e44ae (diff) | |
| download | st-fork-b8ffa1d7e9cffda8bd8cc7f4ccf612201a617b34.tar.gz | |
fixed the scrolling bug and cleaned some stuff.
| -rw-r--r-- | st.c | 129 | 
1 files changed, 68 insertions, 61 deletions
| @@ -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);  			}  		}  	} | 
