summaryrefslogtreecommitdiffstats
path: root/x.c
diff options
context:
space:
mode:
Diffstat (limited to 'x.c')
-rw-r--r--x.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/x.c b/x.c
index 48a6676..4cf6b21 100644
--- a/x.c
+++ b/x.c
@@ -171,6 +171,7 @@ static void kpress(XEvent *);
171static void cmessage(XEvent *); 171static void cmessage(XEvent *);
172static void resize(XEvent *); 172static void resize(XEvent *);
173static void focus(XEvent *); 173static void focus(XEvent *);
174static uint buttonmask(uint);
174static int mouseaction(XEvent *, uint); 175static int mouseaction(XEvent *, uint);
175static void brelease(XEvent *); 176static void brelease(XEvent *);
176static void bpress(XEvent *); 177static void bpress(XEvent *);
@@ -423,16 +424,30 @@ mousereport(XEvent *e)
423 ttywrite(buf, len, 0); 424 ttywrite(buf, len, 0);
424} 425}
425 426
427uint
428buttonmask(uint button)
429{
430 return button == Button1 ? Button1Mask
431 : button == Button2 ? Button2Mask
432 : button == Button3 ? Button3Mask
433 : button == Button4 ? Button4Mask
434 : button == Button5 ? Button5Mask
435 : 0;
436}
437
426int 438int
427mouseaction(XEvent *e, uint release) 439mouseaction(XEvent *e, uint release)
428{ 440{
429 MouseShortcut *ms; 441 MouseShortcut *ms;
430 442
443 /* ignore Button<N>mask for Button<N> - it's set on release */
444 uint state = e->xbutton.state & ~buttonmask(e->xbutton.button);
445
431 for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) { 446 for (ms = mshortcuts; ms < mshortcuts + LEN(mshortcuts); ms++) {
432 if (ms->release == release && 447 if (ms->release == release &&
433 ms->button == e->xbutton.button && 448 ms->button == e->xbutton.button &&
434 (match(ms->mod, e->xbutton.state) || /* exact or forced */ 449 (match(ms->mod, state) || /* exact or forced */
435 match(ms->mod, e->xbutton.state & ~forcemousemod))) { 450 match(ms->mod, state & ~forcemousemod))) {
436 ms->func(&(ms->arg)); 451 ms->func(&(ms->arg));
437 return 1; 452 return 1;
438 } 453 }