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 |