diff options
| -rw-r--r-- | config.def.h | 12 | ||||
| -rw-r--r-- | dwm.1 | 3 | ||||
| -rw-r--r-- | dwm.c | 122 | 
3 files changed, 52 insertions, 85 deletions
| diff --git a/config.def.h b/config.def.h index 0b5d9e4..c8e88de 100644 --- a/config.def.h +++ b/config.def.h @@ -18,17 +18,8 @@ Rule rules[] = {  	{ "Gimp",	NULL,		NULL,		NULL,		True },  }; -/* geometries, s{x,y,w,h} and bh are already initualized here */ -/*   func name  bx  by  bw  wx  wy  ww     wh  mx  my       mw  mh     tx  ty     tw  th  mox moy mow moh */ -#define MFACT			0.55	/* master width factor [0.1 .. 0.9] */ -DEFGEOM(single,  0,  0, sw,  0, bh, sw, sh-bh, wx, wy, mfact*ww, wh, mx+mw, wy, ww-mw, wh,  wx, wy, ww, wh) - -Geom geoms[] = { -	/* symbol	function */ -	{ "[]",		single },	/* first entry is default */ -}; -  /* layout(s) */ +#define MFACT			0.55	/* master width factor [0.1 .. 0.9] */  #define RESIZEHINTS		True	/* False - respect size hints in tiled resizals */  #define SNAP			32	/* snap pixel */ @@ -58,7 +49,6 @@ Key keys[] = {  	{ MODKEY|ShiftMask,		XK_c,		killclient,	NULL },  	{ MODKEY,			XK_space,	setlayout,	NULL },  	{ MODKEY|ShiftMask,		XK_space,	togglefloating,	NULL }, -	{ MODKEY|ControlMask,		XK_space,	setgeom,	NULL },  	{ MODKEY,			XK_0,		view,		NULL },  	{ MODKEY,			XK_1,		view,		tags[0] },  	{ MODKEY,			XK_2,		view,		tags[1] }, @@ -60,9 +60,6 @@ Start  .B Mod1\-space  Toggles between layouts.  .TP -.B Mod1\-Control\-space -Toggles between geometries. -.TP  .B Mod1\-j  Focus next window.  .TP @@ -41,21 +41,13 @@  #include <X11/Xutil.h>  /* macros */ -#define MAX(a, b) ((a)>(b)?(a):(b)) -#define MIN(a, b) ((a)<(b)?(a):(b)) -#define BUTTONMASK		(ButtonPressMask|ButtonReleaseMask) -#define CLEANMASK(mask)		(mask & ~(numlockmask|LockMask)) -#define LENGTH(x)		(sizeof x / sizeof x[0]) -#define MAXTAGLEN		16 -#define MOUSEMASK		(BUTTONMASK|PointerMotionMask) -#define DEFGEOM(GEONAME,BX,BY,BW,WX,WY,WW,WH,MX,MY,MW,MH,TX,TY,TW,TH,MOX,MOY,MOW,MOH) \ -void GEONAME(void) { \ -	bx = (BX); by = (BY); bw = (BW); \ -	wx = (WX); wy = (WY); ww = (WW); wh = (WH); \ -	mx = (MX); my = (MY); mw = (MW); mh = (MH); \ -	tx = (TX); ty = (TY); tw = (TW); th = (TH); \ -	mox = (MOX); moy = (MOY); mow = (MOW); moh = (MOH); \ -} +#define MAX(a, b)	((a) > (b) ? (a) : (b)) +#define MIN(a, b)	((a) < (b) ? (a) : (b)) +#define BUTTONMASK	(ButtonPressMask|ButtonReleaseMask) +#define CLEANMASK(mask)	(mask & ~(numlockmask|LockMask)) +#define LENGTH(x)	(sizeof x / sizeof x[0]) +#define MAXTAGLEN	16 +#define MOUSEMASK	(BUTTONMASK|PointerMotionMask)  /* enums */  enum { CurNormal, CurResize, CurMove, CurLast };	/* cursor */ @@ -97,11 +89,6 @@ typedef struct {  } DC; /* draw context */  typedef struct { -	const char *symbol; -	void (*apply)(void); -} Geom; - -typedef struct {  	unsigned long mod;  	KeySym keysym;  	void (*func)(const char *arg); @@ -178,7 +165,6 @@ void restack(void);  void run(void);  void scan(void);  void setclientstate(Client *c, long state); -void setgeom(const char *arg);  void setlayout(const char *arg);  void setmfact(const char *arg);  void setup(void); @@ -198,7 +184,8 @@ void toggleview(const char *arg);  void unban(Client *c);  void unmanage(Client *c);  void unmapnotify(XEvent *e); -void updatebarpos(void); +void updatebar(void); +void updategeom(void);  void updatesizehints(Client *c);  void updatetitle(Client *c);  void updatewmhints(Client *c); @@ -213,7 +200,7 @@ void zoom(const char *arg);  char stext[256];  int screen, sx, sy, sw, sh;  int (*xerrorxlib)(Display *, XErrorEvent *); -int bx, by, bw, bh, blw, bgw, mx, my, mw, mh, mox, moy, mow, moh, tx, ty, tw, th, wx, wy, ww, wh; +int bx, by, bw, bh, blw, mx, my, mw, mh, tx, ty, tw, th, wx, wy, ww, wh;  int seltags = 0;  double mfact;  unsigned int numlockmask = 0; @@ -241,8 +228,6 @@ Client *stack = NULL;  Cursor cursor[CurLast];  Display *dpy;  DC dc = {0}; -Geom geoms[]; -Geom *geom = geoms;  Layout layouts[];  Layout *lt = layouts;  Window root, barwin; @@ -330,14 +315,10 @@ buttonpress(XEvent *e) {  	XButtonPressedEvent *ev = &e->xbutton;  	if(ev->window == barwin) { -		if((ev->x < bgw) && ev->button == Button1) { -			setgeom(NULL); -			return; -		} -		x = bgw; +		x = 0;  		for(i = 0; i < LENGTH(tags); i++) {  			x += textw(tags[i]); -			if(ev->x >= bgw && ev->x < x) { +			if(ev->x < x) {  				if(ev->button == Button1) {  					if(ev->state & MODKEY)  						tag(tags[i]); @@ -440,7 +421,9 @@ configurenotify(XEvent *e) {  	if(ev->window == root && (ev->width != sw || ev->height != sh)) {  		sw = ev->width;  		sh = ev->height; -		setgeom(geom->symbol); +		updategeom(); +		updatebar(); +		arrange();  	}  } @@ -531,11 +514,6 @@ drawbar(void) {  	Client *c;  	dc.x = 0; -	if(bgw > 0) { -		dc.w = bgw; -		drawtext(geom->symbol, dc.norm, False); -		dc.x += bgw; -	}  	for(c = stack; c && !isvisible(c, NULL); c = c->snext);  	for(i = 0; i < LENGTH(tags); i++) {  		dc.w = textw(tags[i]); @@ -1064,7 +1042,7 @@ monocle(void) {  	for(c = clients; c; c = c->next)  		if((lt->isfloating || !c->isfloating) &&  isvisible(c, NULL)) -			resize(c, mox, moy, mow - 2 * c->bw, moh - 2 * c->bw, RESIZEHINTS); +			resize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw, RESIZEHINTS);  }  void @@ -1399,27 +1377,6 @@ setclientstate(Client *c, long state) {  }  void -setgeom(const char *arg) { -	unsigned int i; - -	if(!arg) { -		if(++geom == &geoms[LENGTH(geoms)]) -			geom = &geoms[0]; -	} -	else { -		for(i = 0; i < LENGTH(geoms); i++) -			if(!strcmp(geoms[i].symbol, arg)) -				break; -		if(i == LENGTH(geoms)) -			return; -		geom = &geoms[i]; -	} -	geom->apply(); -	updatebarpos(); -	arrange(); -} - -void  setlayout(const char *arg) {  	unsigned int i; @@ -1457,7 +1414,8 @@ setmfact(const char *arg) {  			return;  		mfact = d;  	} -	setgeom(geom->symbol); +	updategeom(); +	arrange();  }  void @@ -1469,15 +1427,14 @@ setup(void) {  	screen = DefaultScreen(dpy);  	root = RootWindow(dpy, screen);  	initfont(FONT); - -	/* apply default geometry */  	sx = 0;  	sy = 0;  	sw = DisplayWidth(dpy, screen);  	sh = DisplayHeight(dpy, screen);  	bh = dc.font.height + 2; -	mfact = MFACT; -	geom->apply(); + +	/* update geometry */ +	updategeom();  	/* init atoms */  	wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); @@ -1517,10 +1474,6 @@ setup(void) {  		w = textw(layouts[i].symbol);  		blw = MAX(blw, w);  	} -	for(bgw = i = 0; LENGTH(geoms) > 1 && i < LENGTH(geoms); i++) { -		w = textw(geoms[i].symbol); -		bgw = MAX(bgw, w); -	}  	wa.override_redirect = 1;  	wa.background_pixmap = ParentRelative; @@ -1633,7 +1586,7 @@ tilemaster(unsigned int n) {  	Client *c = nexttiled(clients);  	if(n == 1) -		tileresize(c, mox, moy, mow - 2 * c->bw, moh - 2 * c->bw); +		tileresize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw);  	else  		tileresize(c, mx, my, mw - 2 * c->bw, mh - 2 * c->bw);  	return c; @@ -1751,7 +1704,7 @@ unmapnotify(XEvent *e) {  }  void -updatebarpos(void) { +updatebar(void) {  	if(dc.drawable != 0)  		XFreePixmap(dpy, dc.drawable); @@ -1760,6 +1713,34 @@ updatebarpos(void) {  }  void +updategeom(void) { + +	/* bar geometry */ +	bx = 0; +	by = 0; +	bw = sw; + +	/* window area geometry */ +	wx = sx; +	wy = sy; +	ww = sw; +	sh = sh - bh; + +	/* master area geometry */ +	mfact = MFACT; +	mx = wx; +	my = wy; +	mw = mfact * ww; +	mh = wh; + +	/* tile area geometry */ +	tx = mx + mw; +	ty = wy; +	tw = ww - mw; +	th = wh; +} + +void  updatesizehints(Client *c) {  	long msize;  	XSizeHints size; @@ -1912,4 +1893,3 @@ main(int argc, char *argv[]) {  	XCloseDisplay(dpy);  	return 0;  } - | 
