all repos — st @ cfc7acdfd923924ae150a32061fb95987697b159

st (suckless terminal) config

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>
Devin J. Pohly djpohly@gmail.com
commit

cfc7acdfd923924ae150a32061fb95987697b159

parent

bcb5d3adbe57ead05a829e5144c2ba1dc465865f

3 files changed, 22 insertions(+), 22 deletions(-)

jump to
M st.cst.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 @@ tsetdirt(sel.nb.y, sel.ne.y);

} 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 @@ sel.type = 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
M st.hst.h

@@ -184,7 +184,7 @@

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;
M x.cx.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 @@ return LIMIT(y, 0, term.row-1);

} 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 @@ seltype = type;

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 @@ mousereport(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 @@ mousereport(e);

return; } - if (!sel.mode) - return; - - sel.mode = SEL_READY; - mousesel(e); + mousesel(e, 0); } void