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