JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
new windows open away from master, closing focuses towards master
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index 31fad43..f873a42 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -273,11 +273,11 @@ static void window_set_opaque(Client *c);
 static void window_set_translucent(Client *c);
 void
 window_set_opaque(Client *c) {
-       XChangeProperty(dpy, c->win, netatom[NetWMWindowOpacity], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)unfocused_opacity, 1);
+       XDeleteProperty(dpy, c->win, netatom[NetWMWindowOpacity]);
 }
 void
 window_set_translucent(Client *c) {
-       XDeleteProperty(dpy, c->win, netatom[NetWMWindowOpacity]);
+       XChangeProperty(dpy, c->win, netatom[NetWMWindowOpacity], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)unfocused_opacity, 1);
 }
 
 
@@ -410,14 +410,24 @@ arrangemon(Monitor *m) {
 
 void
 attach(Client *c) {
-       c->next = c->mon->clients;
-       c->mon->clients = c;
+       if (c->mon->sel) {
+               c->next = c->mon->sel->next;
+               c->mon->sel->next = c;
+       } else {
+               c->next = c->mon->clients;
+               c->mon->clients = c;
+       }
 }
 
 void
 attachstack(Client *c) {
-       c->snext = c->mon->stack;
-       c->mon->stack = c;
+       if (c->mon->sel) {
+               c->snext = c->mon->sel->snext;
+               c->mon->sel->snext = c;
+       } else {
+               c->snext = c->mon->stack;
+               c->mon->stack = c;
+       }
 }
 
 void
@@ -678,14 +688,23 @@ detach(Client *c) {
 
 void
 detachstack(Client *c) {
-       Client **tc, *t;
-
-       for(tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext);
-       *tc = c->snext;
-
+       Client *prev = NULL, *next_sel = NULL, *i;
+       for(i = c->mon->stack; i && i != c; i = i->snext) {
+               prev = i;
+               if(ISVISIBLE(i))
+                       next_sel = i;
+       }
        if(c == c->mon->sel) {
-               for(t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext);
-               c->mon->sel = t;
+               if (!next_sel) { // if no visible window prev, find first visible
+                       for(i = c->mon->stack; i && !ISVISIBLE(i); i = i->snext)
+                               next_sel = i;
+               }
+               c->mon->sel = next_sel;
+       }
+       if (prev) {
+               prev->snext = c->snext;
+       } else {
+               c->mon->stack = c->snext;
        }
 }
 
@@ -798,10 +817,6 @@ focus(Client *c) {
        /* was if(selmon->sel) */
        if(selmon->sel && selmon->sel != c)
                unfocus(selmon->sel, False);
-       if(selmon->sel && c!=selmon->sel && c && (!root || (selmon->sel->win!=root && c->win!=root)) )
-               window_set_opaque(selmon->sel);
-       if(c && c!=selmon->sel && (!root || (c->win!=root)) )
-               window_set_translucent(c);
        if(c) {
                if(c->mon != selmon)
                        selmon = c->mon;
@@ -819,8 +834,8 @@ focus(Client *c) {
        }
        selmon->sel = c;
        drawbars();
-       if(c)
-               window_set_translucent(c);
+       if(c && (!root || (c->win!=root)) )
+               window_set_opaque(c);
 }
 
 void
@@ -851,7 +866,14 @@ focusstack(const Arg *arg) {
 
        if(!selmon->sel)
                return;
-       if(arg->i > 0) {
+       if(arg->i == 0) {
+               for(i = selmon->clients; i != selmon->sel; i = i->next) {
+                       if(ISVISIBLE(i)) {
+                               c = i;
+                               break;
+                       }
+               }
+       } else if(arg->i > 0) {
                for(c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next);
                if(!c)
                        for(c = selmon->clients; c && !ISVISIBLE(c); c = c->next);
@@ -1082,7 +1104,7 @@ manage(Window w, XWindowAttributes *wa) {
        c->mon->sel = c;
        arrange(c->mon);
        XMapWindow(dpy, c->win);
-       focus(NULL);
+       focus(c);
 }
 
 void
@@ -1705,6 +1727,8 @@ void
 unfocus(Client *c, Bool setfocus) {
        if(!c)
                return;
+       if(!root || c->win!=root)
+               window_set_translucent(c);
        grabbuttons(c, False);
        XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border->rgb);
        if(setfocus) {
@@ -1733,7 +1757,7 @@ unmanage(Client *c, Bool destroyed) {
                XUngrabServer(dpy);
        }
        free(c);
-       focus(NULL);
+       focus(selmon ? selmon->sel : NULL);
        updateclientlist();
        arrange(m);
 }