static void motionnotify(XEvent *e);
static void movemouse(const Arg *arg);
static Client *nexttiled(Client *c);
+static Client *nextvisible(Client *c);
static void pop(Client *);
static void propertynotify(XEvent *e);
static void quit(const Arg *arg);
void
attachstack(Client *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;
- }
+ c->snext = c->mon->stack;
+ c->mon->stack = c;
}
void
*tc = c->next;
}
+// NOTE: the stack is for z-order and most-recently-focused
+// only mon->clients determines position in visible layout
void
detachstack(Client *c) {
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) {
- if (!next_sel) { // if no visible window prev, find first visible
- for(i = c->mon->stack; i && !ISVISIBLE(i); i = i->snext)
+ // find last visible window before c
+ // WARNING if you detach() before detachstack() this will select last visible window
+ for(i = nextvisible(c->mon->clients); i && i != c; i = nextvisible(i->next))
+ next_sel = i;
+ // failing that, find first visible window
+ if (!next_sel)
+ for(i = nextvisible(c->mon->clients); i && i != c; i = nextvisible(i->next))
next_sel = i;
- }
c->mon->sel = next_sel;
}
if (prev) {
return c;
}
+Client *
+nextvisible(Client *c) {
+ for(; c && !ISVISIBLE(c); c = c->next);
+ return c;
+}
+
void
pop(Client *c) {
detach(c);
if(c->mon == m)
return;
unfocus(c, True);
- detach(c);
detachstack(c);
+ detach(c);
c->mon = m;
c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */
attach(c);
XWindowChanges wc;
/* The server grab construct avoids race conditions. */
- detach(c);
detachstack(c);
+ detach(c);
if(!destroyed) {
wc.border_width = c->oldbw;
XGrabServer(dpy);