made Layout a static struct in layout.c, added some convenience getters in layout.c, now lt->arrange accesses are not possible anymore, arrange() is the super-arrange function which sets up all layouts
This commit is contained in:
		
							parent
							
								
									2feb3afe78
								
							
						
					
					
						commit
						77044e8765
					
				
							
								
								
									
										9
									
								
								client.c
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								client.c
									
									
									
									
									
								
							| @ -230,13 +230,14 @@ manage(Window w, XWindowAttributes *wa) { | |||||||
| 	setclientstate(c, IconicState); | 	setclientstate(c, IconicState); | ||||||
| 	c->isbanned = True; | 	c->isbanned = True; | ||||||
| 	focus(c); | 	focus(c); | ||||||
| 	lt->arrange(); | 	arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| resize(Client *c, int x, int y, int w, int h, Bool sizehints) { | resize(Client *c, int x, int y, int w, int h, Bool sizehints) { | ||||||
| 	double dx, dy, max, min, ratio; | 	double dx, dy, max, min, ratio; | ||||||
| 	XWindowChanges wc;  | 	XWindowChanges wc;  | ||||||
|  | 
 | ||||||
| 	if(sizehints) { | 	if(sizehints) { | ||||||
| 		if(c->minay > 0 && c->maxay > 0 && (h - c->baseh) > 0 && (w - c->basew) > 0) { | 		if(c->minay > 0 && c->maxay > 0 && (h - c->baseh) > 0 && (w - c->basew) > 0) { | ||||||
| 			dx = (double)(w - c->basew); | 			dx = (double)(w - c->basew); | ||||||
| @ -297,12 +298,12 @@ resize(Client *c, int x, int y, int w, int h, Bool sizehints) { | |||||||
| 
 | 
 | ||||||
| void | void | ||||||
| togglefloating(const char *arg) { | togglefloating(const char *arg) { | ||||||
| 	if(!sel || lt->arrange == floating) | 	if(!sel || isfloating()) | ||||||
| 		return; | 		return; | ||||||
| 	sel->isfloating = !sel->isfloating; | 	sel->isfloating = !sel->isfloating; | ||||||
| 	if(sel->isfloating) | 	if(sel->isfloating) | ||||||
| 		resize(sel, sel->x, sel->y, sel->w, sel->h, True); | 		resize(sel, sel->x, sel->y, sel->w, sel->h, True); | ||||||
| 	lt->arrange(); | 	arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -334,7 +335,7 @@ unmanage(Client *c) { | |||||||
| 	XSync(dpy, False); | 	XSync(dpy, False); | ||||||
| 	XSetErrorHandler(xerror); | 	XSetErrorHandler(xerror); | ||||||
| 	XUngrabServer(dpy); | 	XUngrabServer(dpy); | ||||||
| 	lt->arrange(); | 	arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
|  | |||||||
| @ -20,8 +20,8 @@ LIBS = -L/usr/lib -lc -L${X11LIB} -lX11 | |||||||
| # flags
 | # flags
 | ||||||
| CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" | CFLAGS = -Os ${INCS} -DVERSION=\"${VERSION}\" | ||||||
| LDFLAGS = -s ${LIBS} | LDFLAGS = -s ${LIBS} | ||||||
| CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\" | #CFLAGS = -g -Wall -O2 ${INCS} -DVERSION=\"${VERSION}\"
 | ||||||
| LDFLAGS = -g ${LIBS} | #LDFLAGS = -g ${LIBS}
 | ||||||
| 
 | 
 | ||||||
| # Solaris
 | # Solaris
 | ||||||
| #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
 | #CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
 | ||||||
|  | |||||||
							
								
								
									
										2
									
								
								draw.c
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								draw.c
									
									
									
									
									
								
							| @ -66,7 +66,7 @@ drawstatus(void) { | |||||||
| 		dc.x += dc.w; | 		dc.x += dc.w; | ||||||
| 	} | 	} | ||||||
| 	dc.w = blw; | 	dc.w = blw; | ||||||
| 	drawtext(lt->symbol, dc.norm); | 	drawtext(getsymbol(), dc.norm); | ||||||
| 	x = dc.x + dc.w; | 	x = dc.x + dc.w; | ||||||
| 	dc.w = textw(stext); | 	dc.w = textw(stext); | ||||||
| 	dc.x = sw - dc.w; | 	dc.x = sw - dc.w; | ||||||
|  | |||||||
							
								
								
									
										11
									
								
								dwm.h
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								dwm.h
									
									
									
									
									
								
							| @ -74,11 +74,6 @@ typedef struct { | |||||||
| 	} font; | 	} font; | ||||||
| } DC; /* draw context */ | } DC; /* draw context */ | ||||||
| 
 | 
 | ||||||
| typedef struct { |  | ||||||
| 	const char *symbol; |  | ||||||
| 	void (*arrange)(void); |  | ||||||
| } Layout; |  | ||||||
| 
 |  | ||||||
| extern const char *tags[];			/* all tags */ | extern const char *tags[];			/* all tags */ | ||||||
| extern char stext[256];				/* status text */ | extern char stext[256];				/* status text */ | ||||||
| extern int screen, sx, sy, sw, sh;		/* screen geometry */ | extern int screen, sx, sy, sw, sh;		/* screen geometry */ | ||||||
| @ -92,7 +87,6 @@ extern Client *clients, *sel, *stack;		/* global client list and stack */ | |||||||
| extern Cursor cursor[CurLast]; | extern Cursor cursor[CurLast]; | ||||||
| extern DC dc;					/* global draw context */ | extern DC dc;					/* global draw context */ | ||||||
| extern Display *dpy; | extern Display *dpy; | ||||||
| extern Layout *lt; |  | ||||||
| extern Window root, barwin; | extern Window root, barwin; | ||||||
| 
 | 
 | ||||||
| /* client.c */ | /* client.c */ | ||||||
| @ -120,8 +114,11 @@ unsigned int textw(const char *text);	/* return the width of text in px*/ | |||||||
| void grabkeys(void);			/* grab all keys defined in config.h */ | void grabkeys(void);			/* grab all keys defined in config.h */ | ||||||
| 
 | 
 | ||||||
| /* layout.c */ | /* layout.c */ | ||||||
| void floating(void);			/* arranges all windows floating, fallback layout  */ | void arrange(void);			/* arranges all windows depending on the layout in use */ | ||||||
| void focusclient(const char *arg);	/* focuses next(1)/previous(-1) visible client */ | void focusclient(const char *arg);	/* focuses next(1)/previous(-1) visible client */ | ||||||
|  | const char *getsymbol(void);		/* returns True  symbol of enabled layout */ | ||||||
|  | Bool isfloating(void);			/* returns True if floating layout is enabled */ | ||||||
|  | Bool isarrange(void (*func)());		/* returns True if func is the layout function in use */ | ||||||
| void initlayouts(void);			/* initialize layout array */ | void initlayouts(void);			/* initialize layout array */ | ||||||
| Client *nexttiled(Client *c);		/* returns tiled successor of c */ | Client *nexttiled(Client *c);		/* returns tiled successor of c */ | ||||||
| void restack(void);			/* restores z layers of all clients */ | void restack(void);			/* restores z layers of all clients */ | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								event.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								event.c
									
									
									
									
									
								
							| @ -145,14 +145,14 @@ buttonpress(XEvent *e) { | |||||||
| 		focus(c); | 		focus(c); | ||||||
| 		if(CLEANMASK(ev->state) != MODKEY) | 		if(CLEANMASK(ev->state) != MODKEY) | ||||||
| 			return; | 			return; | ||||||
| 		if(ev->button == Button1 && (lt->arrange == floating || c->isfloating)) { | 		if(ev->button == Button1 && (isfloating() || c->isfloating)) { | ||||||
| 			restack(); | 			restack(); | ||||||
| 			movemouse(c); | 			movemouse(c); | ||||||
| 		} | 		} | ||||||
| 		else if(ev->button == Button2) | 		else if(ev->button == Button2) | ||||||
| 			zoom(NULL); | 			zoom(NULL); | ||||||
| 		else if(ev->button == Button3 | 		else if(ev->button == Button3 | ||||||
| 		&& (lt->arrange == floating || c->isfloating) && !c->isfixed) | 		&& (isfloating() || c->isfloating) && !c->isfixed) | ||||||
| 		{ | 		{ | ||||||
| 			restack(); | 			restack(); | ||||||
| 			resizemouse(c); | 			resizemouse(c); | ||||||
| @ -170,7 +170,7 @@ configurerequest(XEvent *e) { | |||||||
| 		c->ismax = False; | 		c->ismax = False; | ||||||
| 		if(ev->value_mask & CWBorderWidth) | 		if(ev->value_mask & CWBorderWidth) | ||||||
| 			c->border = ev->border_width; | 			c->border = ev->border_width; | ||||||
| 		if(c->isfixed || c->isfloating || (lt->arrange == floating)) { | 		if(c->isfixed || c->isfloating || isfloating()) { | ||||||
| 			if(ev->value_mask & CWX) | 			if(ev->value_mask & CWX) | ||||||
| 				c->x = ev->x; | 				c->x = ev->x; | ||||||
| 			if(ev->value_mask & CWY) | 			if(ev->value_mask & CWY) | ||||||
| @ -216,7 +216,7 @@ configurenotify(XEvent *e) { | |||||||
| 		dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen)); | 		dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen)); | ||||||
| 		XResizeWindow(dpy, barwin, sw, bh); | 		XResizeWindow(dpy, barwin, sw, bh); | ||||||
| 		updatebarpos(); | 		updatebarpos(); | ||||||
| 		lt->arrange(); | 		arrange(); | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -317,7 +317,7 @@ propertynotify(XEvent *e) { | |||||||
| 			case XA_WM_TRANSIENT_FOR: | 			case XA_WM_TRANSIENT_FOR: | ||||||
| 				XGetTransientForHint(dpy, c->win, &trans); | 				XGetTransientForHint(dpy, c->win, &trans); | ||||||
| 				if(!c->isfloating && (c->isfloating = (getclient(trans) != NULL))) | 				if(!c->isfloating && (c->isfloating = (getclient(trans) != NULL))) | ||||||
| 					lt->arrange(); | 					arrange(); | ||||||
| 				break; | 				break; | ||||||
| 			case XA_WM_NORMAL_HINTS: | 			case XA_WM_NORMAL_HINTS: | ||||||
| 				updatesizehints(c); | 				updatesizehints(c); | ||||||
|  | |||||||
							
								
								
									
										47
									
								
								layout.c
									
									
									
									
									
								
							
							
						
						
									
										47
									
								
								layout.c
									
									
									
									
									
								
							| @ -2,11 +2,25 @@ | |||||||
| #include "dwm.h" | #include "dwm.h" | ||||||
| #include <stdlib.h> | #include <stdlib.h> | ||||||
| 
 | 
 | ||||||
|  | typedef struct { | ||||||
|  | 	const char *symbol; | ||||||
|  | 	void (*arrange)(void); | ||||||
|  | } Layout; | ||||||
|  | 
 | ||||||
| unsigned int blw = 0; | unsigned int blw = 0; | ||||||
| Layout *lt = NULL; | static Layout *lt = NULL; | ||||||
| 
 | 
 | ||||||
| /* static */ | /* static */ | ||||||
| 
 | 
 | ||||||
|  | static void | ||||||
|  | floating(void) { | ||||||
|  | 	Client *c; | ||||||
|  | 
 | ||||||
|  | 	for(c = clients; c; c = c->next) | ||||||
|  | 		if(isvisible(c)) | ||||||
|  | 			resize(c, c->x, c->y, c->w, c->h, True); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static unsigned int nlayouts = 0; | static unsigned int nlayouts = 0; | ||||||
| 
 | 
 | ||||||
| LAYOUTS | LAYOUTS | ||||||
| @ -14,19 +28,15 @@ LAYOUTS | |||||||
| /* extern */ | /* extern */ | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| floating(void) { | arrange(void) { | ||||||
| 	Client *c; | 	Client *c; | ||||||
| 
 | 
 | ||||||
| 	if(lt->arrange != floating) |  | ||||||
| 		return; |  | ||||||
| 
 |  | ||||||
| 	for(c = clients; c; c = c->next) | 	for(c = clients; c; c = c->next) | ||||||
| 		if(isvisible(c)) { | 		if(isvisible(c)) | ||||||
| 			unban(c); | 			unban(c); | ||||||
| 			resize(c, c->x, c->y, c->w, c->h, True); |  | ||||||
| 		} |  | ||||||
| 		else | 		else | ||||||
| 			ban(c); | 			ban(c); | ||||||
|  | 	lt->arrange(); | ||||||
| 	focus(NULL); | 	focus(NULL); | ||||||
| 	restack(); | 	restack(); | ||||||
| } | } | ||||||
| @ -55,6 +65,23 @@ focusclient(const char *arg) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | const char * | ||||||
|  | getsymbol(void) | ||||||
|  | { | ||||||
|  | 	return lt->symbol; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Bool | ||||||
|  | isfloating(void) { | ||||||
|  | 	return lt->arrange == floating; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | Bool | ||||||
|  | isarrange(void (*func)()) | ||||||
|  | { | ||||||
|  | 	return func == lt->arrange; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void | void | ||||||
| initlayouts(void) { | initlayouts(void) { | ||||||
| 	unsigned int i, w; | 	unsigned int i, w; | ||||||
| @ -119,7 +146,7 @@ setlayout(const char *arg) { | |||||||
| 		lt = &layout[i]; | 		lt = &layout[i]; | ||||||
| 	} | 	} | ||||||
| 	if(sel) | 	if(sel) | ||||||
| 		lt->arrange(); | 		arrange(); | ||||||
| 	else | 	else | ||||||
| 		drawstatus(); | 		drawstatus(); | ||||||
| } | } | ||||||
| @ -131,7 +158,7 @@ togglebar(const char *arg) { | |||||||
| 	else | 	else | ||||||
| 		bpos = BarOff; | 		bpos = BarOff; | ||||||
| 	updatebarpos(); | 	updatebarpos(); | ||||||
| 	lt->arrange(); | 	arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
|  | |||||||
							
								
								
									
										8
									
								
								tag.c
									
									
									
									
									
								
							
							
						
						
									
										8
									
								
								tag.c
									
									
									
									
									
								
							| @ -110,7 +110,7 @@ tag(const char *arg) { | |||||||
| 	i = arg ? atoi(arg) : 0; | 	i = arg ? atoi(arg) : 0; | ||||||
| 	if(i >= 0 && i < ntags) | 	if(i >= 0 && i < ntags) | ||||||
| 		sel->tags[i] = True; | 		sel->tags[i] = True; | ||||||
| 	lt->arrange(); | 	arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -124,7 +124,7 @@ toggletag(const char *arg) { | |||||||
| 	for(j = 0; j < ntags && !sel->tags[j]; j++); | 	for(j = 0; j < ntags && !sel->tags[j]; j++); | ||||||
| 	if(j == ntags) | 	if(j == ntags) | ||||||
| 		sel->tags[i] = True; | 		sel->tags[i] = True; | ||||||
| 	lt->arrange(); | 	arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -136,7 +136,7 @@ toggleview(const char *arg) { | |||||||
| 	for(j = 0; j < ntags && !seltag[j]; j++); | 	for(j = 0; j < ntags && !seltag[j]; j++); | ||||||
| 	if(j == ntags) | 	if(j == ntags) | ||||||
| 		seltag[i] = True; /* cannot toggle last view */ | 		seltag[i] = True; /* cannot toggle last view */ | ||||||
| 	lt->arrange(); | 	arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -148,5 +148,5 @@ view(const char *arg) { | |||||||
| 	i = arg ? atoi(arg) : 0; | 	i = arg ? atoi(arg) : 0; | ||||||
| 	if(i >= 0 && i < ntags) | 	if(i >= 0 && i < ntags) | ||||||
| 		seltag[i] = True; | 		seltag[i] = True; | ||||||
| 	lt->arrange(); | 	arrange(); | ||||||
| } | } | ||||||
|  | |||||||
							
								
								
									
										13
									
								
								tile.c
									
									
									
									
									
								
							
							
						
						
									
										13
									
								
								tile.c
									
									
									
									
									
								
							| @ -12,7 +12,7 @@ void | |||||||
| addtomwfact(const char *arg) { | addtomwfact(const char *arg) { | ||||||
| 	double delta; | 	double delta; | ||||||
| 
 | 
 | ||||||
| 	if(lt->arrange != tile) | 	if(isarrange(tile)) | ||||||
| 		return; | 		return; | ||||||
| 
 | 
 | ||||||
| 	/* arg handling, manipulate mwfact */ | 	/* arg handling, manipulate mwfact */ | ||||||
| @ -20,7 +20,7 @@ addtomwfact(const char *arg) { | |||||||
| 		if(delta + mwfact > 0.1 && delta + mwfact < 0.9) | 		if(delta + mwfact > 0.1 && delta + mwfact < 0.9) | ||||||
| 			mwfact += delta; | 			mwfact += delta; | ||||||
| 	} | 	} | ||||||
| 	lt->arrange(); | 	arrange(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| @ -41,7 +41,6 @@ tile(void) { | |||||||
| 	ny = way; | 	ny = way; | ||||||
| 	for(i = 0, c = clients; c; c = c->next) | 	for(i = 0, c = clients; c; c = c->next) | ||||||
| 		if(isvisible(c)) { | 		if(isvisible(c)) { | ||||||
| 			unban(c); |  | ||||||
| 			if(c->isfloating) | 			if(c->isfloating) | ||||||
| 				continue; | 				continue; | ||||||
| 			c->ismax = False; | 			c->ismax = False; | ||||||
| @ -65,17 +64,13 @@ tile(void) { | |||||||
| 				ny += nh + 2 * c->border; | 				ny += nh + 2 * c->border; | ||||||
| 			i++; | 			i++; | ||||||
| 		} | 		} | ||||||
| 		else |  | ||||||
| 			ban(c); |  | ||||||
| 	focus(NULL); |  | ||||||
| 	restack(); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| void | void | ||||||
| zoom(const char *arg) { | zoom(const char *arg) { | ||||||
| 	Client *c; | 	Client *c; | ||||||
| 
 | 
 | ||||||
| 	if(!sel || lt->arrange == floating || sel->isfloating) | 	if(!sel || !isarrange(tile) || sel->isfloating) | ||||||
| 		return; | 		return; | ||||||
| 	if((c = sel) == nexttiled(clients)) | 	if((c = sel) == nexttiled(clients)) | ||||||
| 		if(!(c = nexttiled(c->next))) | 		if(!(c = nexttiled(c->next))) | ||||||
| @ -83,5 +78,5 @@ zoom(const char *arg) { | |||||||
| 	detach(c); | 	detach(c); | ||||||
| 	attach(c); | 	attach(c); | ||||||
| 	focus(c); | 	focus(c); | ||||||
| 	lt->arrange(); | 	arrange(); | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Anselm R. Garbe
						Anselm R. Garbe