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