diff options
| -rw-r--r-- | st.c | 79 | 
1 files changed, 34 insertions, 45 deletions
@@ -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;  typedef 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  tresize(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);  | 
