Pull term references out of xdrawcursor
authorDevin J. Pohly <djpohly@gmail.com>
Sat, 24 Feb 2018 20:58:54 +0000 (14:58 -0600)
committerDevin J. Pohly <djpohly@gmail.com>
Mon, 26 Feb 2018 03:56:26 +0000 (21:56 -0600)
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>
st.c
st.h
win.h
x.c

diff --git a/st.c b/st.c
index 504239e..4bf6378 100644 (file)
--- 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
index 7026de8..27c48cf 100644 (file)
--- 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
index 6e662af..7a866fd 100644 (file)
--- 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
index 96944ee..d205ca7 100644 (file)
--- 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