JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fixed focusmon brokeness
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index d3169be..096895c 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -1,4 +1,4 @@
-#define XINULATOR /* debug, simulates dual head */
+//#define XINULATOR /* debug, simulates dual head */
 /* See LICENSE file for copyright and license details.
  *
  * dynamic window manager is designed like any other X client as well. It is
@@ -400,12 +400,9 @@ buttonpress(XEvent *e) {
        for(m = mons; m; m = m->next)
                if(ev->window == m->barwin) {
                        if(m != selmon) {
-                               if(selmon->stack)
-                                       focus(selmon->stack);
-                               else {
-                                       selmon = m;
-                                       focus(NULL);
-                               }
+                               unfocus(selmon->stack);
+                               selmon = m;
+                               focus(NULL);
                        }
                        break;
                }
@@ -807,13 +804,11 @@ focusmon(const Arg *arg) {
 
        for(i = 0, m = mons; m; m = m->next, i++)
                if(i == arg->ui) {
-                       if(m->stack)
-                               focus(m->stack);
-                       else {
-                               unfocus(selmon->stack);
-                               selmon = m;
-                               focus(NULL);
-                       }
+                       if(m == selmon)
+                               return;
+                       unfocus(selmon->sel);
+                       selmon = m;
+                       focus(NULL);
                        drawbars();
                        break;
                }
@@ -1505,10 +1500,10 @@ tagmon(const Arg *arg) {
                        detach(c);
                        detachstack(c);
                        c->mon = m;
+                       c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
                        attach(c);
                        attachstack(c);
-                       selmon->sel = selmon->stack;
-                       m->sel = c;
+                       focus(NULL);
                        arrange();
                        break;
                }
@@ -1608,6 +1603,7 @@ unfocus(Client *c) {
                return;
        grabbuttons(c, False);
        XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]);
+       XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
 }
 
 void
@@ -1622,7 +1618,10 @@ unmanage(Client *c) {
        detach(c);
        detachstack(c);
        if(c->mon->sel == c) {
-               c->mon->sel = c->mon->stack;
+               /* TODO: consider separate the next code into a function or into detachstack? */
+               Client *tc;
+               for(tc = c->mon->stack; tc && !ISVISIBLE(tc); tc = tc->snext);
+               c->mon->sel = tc;
                focus(NULL);
        }
        XUngrabButton(dpy, AnyButton, AnyModifier, c->win);