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