# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | Files | Refs | README | LICENSE

    commit cfc7acdfd923924ae150a32061fb95987697b159
    parent bcb5d3adbe57ead05a829e5144c2ba1dc465865f
    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:
    Mst.c | 14++++++++++++--
    Mst.h | 3+--
    Mx.c | 27+++++++++------------------

    3 files changed, 22 insertions(+), 22 deletions(-)
    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
    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;
    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