Hi Anselm, > I reviewed your patch and concluded I can't apply it as is, because > focus() would be called twice, once on the unmapped window, and then > on again.
It seems to me that focusing and arranging should be independent operations. So here comes another patch to remove focus(NULL) from arrange and add it, if missing, everywhere arrange is called after either a window might have vanished from selmon's view, or selmon itself might have vanished. Regards, Peter
--- dwm/dwm.c.orig 2011-07-09 01:21:43.924293041 +0200 +++ dwm/dwm.c 2011-07-09 01:25:06.127245938 +0200 @@ -389,7 +389,6 @@ 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) @@ -598,6 +597,7 @@ 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); } } @@ -1616,6 +1616,7 @@ void tag(const Arg *arg) { if(selmon->sel && arg->ui & TAGMASK) { selmon->sel->tags = arg->ui & TAGMASK; + focus(NULL); arrange(selmon); } } @@ -1696,6 +1697,7 @@ toggletag(const Arg *arg) { newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); if(newtags) { selmon->sel->tags = newtags; + focus(NULL); arrange(selmon); } } @@ -1706,6 +1708,7 @@ toggleview(const Arg *arg) { if(newtagset) { selmon->tagset[selmon->seltags] = newtagset; + focus(NULL); arrange(selmon); } } @@ -1971,6 +1974,7 @@ 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); }