/* static functions */
static void
-grabbuttons(Client *c, Bool focus)
+detachstack(Client *c)
+{
+ Client **tc;
+ for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext);
+ *tc = c->snext;
+}
+
+static void
+grabbuttons(Client *c, Bool focused)
{
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
- if(focus) {
+ if(focused) {
XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK,
GrabModeAsync, GrabModeSync, None, None);
XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK,
}
}
if(c) {
+ detachstack(c);
+ c->snext = stack;
+ stack = c;
grabbuttons(c, True);
drawtitle(c);
XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
void
manage(Window w, XWindowAttributes *wa)
{
- unsigned int i;
Client *c;
Window trans;
XSetWindowAttributes twa;
if(clients)
clients->prev = c;
c->next = clients;
- clients = c;
+ c->snext = stack;
+ stack = clients = c;
settitle(c);
ban(c);
wc.border_width = 0;
else
wc.border_width = 1;
- XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc);
+ XConfigureWindow(dpy, c->win, CWX | CWY | CWWidth | CWHeight | CWBorderWidth, &wc);
XSync(dpy, False);
}
void
unmanage(Client *c)
{
- Client *tc, *fc;
- Window trans;
+ Client *nc;
+
XGrabServer(dpy);
XSetErrorHandler(xerrordummy);
detach(c);
+ detachstack(c);
if(sel == c) {
- XGetTransientForHint(dpy, c->win, &trans);
- if(trans && (tc = getclient(trans)) && isvisible(tc))
- fc = tc;
- else
- fc = getnext(clients);
- focus(fc);
+ for(nc = stack; nc && !isvisible(nc); nc = nc->snext);
+ focus(nc);
}
XUngrabButton(dpy, AnyButton, AnyModifier, c->win);