client.c
changeset 731 29c9b557ed95
parent 730 8997e28553a8
child 732 a642068c4834
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