[hackers] [st] Pull term references out of xdrawcursor || Devin J. Pohly

From: <git_AT_suckless.org>
Date: Fri, 9 Mar 2018 15:37:39 +0100 (CET)

commit a5dc1b46976b2252f9d7bb68f126c4b0f351dd1a
Author: Devin J. Pohly <djpohly_AT_gmail.com>
AuthorDate: Sat Feb 24 14:58:54 2018 -0600
Commit: Devin J. Pohly <djpohly_AT_gmail.com>
CommitDate: Sun Feb 25 21:56:26 2018 -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_AT_gmail.com>

diff --git a/st.c b/st.c
index 504239e..4bf6378 100644
--- a/st.c
+++ b/st.c
_AT_@ -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
--- a/st.h
+++ b/st.h
_AT_@ -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
--- a/win.h
+++ b/win.h
_AT_@ -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
--- a/x.c
+++ b/x.c
_AT_@ -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 {
_AT_@ -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;
_AT_@ -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
Received on Fri Mar 09 2018 - 15:37:39 CET

This archive was generated by hypermail 2.3.0 : Fri Mar 09 2018 - 15:50:54 CET