diff options
| -rw-r--r-- | dwm.c | 97 | 
1 files changed, 52 insertions, 45 deletions
| @@ -129,6 +129,7 @@ typedef struct {  /* function declarations */  static void applyrules(Client *c); +static void applysizehints(Client *c, int *w, int *h);  static void arrange(void);  static void attach(Client *c);  static void attachstack(Client *c); @@ -271,6 +272,55 @@ applyrules(Client *c) {  }  void +applysizehints(Client *c, int *w, int *h) { +	Bool baseismin; + +	/* see last two sentences in ICCCM 4.1.2.3 */ +	baseismin = c->basew == c->minw && c->baseh == c->minh; + +	/* set minimum possible */ +	*w = MAX(1, *w); +	*h = MAX(1, *h); + +	if(!baseismin) { /* temporarily remove base dimensions */ +		*w -= c->basew; +		*h -= c->baseh; +	} + +	/* adjust for aspect limits */ +	if(c->mina > 0 && c->maxa > 0) { +		if(c->maxa < (float)*w / *h) +			*w = *h * c->maxa; +		else if(c->mina < (float)*h / *w) +			*h = *w * c->mina; +	} + +	if(baseismin) { /* increment calculation requires this */ +		*w -= c->basew; +		*h -= c->baseh; +	} + +	/* adjust for increment value */ +	if(c->incw) +		*w -= *w % c->incw; +	if(c->inch) +		*h -= *h % c->inch; + +	/* restore base dimensions */ +	*w += c->basew; +	*h += c->baseh; + +	*w = MAX(*w, c->minw); +	*h = MAX(*h, c->minh); + +	if(c->maxw) +		*w = MIN(*w, c->maxw); + +	if(c->maxh) +		*h = MIN(*h, c->maxh); +} + +void  arrange(void) {  	unsigned int nt;  	Client *c; @@ -1038,51 +1088,8 @@ void  resize(Client *c, int x, int y, int w, int h, Bool sizehints) {  	XWindowChanges wc; -	if(sizehints) { -		/* see last two sentences in ICCCM 4.1.2.3 */ -		Bool baseismin = c->basew == c->minw && c->baseh == c->minh; - -		/* set minimum possible */ -		w = MAX(1, w); -		h = MAX(1, h); - -		if(!baseismin) { /* temporarily remove base dimensions */ -			w -= c->basew; -			h -= c->baseh; -		} - -		/* adjust for aspect limits */ -		if(c->mina > 0 && c->maxa > 0) { -			if(c->maxa < (float)w / h) -				w = h * c->maxa; -			else if(c->mina < (float)h / w) -				h = w * c->mina; -		} - -		if(baseismin) { /* increment calculation requires this */ -			w -= c->basew; -			h -= c->baseh; -		} - -		/* adjust for increment value */ -		if(c->incw) -			w -= w % c->incw; -		if(c->inch) -			h -= h % c->inch; - -		/* restore base dimensions */ -		w += c->basew; -		h += c->baseh; - -		w = MAX(w, c->minw); -		h = MAX(h, c->minh); - -		if(c->maxw) -			w = MIN(w, c->maxw); - -		if(c->maxh) -			h = MIN(h, c->maxh); -	} +	if(sizehints) +		applysizehints(c, &w, &h);  	if(w <= 0 || h <= 0)  		return;  	if(x > sx + sw) | 
