diff options
| author | Devin J. Pohly <djpohly@gmail.com> | 2018-02-24 14:58:54 -0600 | 
|---|---|---|
| committer | Devin J. Pohly <djpohly@gmail.com> | 2018-02-25 21:56:26 -0600 | 
| commit | a5dc1b46976b2252f9d7bb68f126c4b0f351dd1a (patch) | |
| tree | a9ce0c1a4dd254ccb71a61a08dc3df54dc4f2814 | |
| parent | 88d8293fb4ba150a5f19d58d133b5db93d9dcfa5 (diff) | |
Pull term references out of xdrawcursor
Gradually reducing x.c dependency on Term object.  Old and new cursor
glyph/position are passed to xdrawcursor.  (There may be an opportunity
to refactor further if we can unify "clear old cursor" and "draw new
cursor" functionality.)
Signed-off-by: Devin J. Pohly <djpohly@gmail.com>
| -rw-r--r-- | st.c | 15 | ||||
| -rw-r--r-- | st.h | 4 | ||||
| -rw-r--r-- | win.h | 2 | ||||
| -rw-r--r-- | x.c | 61 | 
4 files changed, 40 insertions, 42 deletions
| @@ -2544,10 +2544,23 @@ drawregion(int x1, int y1, int x2, int y2)  void  draw(void)  { +	int cx = term.c.x; +  	if (!xstartdraw())  		return; + +	/* adjust cursor position */ +	LIMIT(term.ocx, 0, term.col-1); +	LIMIT(term.ocy, 0, term.row-1); +	if (term.line[term.ocy][term.ocx].mode & ATTR_WDUMMY) +		term.ocx--; +	if (term.line[term.c.y][cx].mode & ATTR_WDUMMY) +		cx--; +  	drawregion(0, 0, term.col, term.row); -	xdrawcursor(); +	xdrawcursor(cx, term.c.y, term.line[term.c.y][cx], +			term.ocx, term.ocy, term.line[term.ocy][term.ocx]); +	term.ocx = cx, term.ocy = term.c.y;  	xfinishdraw();  } @@ -82,8 +82,10 @@ typedef struct {  	int col;      /* nb col */  	Line *line;   /* screen */  	Line *alt;    /* alternate screen */ -	int *dirty;  /* dirtyness of lines */ +	int *dirty;   /* dirtyness of lines */  	TCursor c;    /* cursor */ +	int ocx;      /* old cursor col */ +	int ocy;      /* old cursor row */  	int top;      /* top    scroll limit */  	int bot;      /* bottom scroll limit */  	int mode;     /* terminal mode flags */ @@ -25,7 +25,7 @@ enum win_mode {  void xbell(void);  void xclipcopy(void); -void xdrawcursor(void); +void xdrawcursor(int, int, Glyph, int, int, Glyph);  void xdrawline(Line, int, int, int);  void xhints(void);  void xfinishdraw(void); @@ -1387,41 +1387,26 @@ xdrawglyph(Glyph g, int x, int y)  }  void -xdrawcursor(void) +xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og)  { -	static int oldx = 0, oldy = 0; -	int curx; -	Glyph g = {' ', ATTR_NULL, defaultbg, defaultcs}, og;  	Color drawcol; -	LIMIT(oldx, 0, term.col-1); -	LIMIT(oldy, 0, term.row-1); - -	curx = term.c.x; - -	/* adjust position if in dummy */ -	if (term.line[oldy][oldx].mode & ATTR_WDUMMY) -		oldx--; -	if (term.line[term.c.y][curx].mode & ATTR_WDUMMY) -		curx--; -  	/* remove the old cursor */ -	og = term.line[oldy][oldx]; -	if (selected(oldx, oldy)) +	if (selected(ox, oy))  		og.mode ^= ATTR_REVERSE; -	xdrawglyph(og, oldx, oldy); - -	g.u = term.line[term.c.y][term.c.x].u; -	g.mode |= term.line[term.c.y][term.c.x].mode & -	          (ATTR_BOLD | ATTR_ITALIC | ATTR_UNDERLINE | ATTR_STRUCK); +	xdrawglyph(og, ox, oy);  	/*  	 * Select the right color for the right mode.  	 */ +	g.mode &= ATTR_BOLD|ATTR_ITALIC|ATTR_UNDERLINE|ATTR_STRUCK|ATTR_WIDE; +	g.fg = defaultbg; +	g.bg = defaultcs; +  	if (IS_SET(MODE_REVERSE)) {  		g.mode |= ATTR_REVERSE;  		g.bg = defaultfg; -		if (selected(term.c.x, term.c.y)) { +		if (selected(cx, cy)) {  			drawcol = dc.col[defaultcs];  			g.fg = defaultrcs;  		} else { @@ -1429,7 +1414,7 @@ xdrawcursor(void)  			g.fg = defaultcs;  		}  	} else { -		if (selected(term.c.x, term.c.y)) { +		if (selected(cx, cy)) {  			drawcol = dc.col[defaultrcs];  			g.fg = defaultfg;  			g.bg = defaultrcs; @@ -1449,44 +1434,42 @@ xdrawcursor(void)  		case 0: /* Blinking Block */  		case 1: /* Blinking Block (Default) */  		case 2: /* Steady Block */ -			g.mode |= term.line[term.c.y][curx].mode & ATTR_WIDE; -			xdrawglyph(g, term.c.x, term.c.y); +			xdrawglyph(g, cx, cy);  			break;  		case 3: /* Blinking Underline */  		case 4: /* Steady Underline */  			XftDrawRect(xw.draw, &drawcol, -					borderpx + curx * win.cw, -					borderpx + (term.c.y + 1) * win.ch - \ +					borderpx + cx * win.cw, +					borderpx + (cy + 1) * win.ch - \  						cursorthickness,  					win.cw, cursorthickness);  			break;  		case 5: /* Blinking bar */  		case 6: /* Steady bar */  			XftDrawRect(xw.draw, &drawcol, -					borderpx + curx * win.cw, -					borderpx + term.c.y * win.ch, +					borderpx + cx * win.cw, +					borderpx + cy * win.ch,  					cursorthickness, win.ch);  			break;  		}  	} else {  		XftDrawRect(xw.draw, &drawcol, -				borderpx + curx * win.cw, -				borderpx + term.c.y * win.ch, +				borderpx + cx * win.cw, +				borderpx + cy * win.ch,  				win.cw - 1, 1);  		XftDrawRect(xw.draw, &drawcol, -				borderpx + curx * win.cw, -				borderpx + term.c.y * win.ch, +				borderpx + cx * win.cw, +				borderpx + cy * win.ch,  				1, win.ch - 1);  		XftDrawRect(xw.draw, &drawcol, -				borderpx + (curx + 1) * win.cw - 1, -				borderpx + term.c.y * win.ch, +				borderpx + (cx + 1) * win.cw - 1, +				borderpx + cy * win.ch,  				1, win.ch - 1);  		XftDrawRect(xw.draw, &drawcol, -				borderpx + curx * win.cw, -				borderpx + (term.c.y + 1) * win.ch - 1, +				borderpx + cx * win.cw, +				borderpx + (cy + 1) * win.ch - 1,  				win.cw, 1);  	} -	oldx = curx, oldy = term.c.y;  }  void |