diff options
| -rw-r--r-- | client.c | 16 | ||||
| -rw-r--r-- | dwm.h | 3 | ||||
| -rw-r--r-- | main.c | 1 | ||||
| -rw-r--r-- | view.c | 14 | 
4 files changed, 26 insertions, 8 deletions
| @@ -11,6 +11,14 @@  /* static functions */  static void +detachstack(Client *c) +{ +	Client **tc; +	for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext); +	*tc = c->snext; +} + +static void  grabbuttons(Client *c, Bool focus)  {  	XUngrabButton(dpy, AnyButton, AnyModifier, c->win); @@ -99,6 +107,9 @@ focus(Client *c)  		}  	}  	if(c) { +		detachstack(c); +		c->snext = stack; +		stack = c;  		grabbuttons(c, True);  		drawtitle(c);  		XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); @@ -198,7 +209,6 @@ killclient(Arg *arg)  void  manage(Window w, XWindowAttributes *wa)  { -	unsigned int i;  	Client *c;  	Window trans;  	XSetWindowAttributes twa; @@ -247,7 +257,8 @@ manage(Window w, XWindowAttributes *wa)  	if(clients)  		clients->prev = c;  	c->next = clients; -	clients = c; +	c->snext = stack; +	stack = clients = c;  	settitle(c);  	ban(c); @@ -421,6 +432,7 @@ unmanage(Client *c)  	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);  	XDestroyWindow(dpy, c->twin); +	detachstack(c);  	free(c->tags);  	free(c); @@ -61,6 +61,7 @@ struct Client {  	Bool *tags;  	Client *next;  	Client *prev; +	Client *snext;  	Window win;  	Window twin;  }; @@ -73,7 +74,7 @@ extern void (*handler[LASTEvent])(XEvent *);  extern void (*arrange)(Arg *);  extern Atom wmatom[WMLast], netatom[NetLast];  extern Bool running, issel, maximized, *seltag; -extern Client *clients, *sel; +extern Client *clients, *sel, *stack;  extern Cursor cursor[CurLast];  extern DC dc;  extern Display *dpy; @@ -27,6 +27,7 @@ Bool issel = True;  Bool maximized = False;  Client *clients = NULL;  Client *sel = NULL; +Client *stack = NULL;  Cursor cursor[CurLast];  Display *dpy;  DC dc = {0}; @@ -76,8 +76,10 @@ dofloat(Arg *arg)  		else  			ban(c);  	} -	if(!sel || !isvisible(sel)) -		focus(getnext(clients)); +	if(!sel || !isvisible(sel)) { +		for(sel = stack; sel && !isvisible(sel); sel = sel->snext); +		focus(sel); +	}  	restack();  } @@ -138,8 +140,10 @@ dotile(Arg *arg)  		else  			ban(c);  	} -	if(!sel || !isvisible(sel)) -		focus(getnext(clients)); +	if(!sel || !isvisible(sel)) { +		for(sel = stack; sel && !isvisible(sel); sel = sel->snext); +		focus(sel); +	}  	restack();  } @@ -227,7 +231,7 @@ restack()  		XRaiseWindow(dpy, sel->win);  		XRaiseWindow(dpy, sel->twin);  	} -	if(arrange != dofloat)  +	if(arrange != dofloat)  		for(c = nexttiled(clients); c; c = nexttiled(c->next)) {  			XLowerWindow(dpy, c->twin);  			XLowerWindow(dpy, c->win); | 
