Pull term references out of xdrawcursor - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit a5dc1b46976b2252f9d7bb68f126c4b0f351dd1a
 (DIR) parent 88d8293fb4ba150a5f19d58d133b5db93d9dcfa5
 (HTM) 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:
         M st.c                                |      15 ++++++++++++++-
         M st.h                                |       4 +++-
         M win.h                               |       2 +-
         M x.c                                 |      61 +++++++++++--------------------
       
       4 files changed, 40 insertions(+), 42 deletions(-)
       ---
 (DIR) 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();
        }
        
 (DIR) 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 */
 (DIR) 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);
 (DIR) 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