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:
Devin J. Pohly 2018-02-24 14:58:54 -06:00
parent 88d8293fb4
commit a5dc1b4697
4 changed files with 40 additions and 42 deletions

15
st.c
View File

@ -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();
}

2
st.h
View File

@ -84,6 +84,8 @@ typedef struct {
Line *alt; /* alternate screen */
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
View File

@ -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
View File

@ -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