st

fork of suckless's simple terminal
Index Commits Files Refs README LICENSE
commit d2b75db8d7519a20af8bf09e9c205507f9ff828c
parent b6d280de6df30167ce9cf30fadefc362e77729e7
Author: Avi Halachmi (:avih) <avihpit@yahoo.com>
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:
Mconfig.def.h | 3++-
Mx.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       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
@@ -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);
 }