URI: 
       Move remaining selection mode logic into selextend - st - simple terminal
  HTML git clone https://git.parazyd.org/st
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit cfc7acdfd923924ae150a32061fb95987697b159
   DIR parent bcb5d3adbe57ead05a829e5144c2ba1dc465865f
  HTML Author: Devin J. Pohly <djpohly@gmail.com>
       Date:   Wed, 21 Feb 2018 23:54:29 -0600
       
       Move remaining selection mode logic into selextend
       
       The "done" parameter indicates a change which finalizes the selection
       (e.g. a mouse button release as opposed to motion).
       
       Signed-off-by: Devin J. Pohly <djpohly@gmail.com>
       
       Diffstat:
         M st.c                                |      14 ++++++++++++--
         M st.h                                |       3 +--
         M x.c                                 |      27 +++++++++------------------
       
       3 files changed, 22 insertions(+), 22 deletions(-)
       ---
   DIR diff --git a/st.c b/st.c
       @@ -167,11 +167,11 @@ static ssize_t xwrite(int, const char *, size_t);
        
        /* Globals */
        Term term;
       -Selection sel;
        int cmdfd;
        pid_t pid;
        int oldbutton   = 3; /* button event on startup: 3 = release */
        
       +static Selection sel;
        static CSIEscape csiescseq;
        static STREscape strescseq;
        static int iofd = 1;
       @@ -402,9 +402,17 @@ selstart(int col, int row, int snap)
        }
        
        void
       -selextend(int col, int row, int type)
       +selextend(int col, int row, int type, int done)
        {
                int oldey, oldex, oldsby, oldsey, oldtype;
       +
       +        if (!sel.mode)
       +                return;
       +        if (done && sel.mode == SEL_EMPTY) {
       +                selclear();
       +                return;
       +        }
       +
                oldey = sel.oe.y;
                oldex = sel.oe.x;
                oldsby = sel.nb.y;
       @@ -419,6 +427,8 @@ selextend(int col, int row, int type)
        
                if (oldey != sel.oe.y || oldex != sel.oe.x || oldtype != sel.type)
                        tsetdirt(MIN(sel.nb.y, oldsby), MAX(sel.ne.y, oldsey));
       +
       +        sel.mode = done ? SEL_IDLE : SEL_READY;
        }
        
        void
   DIR diff --git a/st.h b/st.h
       @@ -184,7 +184,7 @@ void resettitle(void);
        void selclear(void);
        void selinit(void);
        void selstart(int, int, int);
       -void selextend(int, int, int);
       +void selextend(int, int, int, int);
        void selnormalize(void);
        int selected(int, int);
        char *getsel(void);
       @@ -198,7 +198,6 @@ char *xstrdup(char *);
        
        /* Globals */
        extern Term term;
       -extern Selection sel;
        extern int cmdfd;
        extern pid_t pid;
        extern int oldbutton;
   DIR diff --git a/x.c b/x.c
       @@ -157,7 +157,7 @@ static void selnotify(XEvent *);
        static void selclear_(XEvent *);
        static void selrequest(XEvent *);
        static void setsel(char *, Time);
       -static void mousesel(XEvent *);
       +static void mousesel(XEvent *, int);
        static void mousereport(XEvent *);
        static char *kmap(KeySym, uint);
        static int match(uint, uint);
       @@ -313,7 +313,7 @@ y2row(int y)
        }
        
        void
       -mousesel(XEvent *e)
       +mousesel(XEvent *e, int done)
        {
                int type, seltype = SEL_REGULAR;
                uint state = e->xbutton.state & ~(Button1Mask | forceselmod);
       @@ -324,8 +324,9 @@ mousesel(XEvent *e)
                                break;
                        }
                }
       -
       -        selextend(x2col(e->xbutton.x), y2row(e->xbutton.y), seltype);
       +        selextend(x2col(e->xbutton.x), y2row(e->xbutton.y), seltype, done);
       +        if (done)
       +                setsel(getsel(), e->xbutton.time);
        }
        
        void
       @@ -630,16 +631,10 @@ brelease(XEvent *e)
                        return;
                }
        
       -        if (e->xbutton.button == Button2) {
       +        if (e->xbutton.button == Button2)
                        selpaste(NULL);
       -        } else if (e->xbutton.button == Button1) {
       -                if (sel.mode == SEL_READY) {
       -                        mousesel(e);
       -                        setsel(getsel(), e->xbutton.time);
       -                } else
       -                        selclear_(NULL);
       -                sel.mode = SEL_IDLE;
       -        }
       +        else if (e->xbutton.button == Button1)
       +                mousesel(e, 1);
        }
        
        void
       @@ -650,11 +645,7 @@ bmotion(XEvent *e)
                        return;
                }
        
       -        if (!sel.mode)
       -                return;
       -
       -        sel.mode = SEL_READY;
       -        mousesel(e);
       +        mousesel(e, 0);
        }
        
        void