225 lt->arrange(); |
225 lt->arrange(); |
226 } |
226 } |
227 |
227 |
228 void |
228 void |
229 resize(Client *c, int x, int y, int w, int h, Bool sizehints) { |
229 resize(Client *c, int x, int y, int w, int h, Bool sizehints) { |
230 float actual, dx, dy, max, min; |
230 float dx, dy, max, min, ratio; |
231 XWindowChanges wc; |
231 XWindowChanges wc; |
232 |
232 |
233 if(w <= 0 || h <= 0) |
233 if(w <= 0 || h <= 0) |
234 return; |
234 return; |
235 if(sizehints) { |
235 if(sizehints) { |
|
236 if(c->minay > 0 && c->maxay && (h - c->baseh) > 0) { |
|
237 dx = (float)(w - c->basew); |
|
238 dy = (float)(h - c->baseh); |
|
239 min = (float)(c->minax) / (float)(c->minay); |
|
240 max = (float)(c->maxax) / (float)(c->maxay); |
|
241 ratio = dx / dy; |
|
242 if(max > 0 && min > 0 && ratio > 0) { |
|
243 if(ratio < min) { |
|
244 dy = (dx * min + dy) / (min * min + 1); |
|
245 dx = dy * min; |
|
246 w = (int)dx + c->basew; |
|
247 h = (int)dy + c->baseh; |
|
248 } |
|
249 else if(ratio > max) { |
|
250 dy = (dx * min + dy) / (max * max + 1); |
|
251 dx = dy * min; |
|
252 w = (int)dx + c->basew; |
|
253 h = (int)dy + c->baseh; |
|
254 } |
|
255 } |
|
256 } |
236 if(c->minw && w < c->minw) |
257 if(c->minw && w < c->minw) |
237 w = c->minw; |
258 w = c->minw; |
238 if(c->minh && h < c->minh) |
259 if(c->minh && h < c->minh) |
239 h = c->minh; |
260 h = c->minh; |
240 if(c->maxw && w > c->maxw) |
261 if(c->maxw && w > c->maxw) |
241 w = c->maxw; |
262 w = c->maxw; |
242 if(c->maxh && h > c->maxh) |
263 if(c->maxh && h > c->maxh) |
243 h = c->maxh; |
264 h = c->maxh; |
244 /* inspired by algorithm from fluxbox */ |
|
245 if(c->minay > 0 && c->maxay && (h - c->baseh) > 0) { |
|
246 dx = (float)(w - c->basew); |
|
247 dy = (float)(h - c->baseh); |
|
248 min = (float)(c->minax) / (float)(c->minay); |
|
249 max = (float)(c->maxax) / (float)(c->maxay); |
|
250 actual = dx / dy; |
|
251 if(max > 0 && min > 0 && actual > 0) { |
|
252 if(actual < min) { |
|
253 dy = (dx * min + dy) / (min * min + 1); |
|
254 dx = dy * min; |
|
255 w = (int)dx + c->basew; |
|
256 h = (int)dy + c->baseh; |
|
257 } |
|
258 else if(actual > max) { |
|
259 dy = (dx * min + dy) / (max * max + 1); |
|
260 dx = dy * min; |
|
261 w = (int)dx + c->basew; |
|
262 h = (int)dy + c->baseh; |
|
263 } |
|
264 } |
|
265 } |
|
266 if(c->incw) |
265 if(c->incw) |
267 w -= (w - c->basew) % c->incw; |
266 w -= (w - c->basew) % c->incw; |
268 if(c->inch) |
267 if(c->inch) |
269 h -= (h - c->baseh) % c->inch; |
268 h -= (h - c->baseh) % c->inch; |
270 } |
269 } |
311 c->flags = size.flags; |
310 c->flags = size.flags; |
312 if(c->flags & PBaseSize) { |
311 if(c->flags & PBaseSize) { |
313 c->basew = size.base_width; |
312 c->basew = size.base_width; |
314 c->baseh = size.base_height; |
313 c->baseh = size.base_height; |
315 } |
314 } |
|
315 else if(c->flags & PMinSize) { |
|
316 c->basew = size.min_width; |
|
317 c->baseh = size.min_height; |
|
318 } |
316 else |
319 else |
317 c->basew = c->baseh = 0; |
320 c->basew = c->baseh = 0; |
318 if(c->flags & PResizeInc) { |
321 if(c->flags & PResizeInc) { |
319 c->incw = size.width_inc; |
322 c->incw = size.width_inc; |
320 c->inch = size.height_inc; |
323 c->inch = size.height_inc; |
329 c->maxw = c->maxh = 0; |
332 c->maxw = c->maxh = 0; |
330 if(c->flags & PMinSize) { |
333 if(c->flags & PMinSize) { |
331 c->minw = size.min_width; |
334 c->minw = size.min_width; |
332 c->minh = size.min_height; |
335 c->minh = size.min_height; |
333 } |
336 } |
|
337 else if(c->flags & PBaseSize) { |
|
338 c->minw = size.base_width; |
|
339 c->minh = size.base_height; |
|
340 } |
334 else |
341 else |
335 c->minw = c->minh = 0; |
342 c->minw = c->minh = 0; |
336 if(c->flags & PAspect) { |
343 if(c->flags & PAspect) { |
337 c->minax = size.min_aspect.x; |
344 c->minax = size.min_aspect.x; |
|
345 c->maxax = size.max_aspect.x; |
338 c->minay = size.min_aspect.y; |
346 c->minay = size.min_aspect.y; |
339 c->maxax = size.max_aspect.x; |
|
340 c->maxay = size.max_aspect.y; |
347 c->maxay = size.max_aspect.y; |
341 } |
348 } |
342 else |
349 else |
343 c->minax = c->minay = c->maxax = c->maxay = 0; |
350 c->minax = c->maxax = c->minay = c->maxay = 0; |
344 c->isfixed = (c->maxw && c->minw && c->maxh && c->minh |
351 c->isfixed = (c->maxw && c->minw && c->maxh && c->minh |
345 && c->maxw == c->minw && c->maxh == c->minh); |
352 && c->maxw == c->minw && c->maxh == c->minh); |
346 } |
353 } |
347 |
354 |
348 void |
355 void |