JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
slave deck almost done
authorJason Woofenden <jason@jasonwoof.com>
Tue, 2 Dec 2014 17:17:33 +0000 (12:17 -0500)
committerJason Woofenden <jason@jasonwoof.com>
Tue, 2 Dec 2014 17:17:33 +0000 (12:17 -0500)
dwm.c

diff --git a/dwm.c b/dwm.c
index b902b3b..d5eec04 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -210,6 +210,7 @@ static void sigchld(int unused);
 static void spawn(const Arg *arg);
 static void tag(const Arg *arg);
 static void tagmon(const Arg *arg);
+static void jason_layout(Monitor *);
 static void tile(Monitor *);
 static void togglebar(const Arg *arg);
 static void togglefloating(const Arg *arg);
@@ -272,8 +273,10 @@ static Window root;
 
 // unfocused windows get transparent (feature)
 static const unsigned long unfocused_opacity[] = { 0xbfffffff };
+static const unsigned long invisible_opacity[] = { 0x00000000 };
 static void window_set_opaque(Client *c);
 static void window_set_translucent(Client *c);
+static void window_set_invisible(Client *c);
 void
 window_set_opaque(Client *c) {
        XDeleteProperty(dpy, c->win, netatom[NetWMWindowOpacity]);
@@ -282,6 +285,10 @@ void
 window_set_translucent(Client *c) {
        XChangeProperty(dpy, c->win, netatom[NetWMWindowOpacity], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)unfocused_opacity, 1);
 }
+void
+window_set_invisible(Client *c) {
+       XChangeProperty(dpy, c->win, netatom[NetWMWindowOpacity], XA_CARDINAL, 32, PropModeReplace, (unsigned char *)invisible_opacity, 1);
+}
 
 
 /* configuration, allows nested code to access above variables */
@@ -1709,6 +1716,47 @@ tile(Monitor *m) {
 }
 
 void
+jason_layout(Monitor *m) {
+       unsigned int i, n, mw;
+       Client *c, *vis_slave;
+
+       for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++);
+       if(n == 0) {
+               return;
+       }
+
+       c = nexttiled(m->clients);
+       if (c == m->sel) {
+               // if master is selected, show first slave
+               vis_slave = nexttiled(c->next);
+       } else {
+               vis_slave = m->sel;
+       }
+       if(n > 1 || (n == 1 && !c->screen_hog)) {
+               mw = m->ww * m->mfact;
+       } else {
+               // one of these:
+               // * zero tiled windows
+               // * one tiled window that's not a screen hog
+               // * miltiple tiled windows
+               mw = m->ww;
+       }
+       for (i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) {
+               if (i == 0) {
+                       resize(c, m->wx, m->wy, mw, m->wh, False);
+               } else {
+                       if (c == vis_slave) {
+                               resize(c, m->wx + mw, m->wy, m->ww - mw, m->wh, False);
+                       } else {
+                               // this function does not get called when focus changes
+                               // resize(c, m->wx + m->ww, m->wy, m->ww - mw, m->wh, False);
+                               resize(c, m->wx + mw, m->wy, m->ww - mw, m->wh, False);
+                       }
+               }
+       }
+}
+
+void
 togglebar(const Arg *arg) {
        selmon->showbar = !selmon->showbar;
        updatebarpos(selmon);
@@ -1756,10 +1804,32 @@ toggleview(const Arg *arg) {
 
 void
 unfocus(Client *c, Bool setfocus) {
+       Client *w;
        if(!c)
                return;
-       if(!root || c->win!=root)
-               window_set_translucent(c);
+       if(!root || c->win!=root) {
+               w = nexttiled(c->mon->clients);
+               if (!w) {
+                       // no tiled windows
+                       window_set_translucent(c);
+               } else if (w == c) {
+                       // master
+                       window_set_translucent(c);
+               } else {
+                       w = nexttiled(w->next);
+                       if (!w) {
+                               // c must not be tiled
+                               window_set_translucent(c);
+                       } else {
+                               if (w == c) { // first slave
+                                       window_set_translucent(c);
+                               } else {
+                                       window_set_invisible(c);
+                                       window_set_translucent(w);
+                               }
+                       }
+               }
+       }
        grabbuttons(c, False);
        XSetWindowBorder(dpy, c->win, scheme[SchemeNorm].border->rgb);
        if(setfocus) {