dwm.c
changeset 1032 08bc44d1f985
parent 1031 7216ff510041
child 1033 a8efbb301ef4
equal deleted inserted replaced
1031:7216ff510041 1032:08bc44d1f985
  1034 resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
  1034 resize(Client *c, int x, int y, int w, int h, Bool sizehints) {
  1035 	double dx, dy, max, min, ratio;
  1035 	double dx, dy, max, min, ratio;
  1036 	XWindowChanges wc;
  1036 	XWindowChanges wc;
  1037 
  1037 
  1038 	if(sizehints) {
  1038 	if(sizehints) {
  1039 		if(c->minay > 0 && c->maxay > 0 && (h - c->baseh) > 0 && (w - c->basew) > 0) {
  1039 		/* set minimum possible */
  1040 			dx = (double)(w - c->basew);
  1040 		if (w < 1)
  1041 			dy = (double)(h - c->baseh);
  1041 			w = 1;
  1042 			min = (double)(c->minax) / (double)(c->minay);
  1042 		if (h < 1)
  1043 			max = (double)(c->maxax) / (double)(c->maxay);
  1043 			h = 1;
  1044 			ratio = dx / dy;
  1044 
  1045 			if(max > 0 && min > 0 && ratio > 0) {
  1045 		/* temporarily remove base dimensions */
  1046 				if(ratio < min) {
  1046 		w -= c->basew;
  1047 					dy = (dx * min + dy) / (min * min + 1);
  1047 		h -= c->baseh;
  1048 					dx = dy * min;
  1048 
  1049 					w = (int)dx + c->basew;
  1049 		/* adjust for aspect limits */
  1050 					h = (int)dy + c->baseh;
  1050 		if (c->minay > 0 && c->maxay > 0 && c->minax > 0 && c->maxax > 0) {
  1051 				}
  1051 			if (w * c->maxay > h * c->maxax)
  1052 				else if(ratio > max) {
  1052 				w = h * c->maxax / c->maxay;
  1053 					dy = (dx * min + dy) / (max * max + 1);
  1053 			else if (w * c->minay < h * c->minax)
  1054 					dx = dy * min;
  1054 				h = w * c->minay / c->minax;
  1055 					w = (int)dx + c->basew;
  1055 		}
  1056 					h = (int)dy + c->baseh;
  1056 
  1057 				}
  1057 		/* adjust for increment value */
  1058 			}
  1058 		if(c->incw)
  1059 		}
  1059 			w -= w % c->incw;
  1060 		if(c->minw && w < c->minw)
  1060 		if(c->inch)
       
  1061 			h -= h % c->inch;
       
  1062 
       
  1063 		/* restore base dimensions */
       
  1064 		w += c->basew;
       
  1065 		h += c->baseh;
       
  1066 
       
  1067 		if(c->minw > 0 && w < c->minw)
  1061 			w = c->minw;
  1068 			w = c->minw;
  1062 		if(c->minh && h < c->minh)
  1069 		if(c->minh > 0 && h < c->minh)
  1063 			h = c->minh;
  1070 			h = c->minh;
  1064 		if(c->maxw && w > c->maxw)
  1071 		if(c->maxw > 0 && w > c->maxw)
  1065 			w = c->maxw;
  1072 			w = c->maxw;
  1066 		if(c->maxh && h > c->maxh)
  1073 		if(c->maxh > 0 && h > c->maxh)
  1067 			h = c->maxh;
  1074 			h = c->maxh;
  1068 		if(c->incw)
       
  1069 			w -= (w - c->basew) % c->incw;
       
  1070 		if(c->inch)
       
  1071 			h -= (h - c->baseh) % c->inch;
       
  1072 	}
  1075 	}
  1073 	if(w <= 0 || h <= 0)
  1076 	if(w <= 0 || h <= 0)
  1074 		return;
  1077 		return;
  1075 	/* offscreen appearance fixes */
  1078 	/* offscreen appearance fixes */
  1076 	if(x > sw)
  1079 	if(x > sw)