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>
This commit is contained in:
		
							
								
								
									
										15
									
								
								st.c
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								st.c
									
									
									
									
									
								
							@@ -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();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								st.h
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								st.h
									
									
									
									
									
								
							@@ -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 */
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								win.h
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								win.h
									
									
									
									
									
								
							@@ -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);
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										61
									
								
								x.c
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								x.c
									
									
									
									
									
								
							@@ -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
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user