JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
added a marker for the flash fullscreen issue
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index 5df912b..7cc4ea7 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -389,6 +389,7 @@ arrange(Monitor *m) {
                showhide(m->stack);
        else for(m = mons; m; m = m->next)
                showhide(m->stack);
+       focus(NULL);
        if(m)
                arrangemon(m);
        else for(m = mons; m; m = m->next)
@@ -597,7 +598,6 @@ configurenotify(XEvent *e) {
                        updatebars();
                        for(m = mons; m; m = m->next)
                                XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh);
-                       focus(NULL);
                        arrange(NULL);
                }
        }
@@ -615,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))
@@ -827,13 +835,14 @@ enternotify(XEvent *e) {
        if((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root)
                return;
        c = wintoclient(ev->window);
-       if((m = wintomon(ev->window)) && m != selmon) {
+       m = c ? c->mon : wintomon(ev->window);
+       if(m != selmon) {
                unfocus(selmon->sel, True);
                selmon = m;
        }
-       else if(c == selmon->sel || c == NULL)
+       else if(!c || c == selmon->sel)
                return;
-       focus((wintoclient(ev->window)));
+       focus(c);
 }
 
 void
@@ -1112,13 +1121,13 @@ 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->isfloating = True; // regression with flash, XXXX
                c->x = c->mon->mx;
                c->y = c->mon->my;
                c->bw = 0;
@@ -1149,10 +1158,9 @@ manage(Window w, XWindowAttributes *wa) {
        attach(c);
        attachstack(c);
        XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */
+       XMapWindow(dpy, c->win);
        setclientstate(c, NormalState);
        arrange(c->mon);
-       XMapWindow(dpy, c->win);
-       focus(c);
 }
 
 void
@@ -1617,7 +1625,6 @@ void
 tag(const Arg *arg) {
        if(selmon->sel && arg->ui & TAGMASK) {
                selmon->sel->tags = arg->ui & TAGMASK;
-               focus(NULL);
                arrange(selmon);
        }
 }
@@ -1656,9 +1663,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;
@@ -1698,7 +1705,6 @@ toggletag(const Arg *arg) {
        newtags = selmon->sel->tags ^ (arg->ui & TAGMASK);
        if(newtags) {
                selmon->sel->tags = newtags;
-               focus(NULL);
                arrange(selmon);
        }
 }
@@ -1709,7 +1715,6 @@ toggleview(const Arg *arg) {
 
        if(newtagset) {
                selmon->tagset[selmon->seltags] = newtagset;
-               focus(NULL);
                arrange(selmon);
        }
 }
@@ -1975,7 +1980,6 @@ view(const Arg *arg) {
        selmon->seltags ^= 1; /* toggle sel tagset */
        if(arg->ui & TAGMASK)
                selmon->tagset[selmon->seltags] = arg->ui & TAGMASK;
-       focus(NULL);
        arrange(selmon);
 }