# st

Unnamed repository; edit this file 'description' to name the repository.

| Log | 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);
     }