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