mouse shortcuts: don't hardcode selpaste
authorAvi Halachmi (:avih) <avihpit@yahoo.com>
Thu, 10 Oct 2019 23:26:10 +0000 (02:26 +0300)
committerHiltjo Posthuma <hiltjo@codemadness.org>
Sun, 13 Oct 2019 19:46:31 +0000 (21:46 +0200)
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.

config.def.h
x.c

index a0a0d2d..546edda 100644 (file)
@@ -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       release */
+       { 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
index c967caf..8f570c2 100644 (file)
--- 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);
 }