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