JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
applied Connors aesthitic buf fix in tile(), thanks
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index f6cec0b..f176f4c 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -42,7 +42,7 @@
 
 /* macros */
 #define BUTTONMASK              (ButtonPressMask|ButtonReleaseMask)
-#define CLEANMASK(mask)         (mask & ~(numlockmask|LockMask))
+#define CLEANMASK(mask)         (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask))
 #define INRECT(X,Y,RX,RY,RW,RH) ((X) >= (RX) && (X) < (RX) + (RW) && (Y) >= (RY) && (Y) < (RY) + (RH))
 #define ISVISIBLE(C)            ((C->tags & C->mon->tagset[C->mon->seltags]))
 #define LENGTH(X)               (sizeof X / sizeof X[0])
@@ -442,7 +442,7 @@ buttonpress(XEvent *e) {
                }
                else if(ev->x < x + blw)
                        click = ClkLtSymbol;
-               else if(ev->x > selmon->wx + selmon->ww - TEXTW(stext))
+               else if(ev->x > selmon->ww - TEXTW(stext))
                        click = ClkStatusText;
                else
                        click = ClkWinTitle;
@@ -529,7 +529,7 @@ clientmessage(XEvent *e) {
        if(!c)
                return;
        if(cme->message_type == netatom[NetWMState] && cme->data.l[1] == netatom[NetWMFullscreen]) {
-               if(cme->data.l[0]) {
+               if(cme->data.l[0] && !c->isfullscreen) {
                        XChangeProperty(dpy, cme->window, netatom[NetWMState], XA_ATOM, 32,
                                        PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1);
                        c->isfullscreen = True;
@@ -585,11 +585,13 @@ void
 configurenotify(XEvent *e) {
        Monitor *m;
        XConfigureEvent *ev = &e->xconfigure;
+       Bool dirty;
 
        if(ev->window == root) {
+               dirty = (sw != ev->width);
                sw = ev->width;
                sh = ev->height;
-               if(updategeom()) {
+               if(updategeom() || dirty) {
                        if(dc.drawable != 0)
                                XFreePixmap(dpy, dc.drawable);
                        dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
@@ -613,18 +615,26 @@ configurerequest(XEvent *e) {
                        c->bw = ev->border_width;
                else if(c->isfloating || !selmon->lt[selmon->sellt]->arrange) {
                        m = c->mon;
-                       if(ev->value_mask & CWX)
+                       if(ev->value_mask & CWX) {
+                               c->oldx = c->x;
                                c->x = m->mx + ev->x;
-                       if(ev->value_mask & CWY)
+                       }
+                       if(ev->value_mask & CWY) {
+                               c->oldy = c->y;
                                c->y = m->my + ev->y;
-                       if(ev->value_mask & CWWidth)
+                       }
+                       if(ev->value_mask & CWWidth) {
+                               c->oldw = c->w;
                                c->w = ev->width;
-                       if(ev->value_mask & CWHeight)
+                       }
+                       if(ev->value_mask & CWHeight) {
+                               c->oldh = c->h;
                                c->h = ev->height;
+                       }
                        if((c->x + c->w) > m->mx + m->mw && c->isfloating)
-                               c->x = m->mx + (m->mw / 2 - c->w / 2); /* center in x direction */
+                               c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */
                        if((c->y + c->h) > m->my + m->mh && c->isfloating)
-                               c->y = m->my + (m->mh / 2 - c->h / 2); /* center in y direction */
+                               c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */
                        if((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight)))
                                configure(c);
                        if(ISVISIBLE(c))
@@ -818,16 +828,21 @@ drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
 
 void
 enternotify(XEvent *e) {
+       Client *c;
        Monitor *m;
        XCrossingEvent *ev = &e->xcrossing;
 
        if((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root)
                return;
-       if((m = wintomon(ev->window)) && m != selmon) {
+       c = wintoclient(ev->window);
+       m = c ? c->mon : wintomon(ev->window);
+       if(m != selmon) {
                unfocus(selmon->sel, True);
                selmon = m;
        }
-       focus((wintoclient(ev->window)));
+       else if(!c || c == selmon->sel)
+               return;
+       focus(c);
 }
 
 void
@@ -1106,13 +1121,12 @@ manage(Window w, XWindowAttributes *wa) {
                applyrules(c);
        }
        /* geometry */
-       c->x = c->oldx = wa->x + c->mon->wx;
-       c->y = c->oldy = wa->y + c->mon->wy;
+       c->x = c->oldx = wa->x;
+       c->y = c->oldy = wa->y;
        c->w = c->oldw = wa->width;
        c->h = c->oldh = wa->height;
        c->oldbw = wa->border_width;
        if(c->w == c->mon->mw && c->h == c->mon->mh) {
-               c->isfloating = True;
                c->x = c->mon->mx;
                c->y = c->mon->my;
                c->bw = 0;
@@ -1648,9 +1662,9 @@ tile(Monitor *m) {
        if(--n == 0)
                return;
        /* tile stack */
-       x = (m->wx + mw > c->x + c->w) ? c->x + c->w + 2 * c->bw : m->wx + mw;
+       x = (m->wx > c->x) ? c->x + mw + 2 * c->bw : m->wx + mw;
        y = m->wy;
-       w = (m->wx + mw > c->x + c->w) ? m->wx + m->ww - x : m->ww - mw;
+       w = (m->wx > c->x) ? m->wx + m->ww - x : m->ww - mw;
        h = m->wh / n;
        if(h < bh)
                h = m->wh;
@@ -2034,7 +2048,6 @@ zoom(const Arg *arg) {
        Client *c = selmon->sel;
 
        if(!selmon->lt[selmon->sellt]->arrange
-       || selmon->lt[selmon->sellt]->arrange == monocle
        || (selmon->sel && selmon->sel->isfloating))
                return;
        if(c == nexttiled(selmon->clients))