* 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"} },
 };
 
        uint button;
        void (*func)(const Arg *);
        const Arg arg;
+       uint  release;
 } MouseShortcut;
 
 typedef struct {
 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 *);
        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)) {
                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) {
                /*
                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);
 }