client.c
changeset 849 4f1ff9e068d3
parent 848 944739ec944a
child 852 2a57c24a0a85
equal deleted inserted replaced
848:944739ec944a 849:4f1ff9e068d3
   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