~petersanchez/st

a5dc1b46976b2252f9d7bb68f126c4b0f351dd1a — Devin J. Pohly 6 years ago 88d8293
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>
4 files changed, 40 insertions(+), 42 deletions(-)

M st.c
M st.h
M win.h
M x.c
M st.c => st.c +14 -1
@@ 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();
}


M st.h => st.h +3 -1
@@ 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 */

M win.h => win.h +1 -1
@@ 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);

M x.c => x.c +22 -39
@@ 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