mouse shortcuts: don't hardcode selpaste - st - Personal fork of st
 (HTM) git clone git://git.drkhsh.at/st.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit d2b75db8d7519a20af8bf09e9c205507f9ff828c
 (DIR) parent b6d280de6df30167ce9cf30fadefc362e77729e7
 (HTM) 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:
         M config.def.h                        |       3 ++-
         M x.c                                 |      35 +++++++++++++++++++++----------
       
       2 files changed, 26 insertions(+), 12 deletions(-)
       ---
 (DIR) 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"} },
        };
 (DIR) 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);
        }