# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit a5dc1b46976b2252f9d7bb68f126c4b0f351dd1a
    parent 88d8293fb4ba150a5f19d58d133b5db93d9dcfa5
    Author: Devin J. Pohly <djpohly@gmail.com>
    Date:   Sat, 24 Feb 2018 14:58:54 -0600

    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>

    Diffstat:
    Mst.c | 15++++++++++++++-
    Mst.h | 4+++-
    Mwin.h | 2+-
    Mx.c | 61++++++++++++++++++++++---------------------------------------

    4 files changed, 40 insertions(+), 42 deletions(-)
    diff --git a/st.c b/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();
     }

    diff --git a/st.h b/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 */
    diff --git a/win.h b/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);
    diff --git a/x.c b/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