Fixing the cursor movement in selections. - 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 594a25983639847ed063a3d181893dba54825f5a
 (DIR) parent 91c70213d1e595467b14ce6d28f333dbedd97cab
 (HTM) Author: Christoph Lohmann <20h@r-36.net>
       Date:   Mon,  5 Oct 2015 22:09:51 +0200
       
       Fixing the cursor movement in selections.
       
       Before the fix the cursor wouldn't obey if it's in a selection. If it is
       inside it will now change to the reverse. This patch also adds that the
       defaultcs will be reversed for the manually drawn cursors.
       
       Diffstat:
         M st.c                                |      44 ++++++++++++++++++++++---------
       
       1 file changed, 31 insertions(+), 13 deletions(-)
       ---
 (DIR) diff --git a/st.c b/st.c
       @@ -1811,7 +1811,6 @@ tmoveto(int x, int y)
        {
                int miny, maxy;
        
       -        selclear(NULL);
                if (term.c.state & CURSOR_ORIGIN) {
                        miny = term.top;
                        maxy = term.bot;
       @@ -3819,6 +3818,7 @@ xdrawglyph(Glyph g, int x, int y)
        {
                int numspecs;
                XftGlyphFontSpec spec;
       +
                numspecs = xmakeglyphfontspecs(&spec, &g, 1, x, y);
                xdrawglyphfontspecs(&spec, g, numspecs, x, y);
        }
       @@ -3828,8 +3828,10 @@ xdrawcursor(void)
        {
                static int oldx = 0, oldy = 0;
                int curx;
       -        Glyph g = {' ', ATTR_NULL, defaultbg, defaultcs};
       +        Glyph g = {' ', ATTR_NULL, defaultbg, defaultcs}, og;
                int ena_sel = sel.ob.x != -1 && sel.alt == IS_SET(MODE_ALTSCREEN);
       +        Color drawcol;
       +        XRenderColor dccol;
        
                LIMIT(oldx, 0, term.col-1);
                LIMIT(oldy, 0, term.row-1);
       @@ -3842,12 +3844,28 @@ xdrawcursor(void)
                if (term.line[term.c.y][curx].mode & ATTR_WDUMMY)
                        curx--;
        
       +        /* remove the old cursor */
       +        og = term.line[oldy][oldx];
       +        if (ena_sel && selected(oldx, oldy))
       +                og.mode ^= ATTR_REVERSE;
       +        xdrawglyph(og, oldx, oldy);
       +
                g.u = term.line[term.c.y][term.c.x].u;
       -        if (ena_sel && selected(term.c.x, term.c.y))
       -                g.mode ^= ATTR_REVERSE;
       +        if (ena_sel && selected(term.c.x, term.c.y)) {
       +                /*
       +                 * Allocate the drawing color which is the reverse of
       +                 * defaultcs, if we are selected.
       +                 */
       +                dccol.red = ~dc.col[defaultcs].color.red;
       +                dccol.green = ~dc.col[defaultcs].color.green;
       +                dccol.blue = ~dc.col[defaultcs].color.blue;
       +                dccol.alpha = ~dc.col[defaultcs].color.alpha;
       +                XftColorAllocValue(xw.dpy, xw.vis, xw.cmap, &dccol, &drawcol);
        
       -        /* remove the old cursor */
       -        xdrawglyph(term.line[oldy][oldx], oldx, oldy);
       +                g.mode ^= ATTR_REVERSE;
       +        } else {
       +                drawcol = dc.col[defaultcs];
       +        }
        
                if (IS_SET(MODE_HIDE))
                        return;
       @@ -3869,33 +3887,33 @@ xdrawcursor(void)
                                break;
                        case 3: /* Blinking Underline */
                        case 4: /* Steady Underline */
       -                        XftDrawRect(xw.draw, &dc.col[defaultcs],
       +                        XftDrawRect(xw.draw, &drawcol,
                                                borderpx + curx * xw.cw,
                                                borderpx + (term.c.y + 1) * xw.ch - cursorthickness,
                                                xw.cw, cursorthickness);
                                break;
                        case 5: /* Blinking bar */
                        case 6: /* Steady bar */
       -                        XftDrawRect(xw.draw, &dc.col[defaultcs],
       +                        XftDrawRect(xw.draw, &drawcol,
                                                borderpx + curx * xw.cw,
                                                borderpx + term.c.y * xw.ch,
                                                cursorthickness, xw.ch);
                                break;
                        }
                } else {
       -                XftDrawRect(xw.draw, &dc.col[defaultcs],
       +                XftDrawRect(xw.draw, &drawcol,
                                        borderpx + curx * xw.cw,
                                        borderpx + term.c.y * xw.ch,
                                        xw.cw - 1, 1);
       -                XftDrawRect(xw.draw, &dc.col[defaultcs],
       +                XftDrawRect(xw.draw, &drawcol,
                                        borderpx + curx * xw.cw,
                                        borderpx + term.c.y * xw.ch,
                                        1, xw.ch - 1);
       -                XftDrawRect(xw.draw, &dc.col[defaultcs],
       +                XftDrawRect(xw.draw, &drawcol,
                                        borderpx + (curx + 1) * xw.cw - 1,
                                        borderpx + term.c.y * xw.ch,
                                        1, xw.ch - 1);
       -                XftDrawRect(xw.draw, &dc.col[defaultcs],
       +                XftDrawRect(xw.draw, &drawcol,
                                        borderpx + curx * xw.cw,
                                        borderpx + (term.c.y + 1) * xw.ch - 1,
                                        xw.cw, 1);
       @@ -3945,7 +3963,7 @@ drawregion(int x1, int y1, int x2, int y2)
        {
                int i, x, y, ox, numspecs;
                Glyph base, new;
       -        XftGlyphFontSpec* specs;
       +        XftGlyphFontSpec *specs;
                int ena_sel = sel.ob.x != -1 && sel.alt == IS_SET(MODE_ALTSCREEN);
        
                if (!(xw.state & WIN_VISIBLE))