| mouse shortcuts: don't hardcode selpaste - st - simple terminal | |
| git clone git://git.suckless.org/st | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit d2b75db8d7519a20af8bf09e9c205507f9ff828c | |
| parent b6d280de6df30167ce9cf30fadefc362e77729e7 | |
| Author: Avi Halachmi (:avih) <[email protected]> | |
| Date: Fri, 11 Oct 2019 02:26:10 +0300 | |
| mouse shortcuts: don't hardcode selpaste | |
| Because selpaste is activated on release, a release flag was added to | |
| mouse shortcuts which controls whether activation is on press/release, | |
| and selpaste binding to button2 was moved to config.h . | |
| button1 remains the only hardcoded mouse button - for selection + copy. | |
| Diffstat: | |
| M config.def.h | 3 ++- | |
| M x.c | 35 +++++++++++++++++++++--------… | |
| 2 files changed, 26 insertions(+), 12 deletions(-) | |
| --- | |
| diff --git a/config.def.h b/config.def.h | |
| @@ -162,7 +162,8 @@ static uint forcemousemod = ShiftMask; | |
| * Beware that overloading Button1 will disable the selection. | |
| */ | |
| static MouseShortcut mshortcuts[] = { | |
| - /* mask button function argument */ | |
| + /* mask button function argument releas… | |
| + { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, | |
| { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, | |
| { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, | |
| }; | |
| diff --git a/x.c b/x.c | |
| @@ -33,6 +33,7 @@ typedef struct { | |
| uint button; | |
| void (*func)(const Arg *); | |
| const Arg arg; | |
| + uint release; | |
| } MouseShortcut; | |
| typedef struct { | |
| @@ -165,6 +166,7 @@ static void kpress(XEvent *); | |
| static void cmessage(XEvent *); | |
| static void resize(XEvent *); | |
| static void focus(XEvent *); | |
| +static int mouseaction(XEvent *, uint); | |
| static void brelease(XEvent *); | |
| static void bpress(XEvent *); | |
| static void bmotion(XEvent *); | |
| @@ -416,11 +418,27 @@ mousereport(XEvent *e) | |
| ttywrite(buf, len, 0); | |
| } | |
| +int | |
| +mouseaction(XEvent *e, uint release) | |
| +{ | |
| + MouseShortcut *ms; | |
| + | |
| + for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) { | |
| + if (ms->release == release && | |
| + ms->button == e->xbutton.button && | |
| + match(ms->mod, e->xbutton.state & ~forcemousemod)) { | |
| + ms->func(&(ms->arg)); | |
| + return 1; | |
| + } | |
| + } | |
| + | |
| + return 0; | |
| +} | |
| + | |
| void | |
| bpress(XEvent *e) | |
| { | |
| struct timespec now; | |
| - MouseShortcut *ms; | |
| int snap; | |
| if (IS_SET(MODE_MOUSE) && !(e->xbutton.state & forcemousemod)) { | |
| @@ -428,13 +446,8 @@ bpress(XEvent *e) | |
| return; | |
| } | |
| - for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) { | |
| - if (e->xbutton.button == ms->button && | |
| - match(ms->mod, e->xbutton.state & ~forcemousemod)) { | |
| - ms->func(&(ms->arg)); | |
| - return; | |
| - } | |
| - } | |
| + if (mouseaction(e, 0)) | |
| + return; | |
| if (e->xbutton.button == Button1) { | |
| /* | |
| @@ -655,9 +668,9 @@ brelease(XEvent *e) | |
| return; | |
| } | |
| - if (e->xbutton.button == Button2) | |
| - selpaste(NULL); | |
| - else if (e->xbutton.button == Button1) | |
| + if (mouseaction(e, 1)) | |
| + return; | |
| + if (e->xbutton.button == Button1) | |
| mousesel(e, 1); | |
| } | |