using a global stack for focus recovery on arrange() - seems to work great
							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