JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
spawn from mouse button events
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index b42fb73..aa8a8f5 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -65,7 +65,7 @@ enum { NetSupported, NetWMName, NetWMState,
        NetWMWindowTypeDialog, NetClientList, NetSupportingWMCheck, NetLast }; /* EWMH atoms */
 enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */
 enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
-       ClkClientWin, ClkRootWin, ClkLast }; /* clicks */
+       ClkClientWin, ClkRootWin, ClkAnywhere, ClkLast }; /* clicks */
 
 typedef union {
        int i;
@@ -500,6 +500,18 @@ buttonpress(XEvent *e) {
        Client *c;
        Monitor *m;
        XButtonPressedEvent *ev = &e->xbutton;
+       Bool called = False;
+
+       for(i = 0; i < LENGTH(buttons); i++) {
+               if(buttons[i].click == ClkAnywhere && buttons[i].button == ev->button
+               && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) {
+                       buttons[i].func(&buttons[i].arg);
+                       called = True;
+               }
+       }
+       if (called) {
+               return;
+       }
 
        click = ClkRootWin;
        /* focus monitor if necessary */
@@ -510,15 +522,20 @@ buttonpress(XEvent *e) {
        }
        if(ev->window == selmon->barwin) {
                return;
-       }
-       else if((c = wintoclient(ev->window))) {
+       } else if((c = wintoclient(ev->window))) {
                focus(c);
                click = ClkClientWin;
        }
-       for(i = 0; i < LENGTH(buttons); i++)
+       for(i = 0; i < LENGTH(buttons); i++) {
                if(click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button
-               && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
-                       buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg);
+               && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) {
+                       if (click == ClkTagBar && buttons[i].arg.i == 0) {
+                               buttons[i].func(&arg);
+                       } else {
+                               buttons[i].func(&buttons[i].arg);
+                       }
+               }
+       }
 }
 
 void
@@ -1030,16 +1047,16 @@ grabbuttons(Client *c, Bool focused) {
                XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
                if(focused) {
                        for(i = 0; i < LENGTH(buttons); i++)
-                               if(buttons[i].click == ClkClientWin)
+                               if(buttons[i].click == ClkClientWin || buttons[i].click == ClkAnywhere)
                                        for(j = 0; j < LENGTH(modifiers); j++)
                                                XGrabButton(dpy, buttons[i].button,
                                                            buttons[i].mask | modifiers[j],
                                                            c->win, False, BUTTONMASK,
                                                            GrabModeAsync, GrabModeSync, None, None);
-               }
-               else
+               } else {
                        XGrabButton(dpy, AnyButton, AnyModifier, c->win, False,
                                    BUTTONMASK, GrabModeAsync, GrabModeSync, None, None);
+               }
        }
 }