Mercurial > aewl
comparison client.c @ 731:29c9b557ed95
implemented aspect ratio support of windows
author | Anselm R. Garbe <arg@suckless.org> |
---|---|
date | Tue, 06 Feb 2007 15:22:13 +0100 |
parents | 8997e28553a8 |
children | a642068c4834 |
comparison
equal
deleted
inserted
replaced
730:8997e28553a8 | 731:29c9b557ed95 |
---|---|
6 #include <string.h> | 6 #include <string.h> |
7 #include <X11/Xatom.h> | 7 #include <X11/Xatom.h> |
8 #include <X11/Xutil.h> | 8 #include <X11/Xutil.h> |
9 | 9 |
10 /* static */ | 10 /* static */ |
11 | |
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 } | |
11 | 18 |
12 static void | 19 static void |
13 detachstack(Client *c) { | 20 detachstack(Client *c) { |
14 Client **tc; | 21 Client **tc; |
15 for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext); | 22 for(tc=&stack; *tc && *tc != c; tc=&(*tc)->snext); |
182 arrange(); | 189 arrange(); |
183 } | 190 } |
184 | 191 |
185 void | 192 void |
186 resize(Client *c, Bool sizehints) { | 193 resize(Client *c, Bool sizehints) { |
194 float dx, dy, min, max, actual; | |
187 XWindowChanges wc; | 195 XWindowChanges wc; |
188 | 196 |
189 if(c->w <= 0 || c->h <= 0) | 197 if(c->w <= 0 || c->h <= 0) |
190 return; | 198 return; |
191 if(sizehints) { | 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 if(c->minw && c->w < c->minw) | 200 if(c->minw && c->w < c->minw) |
197 c->w = c->minw; | 201 c->w = c->minw; |
198 if(c->minh && c->h < c->minh) | 202 if(c->minh && c->h < c->minh) |
199 c->h = c->minh; | 203 c->h = c->minh; |
200 if(c->maxw && c->w > c->maxw) | 204 if(c->maxw && c->w > c->maxw) |
201 c->w = c->maxw; | 205 c->w = c->maxw; |
202 if(c->maxh && c->h > c->maxh) | 206 if(c->maxh && c->h > c->maxh) |
203 c->h = c->maxh; | 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 if(c->w == sw && c->h == sh) | 233 if(c->w == sw && c->h == sh) |
206 c->border = 0; | 234 c->border = 0; |
207 else | 235 else |
208 c->border = BORDERPX; | 236 c->border = BORDERPX; |
255 c->minw = size.min_width; | 283 c->minw = size.min_width; |
256 c->minh = size.min_height; | 284 c->minh = size.min_height; |
257 } | 285 } |
258 else | 286 else |
259 c->minw = c->minh = 0; | 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 c->isfixed = (c->maxw && c->minw && c->maxh && c->minh && | 296 c->isfixed = (c->maxw && c->minw && c->maxh && c->minh && |
261 c->maxw == c->minw && c->maxh == c->minh); | 297 c->maxw == c->minw && c->maxh == c->minh); |
262 } | 298 } |
263 | 299 |
264 void | 300 void |