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);
}
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
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;
}
}
/* 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;
}
selmon->sel = c;
drawbars();
- if(c)
- window_set_translucent(c);
+ if(c && (!root || (c->win!=root)) )
+ window_set_opaque(c);
}
void
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);
c->mon->sel = c;
arrange(c->mon);
XMapWindow(dpy, c->win);
- focus(NULL);
+ focus(c);
}
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) {
XUngrabServer(dpy);
}
free(c);
- focus(NULL);
+ focus(selmon ? selmon->sel : NULL);
updateclientlist();
arrange(m);
}