separated several functions into view.c
This commit is contained in:
		
							
								
								
									
										2
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								Makefile
									
									
									
									
									
								
							| @@ -3,7 +3,7 @@ | ||||
|  | ||||
| include config.mk | ||||
|  | ||||
| SRC = client.c draw.c event.c main.c tag.c util.c | ||||
| SRC = client.c draw.c event.c main.c tag.c util.c view.c | ||||
| OBJ = ${SRC:.c=.o} | ||||
|  | ||||
| all: options dwm | ||||
|   | ||||
							
								
								
									
										61
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										61
									
								
								client.c
									
									
									
									
									
								
							| @@ -89,40 +89,6 @@ focus(Client *c) | ||||
| 	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); | ||||
| } | ||||
|  | ||||
| void | ||||
| focusnext(Arg *arg) | ||||
| { | ||||
| 	Client *c; | ||||
|     | ||||
| 	if(!sel) | ||||
| 		return; | ||||
|  | ||||
| 	if(!(c = getnext(sel->next))) | ||||
| 		c = getnext(clients); | ||||
| 	if(c) { | ||||
| 		focus(c); | ||||
| 		restack(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void | ||||
| focusprev(Arg *arg) | ||||
| { | ||||
| 	Client *c; | ||||
|  | ||||
| 	if(!sel) | ||||
| 		return; | ||||
|  | ||||
| 	if(!(c = getprev(sel->prev))) { | ||||
| 		for(c = clients; c && c->next; c = c->next); | ||||
| 		c = getprev(c); | ||||
| 	} | ||||
| 	if(c) { | ||||
| 		focus(c); | ||||
| 		restack(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| Client * | ||||
| getclient(Window w) | ||||
| { | ||||
| @@ -446,30 +412,3 @@ unmanage(Client *c) | ||||
| 		focus(sel); | ||||
| 	arrange(NULL); | ||||
| } | ||||
|  | ||||
| void | ||||
| zoom(Arg *arg) | ||||
| { | ||||
| 	Client *c; | ||||
|  | ||||
| 	if(!sel || (arrange != dotile) || sel->isfloat || sel->ismax) | ||||
| 		return; | ||||
|  | ||||
| 	if(sel == getnext(clients))  { | ||||
| 		if((c = getnext(sel->next))) | ||||
| 			sel = c; | ||||
| 		else | ||||
| 			return; | ||||
| 	} | ||||
|  | ||||
| 	/* pop */ | ||||
| 	sel->prev->next = sel->next; | ||||
| 	if(sel->next) | ||||
| 		sel->next->prev = sel->prev; | ||||
| 	sel->prev = NULL; | ||||
| 	clients->prev = sel; | ||||
| 	sel->next = clients; | ||||
| 	clients = sel; | ||||
| 	focus(sel); | ||||
| 	arrange(NULL); | ||||
| } | ||||
|   | ||||
							
								
								
									
										22
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										22
									
								
								dwm.h
									
									
									
									
									
								
							| @@ -84,8 +84,6 @@ extern Window root, barwin; | ||||
| /* client.c */ | ||||
| extern void ban(Client *c); | ||||
| extern void focus(Client *c); | ||||
| extern void focusnext(Arg *arg); | ||||
| extern void focusprev(Arg *arg); | ||||
| extern Client *getclient(Window w); | ||||
| extern Client *getctitle(Window w); | ||||
| extern void gravitate(Client *c, Bool invert); | ||||
| @@ -96,7 +94,6 @@ extern void setsize(Client *c); | ||||
| extern void settitle(Client *c); | ||||
| extern void togglemax(Arg *arg); | ||||
| extern void unmanage(Client *c); | ||||
| extern void zoom(Arg *arg); | ||||
|  | ||||
| /* draw.c */ | ||||
| extern void drawall(); | ||||
| @@ -117,22 +114,27 @@ extern void sendevent(Window w, Atom a, long value); | ||||
| extern int xerror(Display *dsply, XErrorEvent *ee); | ||||
|  | ||||
| /* tag.c */ | ||||
| extern void dofloat(Arg *arg); | ||||
| extern void dotile(Arg *arg); | ||||
| extern void initrregs(); | ||||
| extern Bool isvisible(Client *c); | ||||
| extern Client *getnext(Client *c); | ||||
| extern Client *getprev(Client *c); | ||||
| extern void restack(); | ||||
| extern void settags(Client *c); | ||||
| extern void tag(Arg *arg); | ||||
| extern void togglemode(Arg *arg); | ||||
| extern void toggletag(Arg *arg); | ||||
| extern void toggleview(Arg *arg); | ||||
| extern void view(Arg *arg); | ||||
|  | ||||
| /* util.c */ | ||||
| extern void *emallocz(unsigned int size); | ||||
| extern void eprint(const char *errstr, ...); | ||||
| extern void *erealloc(void *ptr, unsigned int size); | ||||
| extern void spawn(Arg *arg); | ||||
|  | ||||
| /* view.c */ | ||||
| extern void dofloat(Arg *arg); | ||||
| extern void dotile(Arg *arg); | ||||
| extern void focusnext(Arg *arg); | ||||
| extern void focusprev(Arg *arg); | ||||
| extern Bool isvisible(Client *c); | ||||
| extern void restack(); | ||||
| extern void togglemode(Arg *arg); | ||||
| extern void toggleview(Arg *arg); | ||||
| extern void view(Arg *arg); | ||||
| extern void zoom(Arg *arg); | ||||
|   | ||||
							
								
								
									
										186
									
								
								tag.c
									
									
									
									
									
								
							
							
						
						
									
										186
									
								
								tag.c
									
									
									
									
									
								
							| @@ -30,97 +30,8 @@ RULES | ||||
| static RReg *rreg = NULL; | ||||
| static unsigned int len = 0; | ||||
|  | ||||
| void (*arrange)(Arg *) = DEFMODE; | ||||
|  | ||||
| /* extern */ | ||||
|  | ||||
| void | ||||
| dofloat(Arg *arg) | ||||
| { | ||||
| 	Client *c; | ||||
|  | ||||
| 	for(c = clients; c; c = c->next) { | ||||
| 		c->ismax = False; | ||||
| 		if(isvisible(c)) { | ||||
| 			resize(c, True, TopLeft); | ||||
| 		} | ||||
| 		else | ||||
| 			ban(c); | ||||
| 	} | ||||
| 	if(!sel || !isvisible(sel)) | ||||
| 		sel = getnext(clients); | ||||
| 	if(sel) | ||||
| 		focus(sel); | ||||
| 	else | ||||
| 		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); | ||||
| 	restack(); | ||||
| } | ||||
|  | ||||
| void | ||||
| dotile(Arg *arg) | ||||
| { | ||||
| 	int h, i, n, w; | ||||
| 	Client *c; | ||||
|  | ||||
| 	w = sw - mw; | ||||
| 	for(n = 0, c = clients; c; c = c->next) | ||||
| 		if(isvisible(c) && !c->isfloat) | ||||
| 			n++; | ||||
|  | ||||
| 	if(n > 1) | ||||
| 		h = (sh - bh) / (n - 1); | ||||
| 	else | ||||
| 		h = sh - bh; | ||||
|  | ||||
| 	for(i = 0, c = clients; c; c = c->next) { | ||||
| 		c->ismax = False; | ||||
| 		if(isvisible(c)) { | ||||
| 			if(c->isfloat) { | ||||
| 				resize(c, True, TopLeft); | ||||
| 				continue; | ||||
| 			} | ||||
| 			if(n == 1) { | ||||
| 				c->x = sx; | ||||
| 				c->y = sy + bh; | ||||
| 				c->w = sw - 2; | ||||
| 				c->h = sh - 2 - bh; | ||||
| 			} | ||||
| 			else if(i == 0) { | ||||
| 				c->x = sx; | ||||
| 				c->y = sy + bh; | ||||
| 				c->w = mw - 2; | ||||
| 				c->h = sh - 2 - bh; | ||||
| 			} | ||||
| 			else if(h > bh) { | ||||
| 				c->x = sx + mw; | ||||
| 				c->y = sy + (i - 1) * h + bh; | ||||
| 				c->w = w - 2; | ||||
| 				if(i + 1 == n) | ||||
| 					c->h = sh - c->y - 2; | ||||
| 				else | ||||
| 					c->h = h - 2; | ||||
| 			} | ||||
| 			else { /* fallback if h < bh */ | ||||
| 				c->x = sx + mw; | ||||
| 				c->y = sy + bh; | ||||
| 				c->w = w - 2; | ||||
| 				c->h = sh - 2 - bh; | ||||
| 			} | ||||
| 			resize(c, False, TopLeft); | ||||
| 			i++; | ||||
| 		} | ||||
| 		else | ||||
| 			ban(c); | ||||
| 	} | ||||
| 	if(!sel || !isvisible(sel)) | ||||
| 		sel = getnext(clients); | ||||
| 	if(sel) | ||||
| 		focus(sel); | ||||
| 	else | ||||
| 		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); | ||||
| 	restack(); | ||||
| } | ||||
|  | ||||
| Client * | ||||
| getnext(Client *c) | ||||
| { | ||||
| @@ -164,69 +75,6 @@ initrregs() | ||||
| 	} | ||||
| } | ||||
|  | ||||
| Bool | ||||
| isvisible(Client *c) | ||||
| { | ||||
| 	unsigned int i; | ||||
|  | ||||
| 	for(i = 0; i < ntags; i++) | ||||
| 		if(c->tags[i] && seltag[i]) | ||||
| 			return True; | ||||
| 	return False; | ||||
| } | ||||
|  | ||||
| void | ||||
| restack() | ||||
| { | ||||
| 	static unsigned int nwins = 0; | ||||
| 	static Window *wins = NULL; | ||||
| 	unsigned int f, fi, m, mi, n; | ||||
| 	Client *c; | ||||
| 	XEvent ev; | ||||
|  | ||||
| 	for(f = 0, m = 0, c = clients; c; c = c->next) | ||||
| 		if(isvisible(c)) { | ||||
| 			if(c->isfloat || arrange == dofloat) | ||||
| 				f++; | ||||
| 			else | ||||
| 				m++; | ||||
| 		} | ||||
| 	if(!(n = 2 * (f + m))) { | ||||
| 		drawstatus(); | ||||
| 		return; | ||||
| 	} | ||||
| 	if(nwins < n) { | ||||
| 		nwins = n; | ||||
| 		wins = erealloc(wins, nwins * sizeof(Window)); | ||||
| 	} | ||||
|  | ||||
| 	fi = 0; | ||||
| 	mi = 2 * f; | ||||
| 	if(sel->isfloat || arrange == dofloat) { | ||||
| 		wins[fi++] = sel->title; | ||||
| 		wins[fi++] = sel->win; | ||||
| 	} | ||||
| 	else { | ||||
| 		wins[mi++] = sel->title; | ||||
| 		wins[mi++] = sel->win; | ||||
| 	} | ||||
| 	for(c = clients; c; c = c->next) | ||||
| 		if(isvisible(c) && c != sel) { | ||||
| 			if(c->isfloat || arrange == dofloat) { | ||||
| 				wins[fi++] = c->title; | ||||
| 				wins[fi++] = c->win; | ||||
| 			} | ||||
| 			else { | ||||
| 				wins[mi++] = c->title; | ||||
| 				wins[mi++] = c->win; | ||||
| 			} | ||||
| 		} | ||||
| 	XRestackWindows(dpy, wins, n); | ||||
| 	drawall(); | ||||
| 	XSync(dpy, False); | ||||
| 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | ||||
| } | ||||
|  | ||||
| void | ||||
| settags(Client *c) | ||||
| { | ||||
| @@ -276,16 +124,6 @@ tag(Arg *arg) | ||||
| 		arrange(NULL); | ||||
| } | ||||
|  | ||||
| void | ||||
| togglemode(Arg *arg) | ||||
| { | ||||
| 	arrange = arrange == dofloat ? dotile : dofloat; | ||||
| 	if(sel) | ||||
| 		arrange(NULL); | ||||
| 	else | ||||
| 		drawstatus(); | ||||
| } | ||||
|  | ||||
| void | ||||
| toggletag(Arg *arg) | ||||
| { | ||||
| @@ -302,27 +140,3 @@ toggletag(Arg *arg) | ||||
| 	if(!isvisible(sel)) | ||||
| 		arrange(NULL); | ||||
| } | ||||
|  | ||||
|  | ||||
| void | ||||
| toggleview(Arg *arg) | ||||
| { | ||||
| 	unsigned int i; | ||||
|  | ||||
| 	seltag[arg->i] = !seltag[arg->i]; | ||||
| 	for(i = 0; i < ntags && !seltag[i]; i++); | ||||
| 	if(i == ntags) | ||||
| 		seltag[arg->i] = True; /* cannot toggle last view */ | ||||
| 	arrange(NULL); | ||||
| } | ||||
|  | ||||
| void | ||||
| view(Arg *arg) | ||||
| { | ||||
| 	unsigned int i; | ||||
|  | ||||
| 	for(i = 0; i < ntags; i++) | ||||
| 		seltag[i] = False; | ||||
| 	seltag[arg->i] = True; | ||||
| 	arrange(NULL); | ||||
| } | ||||
|   | ||||
							
								
								
									
										253
									
								
								view.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										253
									
								
								view.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,253 @@ | ||||
| /* | ||||
|  * (C)opyright MMVI Anselm R. Garbe <garbeam at gmail dot com> | ||||
|  * See LICENSE file for license details. | ||||
|  */ | ||||
| #include "dwm.h" | ||||
|  | ||||
| /* extern */ | ||||
|  | ||||
| void (*arrange)(Arg *) = DEFMODE; | ||||
|  | ||||
| void | ||||
| dofloat(Arg *arg) | ||||
| { | ||||
| 	Client *c; | ||||
|  | ||||
| 	for(c = clients; c; c = c->next) { | ||||
| 		c->ismax = False; | ||||
| 		if(isvisible(c)) { | ||||
| 			resize(c, True, TopLeft); | ||||
| 		} | ||||
| 		else | ||||
| 			ban(c); | ||||
| 	} | ||||
| 	if(!sel || !isvisible(sel)) | ||||
| 		sel = getnext(clients); | ||||
| 	if(sel) | ||||
| 		focus(sel); | ||||
| 	else | ||||
| 		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); | ||||
| 	restack(); | ||||
| } | ||||
|  | ||||
| void | ||||
| dotile(Arg *arg) | ||||
| { | ||||
| 	int h, i, n, w; | ||||
| 	Client *c; | ||||
|  | ||||
| 	w = sw - mw; | ||||
| 	for(n = 0, c = clients; c; c = c->next) | ||||
| 		if(isvisible(c) && !c->isfloat) | ||||
| 			n++; | ||||
|  | ||||
| 	if(n > 1) | ||||
| 		h = (sh - bh) / (n - 1); | ||||
| 	else | ||||
| 		h = sh - bh; | ||||
|  | ||||
| 	for(i = 0, c = clients; c; c = c->next) { | ||||
| 		c->ismax = False; | ||||
| 		if(isvisible(c)) { | ||||
| 			if(c->isfloat) { | ||||
| 				resize(c, True, TopLeft); | ||||
| 				continue; | ||||
| 			} | ||||
| 			if(n == 1) { | ||||
| 				c->x = sx; | ||||
| 				c->y = sy + bh; | ||||
| 				c->w = sw - 2; | ||||
| 				c->h = sh - 2 - bh; | ||||
| 			} | ||||
| 			else if(i == 0) { | ||||
| 				c->x = sx; | ||||
| 				c->y = sy + bh; | ||||
| 				c->w = mw - 2; | ||||
| 				c->h = sh - 2 - bh; | ||||
| 			} | ||||
| 			else if(h > bh) { | ||||
| 				c->x = sx + mw; | ||||
| 				c->y = sy + (i - 1) * h + bh; | ||||
| 				c->w = w - 2; | ||||
| 				if(i + 1 == n) | ||||
| 					c->h = sh - c->y - 2; | ||||
| 				else | ||||
| 					c->h = h - 2; | ||||
| 			} | ||||
| 			else { /* fallback if h < bh */ | ||||
| 				c->x = sx + mw; | ||||
| 				c->y = sy + bh; | ||||
| 				c->w = w - 2; | ||||
| 				c->h = sh - 2 - bh; | ||||
| 			} | ||||
| 			resize(c, False, TopLeft); | ||||
| 			i++; | ||||
| 		} | ||||
| 		else | ||||
| 			ban(c); | ||||
| 	} | ||||
| 	if(!sel || !isvisible(sel)) | ||||
| 		sel = getnext(clients); | ||||
| 	if(sel) | ||||
| 		focus(sel); | ||||
| 	else | ||||
| 		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); | ||||
| 	restack(); | ||||
| } | ||||
|  | ||||
| void | ||||
| focusnext(Arg *arg) | ||||
| { | ||||
| 	Client *c; | ||||
|     | ||||
| 	if(!sel) | ||||
| 		return; | ||||
|  | ||||
| 	if(!(c = getnext(sel->next))) | ||||
| 		c = getnext(clients); | ||||
| 	if(c) { | ||||
| 		focus(c); | ||||
| 		restack(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| void | ||||
| focusprev(Arg *arg) | ||||
| { | ||||
| 	Client *c; | ||||
|  | ||||
| 	if(!sel) | ||||
| 		return; | ||||
|  | ||||
| 	if(!(c = getprev(sel->prev))) { | ||||
| 		for(c = clients; c && c->next; c = c->next); | ||||
| 		c = getprev(c); | ||||
| 	} | ||||
| 	if(c) { | ||||
| 		focus(c); | ||||
| 		restack(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| Bool | ||||
| isvisible(Client *c) | ||||
| { | ||||
| 	unsigned int i; | ||||
|  | ||||
| 	for(i = 0; i < ntags; i++) | ||||
| 		if(c->tags[i] && seltag[i]) | ||||
| 			return True; | ||||
| 	return False; | ||||
| } | ||||
|  | ||||
| void | ||||
| restack() | ||||
| { | ||||
| 	static unsigned int nwins = 0; | ||||
| 	static Window *wins = NULL; | ||||
| 	unsigned int f, fi, m, mi, n; | ||||
| 	Client *c; | ||||
| 	XEvent ev; | ||||
|  | ||||
| 	for(f = 0, m = 0, c = clients; c; c = c->next) | ||||
| 		if(isvisible(c)) { | ||||
| 			if(c->isfloat || arrange == dofloat) | ||||
| 				f++; | ||||
| 			else | ||||
| 				m++; | ||||
| 		} | ||||
| 	if(!(n = 2 * (f + m))) { | ||||
| 		drawstatus(); | ||||
| 		return; | ||||
| 	} | ||||
| 	if(nwins < n) { | ||||
| 		nwins = n; | ||||
| 		wins = erealloc(wins, nwins * sizeof(Window)); | ||||
| 	} | ||||
|  | ||||
| 	fi = 0; | ||||
| 	mi = 2 * f; | ||||
| 	if(sel->isfloat || arrange == dofloat) { | ||||
| 		wins[fi++] = sel->title; | ||||
| 		wins[fi++] = sel->win; | ||||
| 	} | ||||
| 	else { | ||||
| 		wins[mi++] = sel->title; | ||||
| 		wins[mi++] = sel->win; | ||||
| 	} | ||||
| 	for(c = clients; c; c = c->next) | ||||
| 		if(isvisible(c) && c != sel) { | ||||
| 			if(c->isfloat || arrange == dofloat) { | ||||
| 				wins[fi++] = c->title; | ||||
| 				wins[fi++] = c->win; | ||||
| 			} | ||||
| 			else { | ||||
| 				wins[mi++] = c->title; | ||||
| 				wins[mi++] = c->win; | ||||
| 			} | ||||
| 		} | ||||
| 	XRestackWindows(dpy, wins, n); | ||||
| 	drawall(); | ||||
| 	XSync(dpy, False); | ||||
| 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); | ||||
| } | ||||
|  | ||||
| void | ||||
| togglemode(Arg *arg) | ||||
| { | ||||
| 	arrange = arrange == dofloat ? dotile : dofloat; | ||||
| 	if(sel) | ||||
| 		arrange(NULL); | ||||
| 	else | ||||
| 		drawstatus(); | ||||
| } | ||||
|  | ||||
| void | ||||
| toggleview(Arg *arg) | ||||
| { | ||||
| 	unsigned int i; | ||||
|  | ||||
| 	seltag[arg->i] = !seltag[arg->i]; | ||||
| 	for(i = 0; i < ntags && !seltag[i]; i++); | ||||
| 	if(i == ntags) | ||||
| 		seltag[arg->i] = True; /* cannot toggle last view */ | ||||
| 	arrange(NULL); | ||||
| } | ||||
|  | ||||
| void | ||||
| view(Arg *arg) | ||||
| { | ||||
| 	unsigned int i; | ||||
|  | ||||
| 	for(i = 0; i < ntags; i++) | ||||
| 		seltag[i] = False; | ||||
| 	seltag[arg->i] = True; | ||||
| 	arrange(NULL); | ||||
| } | ||||
|  | ||||
| void | ||||
| zoom(Arg *arg) | ||||
| { | ||||
| 	Client *c; | ||||
|  | ||||
| 	if(!sel || (arrange != dotile) || sel->isfloat || sel->ismax) | ||||
| 		return; | ||||
|  | ||||
| 	if(sel == getnext(clients))  { | ||||
| 		if((c = getnext(sel->next))) | ||||
| 			sel = c; | ||||
| 		else | ||||
| 			return; | ||||
| 	} | ||||
|  | ||||
| 	/* pop */ | ||||
| 	sel->prev->next = sel->next; | ||||
| 	if(sel->next) | ||||
| 		sel->next->prev = sel->prev; | ||||
| 	sel->prev = NULL; | ||||
| 	clients->prev = sel; | ||||
| 	sel->next = clients; | ||||
| 	clients = sel; | ||||
| 	focus(sel); | ||||
| 	arrange(NULL); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user