diff options
| -rw-r--r-- | config.def.h | 3 | ||||
| -rw-r--r-- | x.c | 35 | 
2 files changed, 26 insertions, 12 deletions
diff --git a/config.def.h b/config.def.h index a0a0d2d..546edda 100644 --- 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"} },  }; @@ -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);  }  | 
