Move win-agnostic parts of draw/drawregion to st.c - 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 88d8293fb4ba150a5f19d58d133b5db93d9dcfa5
 (DIR) parent 05c66cb37d9ff278a3e0c45682c4b5e7945deb42
 (HTM) Author: Devin J. Pohly <djpohly@gmail.com>
       Date:   Sat, 24 Feb 2018 14:53:23 -0600
       
       Move win-agnostic parts of draw/drawregion to st.c
       
       Introduces three functions to encapsulate X-specific behavior:
        * xdrawline: draws a portion of a single line (used by drawregion)
        * xbegindraw: called to prepare for drawing (will be useful for e.g.
          Wayland) and returns true if drawing should happen
        * xfinishdraw: called to finish drawing (used by draw)
       
       Signed-off-by: Devin J. Pohly <djpohly@gmail.com>
       
       Diffstat:
         M st.c                                |      25 +++++++++++++++++++++++++
         M st.h                                |       1 +
         M win.h                               |       7 ++++---
         M x.c                                 |      79 ++++++++++++++-----------------
       
       4 files changed, 65 insertions(+), 47 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -166,6 +166,8 @@ static int32_t tdefcolor(int *, int *, int);
        static void tdeftran(char);
        static void tstrsequence(uchar);
        
       +static void drawregion(int, int, int, int);
       +
        static void selscroll(int, int);
        static void selsnap(int *, int *, int);
        
       @@ -2527,6 +2529,29 @@ resettitle(void)
        }
        
        void
       +drawregion(int x1, int y1, int x2, int y2)
       +{
       +        int y;
       +        for (y = y1; y < y2; y++) {
       +                if (!term.dirty[y])
       +                        continue;
       +
       +                term.dirty[y] = 0;
       +                xdrawline(term.line[y], x1, y, x2);
       +        }
       +}
       +
       +void
       +draw(void)
       +{
       +        if (!xstartdraw())
       +                return;
       +        drawregion(0, 0, term.col, term.row);
       +        xdrawcursor();
       +        xfinishdraw();
       +}
       +
       +void
        redraw(void)
        {
                tfulldirt();
 (DIR) diff --git a/st.h b/st.h
       @@ -131,6 +131,7 @@ typedef union {
        
        void die(const char *, ...);
        void redraw(void);
       +void draw(void);
        
        void iso14755(const Arg *);
        void printscreen(const Arg *);
 (DIR) diff --git a/win.h b/win.h
       @@ -23,12 +23,12 @@ enum win_mode {
                                  |MODE_MOUSEMANY,
        };
        
       -void draw(void);
       -void drawregion(int, int, int, int);
       -
        void xbell(void);
        void xclipcopy(void);
       +void xdrawcursor(void);
       +void xdrawline(Line, int, int, int);
        void xhints(void);
       +void xfinishdraw(void);
        void xloadcols(void);
        int xsetcolorname(int, const char *);
        void xsettitle(char *);
       @@ -36,3 +36,4 @@ int xsetcursor(int);
        void xsetmode(int, unsigned int);
        void xsetpointermotion(int);
        void xsetsel(char *);
       +int xstartdraw(void);
 (DIR) diff --git a/x.c b/x.c
       @@ -129,7 +129,6 @@ static int xmakeglyphfontspecs(XftGlyphFontSpec *, const Glyph *, int, int, int)
        static void xdrawglyphfontspecs(const XftGlyphFontSpec *, Glyph, int, int, int);
        static void xdrawglyph(Glyph, int, int);
        static void xclear(int, int, int, int);
       -static void xdrawcursor(void);
        static int xgeommasktogravity(int);
        static void xinit(void);
        static void cresize(int, int);
       @@ -1512,59 +1511,51 @@ xsettitle(char *p)
                XFree(prop.value);
        }
        
       -void
       -draw(void)
       +int
       +xstartdraw(void)
        {
       -        drawregion(0, 0, term.col, term.row);
       -        XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w,
       -                        win.h, 0, 0);
       -        XSetForeground(xw.dpy, dc.gc,
       -                        dc.col[IS_SET(MODE_REVERSE)?
       -                                defaultfg : defaultbg].pixel);
       +        return IS_SET(MODE_VISIBLE);
        }
        
        void
       -drawregion(int x1, int y1, int x2, int y2)
       +xdrawline(Line line, int x1, int y1, int x2)
        {
       -        int i, x, y, ox, numspecs;
       +        int i, x, ox, numspecs;
                Glyph base, new;
       -        XftGlyphFontSpec *specs;
       +        XftGlyphFontSpec *specs = xw.specbuf;
        
       -        if (!(IS_SET(MODE_VISIBLE)))
       -                return;
       -
       -        for (y = y1; y < y2; y++) {
       -                if (!term.dirty[y])
       +        numspecs = xmakeglyphfontspecs(specs, &line[x1], x2 - x1, x1, y1);
       +        i = ox = 0;
       +        for (x = x1; x < x2 && i < numspecs; x++) {
       +                new = line[x];
       +                if (new.mode == ATTR_WDUMMY)
                                continue;
       -
       -                term.dirty[y] = 0;
       -
       -                specs = xw.specbuf;
       -                numspecs = xmakeglyphfontspecs(specs, &term.line[y][x1], x2 - x1, x1, y);
       -
       -                i = ox = 0;
       -                for (x = x1; x < x2 && i < numspecs; x++) {
       -                        new = term.line[y][x];
       -                        if (new.mode == ATTR_WDUMMY)
       -                                continue;
       -                        if (selected(x, y))
       -                                new.mode ^= ATTR_REVERSE;
       -                        if (i > 0 && ATTRCMP(base, new)) {
       -                                xdrawglyphfontspecs(specs, base, i, ox, y);
       -                                specs += i;
       -                                numspecs -= i;
       -                                i = 0;
       -                        }
       -                        if (i == 0) {
       -                                ox = x;
       -                                base = new;
       -                        }
       -                        i++;
       +                if (selected(x, y1))
       +                        new.mode ^= ATTR_REVERSE;
       +                if (i > 0 && ATTRCMP(base, new)) {
       +                        xdrawglyphfontspecs(specs, base, i, ox, y1);
       +                        specs += i;
       +                        numspecs -= i;
       +                        i = 0;
       +                }
       +                if (i == 0) {
       +                        ox = x;
       +                        base = new;
                        }
       -                if (i > 0)
       -                        xdrawglyphfontspecs(specs, base, i, ox, y);
       +                i++;
                }
       -        xdrawcursor();
       +        if (i > 0)
       +                xdrawglyphfontspecs(specs, base, i, ox, y1);
       +}
       +
       +void
       +xfinishdraw(void)
       +{
       +        XCopyArea(xw.dpy, xw.buf, xw.win, dc.gc, 0, 0, win.w,
       +                        win.h, 0, 0);
       +        XSetForeground(xw.dpy, dc.gc,
       +                        dc.col[IS_SET(MODE_REVERSE)?
       +                                defaultfg : defaultbg].pixel);
        }
        
        void