using double-linked list in order to get correct prev focus handling
This commit is contained in:
		
							parent
							
								
									06dc514bc7
								
							
						
					
					
						commit
						72707c2fae
					
				
							
								
								
									
										46
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										46
									
								
								client.c
									
									
									
									
									
								
							| @ -77,7 +77,6 @@ focusnext(Arg *arg) | |||||||
| 		c = getnext(clients, tsel); | 		c = getnext(clients, tsel); | ||||||
| 	if(c) { | 	if(c) { | ||||||
| 		higher(c); | 		higher(c); | ||||||
| 		c->revert = sel; |  | ||||||
| 		focus(c); | 		focus(c); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| @ -93,7 +92,11 @@ focusprev(Arg *arg) | |||||||
| 	if(sel->ismax) | 	if(sel->ismax) | ||||||
| 		togglemax(NULL); | 		togglemax(NULL); | ||||||
| 
 | 
 | ||||||
| 	if((c = sel->revert && sel->revert->tags[tsel] ? sel->revert : NULL)) { | 	if(!(c = getprev(sel->prev))) { | ||||||
|  | 		for(c = clients; c && c->next; c = c->next); | ||||||
|  | 		c = getprev(c); | ||||||
|  | 	} | ||||||
|  | 	if(c) { | ||||||
| 		higher(c); | 		higher(c); | ||||||
| 		focus(c); | 		focus(c); | ||||||
| 	} | 	} | ||||||
| @ -127,6 +130,8 @@ gravitate(Client *c, Bool invert) | |||||||
| 	int dx = 0, dy = 0; | 	int dx = 0, dy = 0; | ||||||
| 
 | 
 | ||||||
| 	switch(c->grav) { | 	switch(c->grav) { | ||||||
|  | 	default: | ||||||
|  | 		break; | ||||||
| 	case StaticGravity: | 	case StaticGravity: | ||||||
| 	case NorthWestGravity: | 	case NorthWestGravity: | ||||||
| 	case NorthGravity: | 	case NorthGravity: | ||||||
| @ -143,11 +148,11 @@ gravitate(Client *c, Bool invert) | |||||||
| 	case SouthWestGravity: | 	case SouthWestGravity: | ||||||
| 		dy = -(c->h); | 		dy = -(c->h); | ||||||
| 		break; | 		break; | ||||||
| 	default: |  | ||||||
| 		break; |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	switch (c->grav) { | 	switch (c->grav) { | ||||||
|  | 	default: | ||||||
|  | 		break; | ||||||
| 	case StaticGravity: | 	case StaticGravity: | ||||||
| 	case NorthWestGravity: | 	case NorthWestGravity: | ||||||
| 	case WestGravity: | 	case WestGravity: | ||||||
| @ -164,8 +169,6 @@ gravitate(Client *c, Bool invert) | |||||||
| 	case SouthEastGravity: | 	case SouthEastGravity: | ||||||
| 		dx = -(c->w + c->border); | 		dx = -(c->w + c->border); | ||||||
| 		break; | 		break; | ||||||
| 	default: |  | ||||||
| 		break; |  | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if(invert) { | 	if(invert) { | ||||||
| @ -204,7 +207,6 @@ lower(Client *c) | |||||||
| void | void | ||||||
| manage(Window w, XWindowAttributes *wa) | manage(Window w, XWindowAttributes *wa) | ||||||
| { | { | ||||||
| 	int diff; |  | ||||||
| 	Client *c; | 	Client *c; | ||||||
| 	Window trans; | 	Window trans; | ||||||
| 	XSetWindowAttributes twa; | 	XSetWindowAttributes twa; | ||||||
| @ -224,7 +226,7 @@ manage(Window w, XWindowAttributes *wa) | |||||||
| 	c->proto = getproto(c->win); | 	c->proto = getproto(c->win); | ||||||
| 	setsize(c); | 	setsize(c); | ||||||
| 	XSelectInput(dpy, c->win, | 	XSelectInput(dpy, c->win, | ||||||
| 			StructureNotifyMask | PropertyChangeMask | EnterWindowMask); | 		StructureNotifyMask | PropertyChangeMask | EnterWindowMask); | ||||||
| 	XGetTransientForHint(dpy, c->win, &trans); | 	XGetTransientForHint(dpy, c->win, &trans); | ||||||
| 	twa.override_redirect = 1; | 	twa.override_redirect = 1; | ||||||
| 	twa.background_pixmap = ParentRelative; | 	twa.background_pixmap = ParentRelative; | ||||||
| @ -237,6 +239,8 @@ manage(Window w, XWindowAttributes *wa) | |||||||
| 
 | 
 | ||||||
| 	settags(c); | 	settags(c); | ||||||
| 
 | 
 | ||||||
|  | 	if(clients) | ||||||
|  | 		clients->prev = c; | ||||||
| 	c->next = clients; | 	c->next = clients; | ||||||
| 	clients = c; | 	clients = c; | ||||||
| 
 | 
 | ||||||
| @ -264,6 +268,7 @@ manage(Window w, XWindowAttributes *wa) | |||||||
| 	else { | 	else { | ||||||
| 		XMapRaised(dpy, c->win); | 		XMapRaised(dpy, c->win); | ||||||
| 		XMapRaised(dpy, c->title); | 		XMapRaised(dpy, c->title); | ||||||
|  | 
 | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -273,9 +278,15 @@ pop(Client *c) | |||||||
| 	Client **l; | 	Client **l; | ||||||
| 
 | 
 | ||||||
| 	for(l = &clients; *l && *l != c; l = &(*l)->next); | 	for(l = &clients; *l && *l != c; l = &(*l)->next); | ||||||
|  | 	if(c->prev) | ||||||
|  | 		c->prev->next = c->next; | ||||||
|  | 	if(c->next) | ||||||
|  | 		c->next->prev = c->prev; | ||||||
| 	*l = c->next; | 	*l = c->next; | ||||||
| 
 | 
 | ||||||
| 	c->next = clients; /* pop */ | 	if(clients) | ||||||
|  | 		clients->prev = c; | ||||||
|  | 	c->next = clients; | ||||||
| 	clients = c; | 	clients = c; | ||||||
| 	arrange(NULL); | 	arrange(NULL); | ||||||
| } | } | ||||||
| @ -439,13 +450,18 @@ unmanage(Client *c) | |||||||
| 	XDestroyWindow(dpy, c->title); | 	XDestroyWindow(dpy, c->title); | ||||||
| 
 | 
 | ||||||
| 	for(l = &clients; *l && *l != c; l = &(*l)->next); | 	for(l = &clients; *l && *l != c; l = &(*l)->next); | ||||||
|  | 	if(c->prev) | ||||||
|  | 		c->prev->next = c->next; | ||||||
|  | 	if(c->next) | ||||||
|  | 		c->next->prev = c->prev; | ||||||
| 	*l = c->next; | 	*l = c->next; | ||||||
| 	for(l = &clients; *l; l = &(*l)->next) | 	if(sel == c) { | ||||||
| 		if((*l)->revert == c) | 		sel = getnext(c->next, tsel); | ||||||
| 			(*l)->revert = NULL; | 		if(!sel) | ||||||
| 	if(sel == c) | 			sel = getprev(c->prev); | ||||||
| 		sel = sel->revert ? sel->revert : clients; | 		if(!sel) | ||||||
| 
 | 			sel = clients; | ||||||
|  | 	} | ||||||
| 	free(c); | 	free(c); | ||||||
| 
 | 
 | ||||||
| 	XSync(dpy, False); | 	XSync(dpy, False); | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								config.mk
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								config.mk
									
									
									
									
									
								
							| @ -13,12 +13,12 @@ VERSION = 0.5 | |||||||
| LIBS = -L${PREFIX}/lib -L/usr/lib -lc -L${X11LIB} -lX11 | LIBS = -L${PREFIX}/lib -L/usr/lib -lc -L${X11LIB} -lX11 | ||||||
| 
 | 
 | ||||||
| # Linux/BSD
 | # Linux/BSD
 | ||||||
| CFLAGS = -O3 -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
 | #CFLAGS = -O3 -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
 | ||||||
| 	-DVERSION=\"${VERSION}\" |  | ||||||
| LDFLAGS = ${LIBS} |  | ||||||
| #CFLAGS = -g -Wall -O2 -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
 |  | ||||||
| #	-DVERSION=\"${VERSION}\"
 | #	-DVERSION=\"${VERSION}\"
 | ||||||
| #LDFLAGS = -g ${LIBS}
 | #LDFLAGS = ${LIBS}
 | ||||||
|  | CFLAGS = -g -Wall -O2 -I. -I${PREFIX}/include -I/usr/include -I${X11INC} \
 | ||||||
|  | 	-DVERSION=\"${VERSION}\" | ||||||
|  | LDFLAGS = -g ${LIBS} | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| # Solaris
 | # Solaris
 | ||||||
|  | |||||||
							
								
								
									
										3
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								dwm.h
									
									
									
									
									
								
							| @ -76,7 +76,7 @@ struct Client { | |||||||
| 	Bool isfloat; | 	Bool isfloat; | ||||||
| 	Bool ismax; | 	Bool ismax; | ||||||
| 	Client *next; | 	Client *next; | ||||||
| 	Client *revert; | 	Client *prev; | ||||||
| 	Window win; | 	Window win; | ||||||
| 	Window title; | 	Window title; | ||||||
| }; | }; | ||||||
| @ -135,6 +135,7 @@ extern void appendtag(Arg *arg); | |||||||
| extern void dofloat(Arg *arg); | extern void dofloat(Arg *arg); | ||||||
| extern void dotile(Arg *arg); | extern void dotile(Arg *arg); | ||||||
| extern Client *getnext(Client *c, unsigned int t); | extern Client *getnext(Client *c, unsigned int t); | ||||||
|  | extern Client *getprev(Client *c); | ||||||
| extern void heretag(Arg *arg); | extern void heretag(Arg *arg); | ||||||
| extern void replacetag(Arg *arg); | extern void replacetag(Arg *arg); | ||||||
| extern void settags(Client *c); | extern void settags(Client *c); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 arg@10ksloc.org
						arg@10ksloc.org