using a global stack for focus recovery on arrange() - seems to work great
This commit is contained in:
		
							parent
							
								
									7ab8c87281
								
							
						
					
					
						commit
						15abade272
					
				
							
								
								
									
										16
									
								
								client.c
								
								
								
								
							
							
						
						
									
										16
									
								
								client.c
								
								
								
								
							| 
						 | 
				
			
			@ -10,6 +10,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)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										3
									
								
								dwm.h
								
								
								
								
							
							
						
						
									
										3
									
								
								dwm.h
								
								
								
								
							| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										1
									
								
								main.c
								
								
								
								
							
							
						
						
									
										1
									
								
								main.c
								
								
								
								
							| 
						 | 
				
			
			@ -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};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										14
									
								
								view.c
								
								
								
								
							
							
						
						
									
										14
									
								
								view.c
								
								
								
								
							| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue