tPull term references out of xdrawcursor - st - [fork] customized build of st, … | |
git clone git://src.adamsgaard.dk/st | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
commit a5dc1b46976b2252f9d7bb68f126c4b0f351dd1a | |
parent 88d8293fb4ba150a5f19d58d133b5db93d9dcfa5 | |
Author: Devin J. Pohly <[email protected]> | |
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 | |
tto refactor further if we can unify "clear old cursor" and "draw new | |
cursor" functionality.) | |
Signed-off-by: Devin J. Pohly <[email protected]> | |
Diffstat: | |
M st.c | 15 ++++++++++++++- | |
M st.h | 4 +++- | |
M win.h | 2 +- | |
M x.c | 61 +++++++++++------------------… | |
4 files changed, 40 insertions(+), 42 deletions(-) | |
--- | |
diff --git a/st.c b/st.c | |
t@@ -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 | |
t@@ -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 | |
t@@ -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 | |
t@@ -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 { | |
t@@ -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; | |
t@@ -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 |