st

fork of suckless's simple terminal
Index Commits 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