implemented aspect ratio support of windows 2ddc7872
Anselm R. Garbe · 2007-02-06 15:22 2 file(s) · +41 −4
client.c +40 −4
10 10
/* static */
11 11
12 12
static void
13 +
closestpt(float *rx, float *ry, float x, float y, float grad) {
14 +
	float u = (x * grad + y) / (grad * grad + 1);
15 +
	*rx = u * grad;
16 +
	*ry = u;
17 +
}
18 +
19 +
static void
13 20
detachstack(Client *c) {
14 21
	Client **tc;
15 22
	for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext);
184 191
185 192
void
186 193
resize(Client *c, Bool sizehints) {
194 +
	float dx, dy, min, max, actual;
187 195
	XWindowChanges wc;
188 196
189 197
	if(c->w <= 0 || c->h <= 0)
190 198
		return;
191 199
	if(sizehints) {
192 -
		if(c->incw)
193 -
			c->w -= (c->w - c->basew) % c->incw;
194 -
		if(c->inch)
195 -
			c->h -= (c->h - c->baseh) % c->inch;
196 200
		if(c->minw && c->w < c->minw)
197 201
			c->w = c->minw;
198 202
		if(c->minh && c->h < c->minh)
201 205
			c->w = c->maxw;
202 206
		if(c->maxh && c->h > c->maxh)
203 207
			c->h = c->maxh;
208 +
		/* inspired by algorithm from fluxbox */
209 +
		if(c->minay > 0 && c->maxay && (c->h - c->baseh) > 0) {
210 +
			dx = (float)(c->w - c->basew);
211 +
			dy = (float)(c->h - c->baseh);
212 +
			min = (float)(c->minax) / (float)(c->minay);
213 +
			max = (float)(c->maxax) / (float)(c->maxay);
214 +
			actual = dx / dy;
215 +
			if(max > 0 && min > 0 && actual > 0) {
216 +
				if(actual < min) {
217 +
					closestpt(&dx, &dy, dx, dy, min);
218 +
					c->w = (int)dx + c->basew;
219 +
					c->h = (int)dy + c->baseh;
220 +
				}
221 +
				else if(actual > max) {
222 +
					closestpt(&dx, &dy, dx, dy, max);
223 +
					c->w = (int)dx + c->basew;
224 +
					c->h = (int)dy + c->baseh;
225 +
				}
226 +
			}
227 +
		}
228 +
		if(c->incw)
229 +
			c->w -= (c->w - c->basew) % c->incw;
230 +
		if(c->inch)
231 +
			c->h -= (c->h - c->baseh) % c->inch;
204 232
	}
205 233
	if(c->w == sw && c->h == sh)
206 234
		c->border = 0;
257 285
	}
258 286
	else
259 287
		c->minw = c->minh = 0;
288 +
	if(c->flags & PAspect) {
289 +
		c->minax = size.min_aspect.x;
290 +
		c->minay = size.min_aspect.y;
291 +
		c->maxax = size.max_aspect.x;
292 +
		c->maxay = size.max_aspect.y;
293 +
	}
294 +
	else
295 +
		c->minax = c->minay = c->maxax = c->maxay = 0;
260 296
	c->isfixed = (c->maxw && c->minw && c->maxh && c->minh &&
261 297
				c->maxw == c->minw && c->maxh == c->minh);
262 298
}
dwm.h +1 −0
73 73
	int x, y, w, h;
74 74
	int rx, ry, rw, rh; /* revert geometry */
75 75
	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
76 +
	int minax, minay, maxax, maxay;
76 77
	long flags; 
77 78
	unsigned int border;
78 79
	Bool isfloat, isfixed, ismax;