prelim of dotile() 8fa47ac6
Anselm R. Garbe · 2006-09-29 14:39 2 file(s) · +68 −37
dwm.h +1 −0
40 40
#define MOUSEMASK		(BUTTONMASK | PointerMotionMask)
41 41
/* other stuff used in different places */
42 42
#define BORDERPX		1
43 +
#define MINW			100
43 44
#define PROTODELWIN		1
44 45
45 46
enum { NetSupported, NetWMName, NetLast };		/* EWMH atoms */
view.c +67 −37
99 99
100 100
/* This algorithm is based on a (M)aster area and a (S)tacking area.
101 101
 * It supports following arrangements:
102 -
 * 	MMMS		MMMM		SMMM
103 -
 * 	MMMS		MMMM		SMMM
104 -
 * 	MMMS		SSSS		SMMM
102 +
 * 	SSMMM	MMMMM	MMMSS
103 +
 * 	SSMMM	SSSSS	MMMSS
105 104
 */
106 105
void
107 106
dotile(Arg *arg) {
108 -
	int h, i, n, w;
107 +
	int i, n, stackw, stackh, tw, th;
109 108
	Client *c;
110 109
111 110
	for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next))
112 111
		n++;
113 112
114 -
	if(isvertical) {
115 -
		if(stackpos == StackBottom) {
116 -
			w = sw;
117 -
			if(n > 1)
118 -
				h = (sh - bh) / (n - 1);
119 -
			else
120 -
				h = sh - bh;
121 -
		}
122 -
		else {
123 -
			w = sw - master;
124 -
			if(n > 1)
125 -
				h = (sh - bh) / (n - 1);
126 -
			else
127 -
				h = sh - bh;
128 -
		}
113 +
	if(stackpos == StackBottom) {
114 +
		stackw = sw;
115 +
		stackh = sh - bh - master;
129 116
	}
130 -
	else { /* horizontal stack */
117 +
	else {
118 +
		stackw = sw - master;
119 +
		stackh = sh - bh;
120 +
	}
131 121
122 +
	if(isvertical) {
123 +
		tw = stackw;
124 +
		if(n > 1)
125 +
			th = stackh / (n - 1);
126 +
		else
127 +
			th = stackh;
128 +
	}
129 +
	else {
130 +
		th = stackh;
131 +
		if(n > 1)
132 +
			tw = stackw / (n - 1);
133 +
		else
134 +
			tw = stackw;
132 135
	}
133 136
134 137
	for(i = 0, c = clients; c; c = c->next) {
138 141
				continue;
139 142
			}
140 143
			c->ismax = False;
141 -
			if(n == 1) {
144 +
			if(n == 1) { /* only 1 window */
142 145
				c->x = sx;
143 146
				c->y = sy + bh;
144 147
				c->w = sw - 2 * BORDERPX;
145 148
				c->h = sh - 2 * BORDERPX - bh;
146 149
			}
147 -
			else if(i == 0) {
150 +
			else if(i == 0) { /* master window */
148 151
				c->x = sx;
152 +
				if(stackpos == StackLeft)
153 +
					c->x += master;
149 154
				c->y = sy + bh;
150 -
				c->w = master - 2 * BORDERPX;
151 -
				c->h = sh - 2 * BORDERPX - bh;
155 +
				if(isvertical) {
156 +
					c->w = master - 2 * BORDERPX;
157 +
					c->h = sh - 2 * BORDERPX - bh;
158 +
				}
159 +
				else {
160 +
					c->w = sw;
161 +
					c->h = master - 2 * BORDERPX;
162 +
				}
152 163
			}
153 -
			else if(h > bh) {
154 -
				c->x = sx + master;
155 -
				c->y = sy + (i - 1) * h + bh;
156 -
				c->w = w - 2 * BORDERPX;
157 -
				if(i + 1 == n)
158 -
					c->h = sh - c->y - 2 * BORDERPX;
164 +
			else if((isvertical && th > bh) || (!isvertical && tw > MINW)) {
165 +
				/* tile window */
166 +
				c->x = sx;
167 +
				if(isvertical)
168 +
					c->y = sy + (i - 1) * th + bh;
159 169
				else
160 -
					c->h = h - 2 * BORDERPX;
170 +
					c->y = sy + bh;
171 +
				if(stackpos == StackRight)
172 +
					c->x += master;
173 +
				else if(stackpos == StackBottom)
174 +
					c->y += master;
175 +
				c->w = tw - 2 * BORDERPX;
176 +
				c->h = th - 2 * BORDERPX;
177 +
				if(i + 1 == n) { /* fixes for last tile to take up rest space */
178 +
					if(isvertical)
179 +
						c->h = sh - c->y - 2 * BORDERPX;
180 +
					else {
181 +
						if(stackpos == StackLeft)
182 +
							c->w = master - c->x - 2 * BORDERPX;
183 +
						else
184 +
							c->w = sw - c->x - 2 * BORDERPX;
185 +
					}
186 +
				}
161 187
			}
162 -
			else { /* fallback if h < bh */
163 -
				c->x = sx + master;
188 +
			else { /* fallback if th < bh resp. tw < MINW */
189 +
				c->x = sx;
164 190
				c->y = sy + bh;
165 -
				c->w = w - 2 * BORDERPX;
166 -
				c->h = sh - 2 * BORDERPX - bh;
191 +
				if(stackpos == StackRight)
192 +
					c->x += master;
193 +
				else if(stackpos == StackBottom)
194 +
					c->y += master;
195 +
				c->w = stackw - 2 * BORDERPX;
196 +
				c->h = stackh - 2 * BORDERPX;
167 197
			}
168 198
			resize(c, False, TopLeft);
169 199
			i++;
232 262
		return;
233 263
234 264
	if(sel == getnext(clients)) {
235 -
		if(master + arg->i > sw - 100 || master + arg->i < 100)
265 +
		if(master + arg->i > sw - MINW || master + arg->i < MINW)
236 266
			return;
237 267
		master += arg->i;
238 268
	}
239 269
	else {
240 -
		if(master - arg->i > sw - 100 || master - arg->i < 100)
270 +
		if(master - arg->i > sw - MINW || master - arg->i < MINW)
241 271
			return;
242 272
		master -= arg->i;
243 273
	}