int basew, baseh, incw, inch, maxw, maxh, minw, minh;
int bw, oldbw;
unsigned int tags;
- Bool isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen;
+ Bool isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen, screen_hog;
Client *next;
Client *snext;
Monitor *mon;
const char *title;
unsigned int tags;
Bool isfloating;
+ Bool screen_hog;
int monitor;
} Rule;
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);
// 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]);
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 */
XClassHint ch = { NULL, NULL };
/* rule matching */
- c->isfloating = c->tags = 0;
+ c->isfloating = c->tags = c->screen_hog = 0;
XGetClassHint(dpy, c->win, &ch);
class = ch.res_class ? ch.res_class : broken;
instance = ch.res_name ? ch.res_name : broken;
{
c->isfloating = r->isfloating;
c->tags |= r->tags;
+ c->screen_hog = r->screen_hog;
for(m = mons; m && m->num != r->monitor; m = m->next);
if(m)
c->mon = m;
if(n > m->nmaster)
mw = m->nmaster ? m->ww * m->mfact : 0;
- else
- mw = m->ww;
+ else {
+ c = nexttiled(m->clients);
+ if (c && !c->screen_hog)
+ mw = m->ww * m->mfact;
+ else
+ mw = m->ww;
+ }
for(i = my = ty = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++)
if(i < m->nmaster) {
h = (m->wh - my) / (MIN(n, m->nmaster) - i);
}
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);
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) {