removed c->f{x,y,w,h} and c->t{x,y,w,h} in favor for the new rule handling remembering two kinds of geometries is unnecessary, removed the randomized (x,y) setting on dofloat startup, was kind too random und unpredictable 11737233
arg@10ksloc.org · 2006-07-20 07:26 4 file(s) · +85 −114
client.c +52 −76
16 16
{
17 17
	int i;
18 18
19 -
	c->bw = 0;
19 +
	c->tw = 0;
20 20
	for(i = 0; i < TLast; i++)
21 21
		if(c->tags[i])
22 -
			c->bw += textw(c->tags[i]);
23 -
	c->bw += textw(c->name);
24 -
	if(c->bw > *c->w)
25 -
		c->bw = *c->w + 2;
26 -
	c->bx = *c->x + *c->w - c->bw + 2;
27 -
	c->by = *c->y;
22 +
			c->tw += textw(c->tags[i]);
23 +
	c->tw += textw(c->name);
24 +
	if(c->tw > c->w)
25 +
		c->tw = c->w + 2;
26 +
	c->tx = c->x + c->w - c->tw + 2;
27 +
	c->ty = c->y;
28 28
	if(c->tags[tsel])
29 -
		XMoveResizeWindow(dpy, c->title, c->bx, c->by, c->bw, c->bh);
29 +
		XMoveResizeWindow(dpy, c->title, c->tx, c->ty, c->tw, c->th);
30 30
	else
31 -
		XMoveResizeWindow(dpy, c->title, c->bx + 2 * sw, c->by, c->bw, c->bh);
31 +
		XMoveResizeWindow(dpy, c->title, c->tx + 2 * sw, c->ty, c->tw, c->th);
32 32
33 33
}
34 34
43 43
void
44 44
ban(Client *c)
45 45
{
46 -
	XMoveWindow(dpy, c->win, *c->x + 2 * sw, *c->y);
47 -
	XMoveWindow(dpy, c->title, c->bx + 2 * sw, c->by);
46 +
	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
47 +
	XMoveWindow(dpy, c->title, c->tx + 2 * sw, c->ty);
48 48
}
49 49
50 50
void
128 128
	case EastGravity:
129 129
	case CenterGravity:
130 130
	case WestGravity:
131 -
		dy = -(*c->h / 2) + c->border;
131 +
		dy = -(c->h / 2) + c->border;
132 132
		break;
133 133
	case SouthEastGravity:
134 134
	case SouthGravity:
135 135
	case SouthWestGravity:
136 -
		dy = -(*c->h);
136 +
		dy = -(c->h);
137 137
		break;
138 138
	default:
139 139
		break;
149 149
	case NorthGravity:
150 150
	case CenterGravity:
151 151
	case SouthGravity:
152 -
		dx = -(*c->w / 2) + c->border;
152 +
		dx = -(c->w / 2) + c->border;
153 153
		break;
154 154
	case NorthEastGravity:
155 155
	case EastGravity:
156 156
	case SouthEastGravity:
157 -
		dx = -(*c->w + c->border);
157 +
		dx = -(c->w + c->border);
158 158
		break;
159 159
	default:
160 160
		break;
164 164
		dx = -dx;
165 165
		dy = -dy;
166 166
	}
167 -
	*c->x += dx;
168 -
	*c->y += dy;
167 +
	c->x += dx;
168 +
	c->y += dy;
169 169
}
170 170
171 171
void
203 203
204 204
	c = emallocz(sizeof(Client));
205 205
	c->win = w;
206 -
	c->bx = c->fx = c->tx = wa->x;
207 -
	c->by = c->fy = c->ty = wa->y;
208 -
	c->bw = c->fw = c->tw = wa->width;
209 -
	c->fh = c->th = wa->height;
210 -
	c->bh = bh;
211 -
212 -
	diff = sw - c->fw;
213 -
	c->fx = random() % (diff ? diff : 1);
214 -
	diff = sh - c->fh - bh;
215 -
	c->fy = random() % (diff ? diff : 1);
206 +
	c->x = c->tx = wa->x;
207 +
	c->y = c->ty = wa->y;
208 +
	c->w = c->tw = wa->width;
209 +
	c->h = wa->height;
210 +
	c->th = bh;
216 211
217 -
	if(c->fy < bh)
218 -
		c->by = c->fy = c->ty = bh;
212 +
	if(c->y < bh)
213 +
		c->y = c->ty = bh;
219 214
220 215
	c->border = 1;
221 216
	c->proto = getproto(c->win);
227 222
	twa.background_pixmap = ParentRelative;
228 223
	twa.event_mask = ExposureMask;
229 224
230 -
	c->title = XCreateWindow(dpy, root, c->bx, c->by, c->bw, c->bh,
225 +
	c->title = XCreateWindow(dpy, root, c->tx, c->ty, c->tw, c->th,
231 226
			0, DefaultDepth(dpy, screen), CopyFromParent,
232 227
			DefaultVisual(dpy, screen),
233 228
			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
251 246
				(c->maxw == c->minw) && (c->maxh == c->minh));
252 247
253 248
254 -
	setgeom(c);
255 249
	settitle(c);
256 -
257 250
	arrange(NULL);
258 251
259 252
	/* mapping the window now prevents flicker */
273 266
{
274 267
	if(!sel)
275 268
		return;
276 -
	*sel->x = sx;
277 -
	*sel->y = sy + bh;
278 -
	*sel->w = sw - 2 * sel->border;
279 -
	*sel->h = sh - 2 * sel->border - bh;
269 +
	sel->x = sx;
270 +
	sel->y = sy + bh;
271 +
	sel->w = sw - 2 * sel->border;
272 +
	sel->h = sh - 2 * sel->border - bh;
280 273
	higher(sel);
281 274
	resize(sel, False, TopLeft);
282 275
}
297 290
resize(Client *c, Bool inc, Corner sticky)
298 291
{
299 292
	XConfigureEvent e;
300 -
	int right = *c->x + *c->w;
301 -
	int bottom = *c->y + *c->h;
293 +
	int right = c->x + c->w;
294 +
	int bottom = c->y + c->h;
302 295
303 296
	if(inc) {
304 297
		if(c->incw)
305 -
			*c->w -= (*c->w - c->basew) % c->incw;
298 +
			c->w -= (c->w - c->basew) % c->incw;
306 299
		if(c->inch)
307 -
			*c->h -= (*c->h - c->baseh) % c->inch;
300 +
			c->h -= (c->h - c->baseh) % c->inch;
308 301
	}
309 -
	if(*c->x > sw) /* might happen on restart */
310 -
		*c->x = sw - *c->w;
311 -
	if(*c->y > sh)
312 -
		*c->y = sh - *c->h;
313 -
	if(c->minw && *c->w < c->minw)
314 -
		*c->w = c->minw;
315 -
	if(c->minh && *c->h < c->minh)
316 -
		*c->h = c->minh;
317 -
	if(c->maxw && *c->w > c->maxw)
318 -
		*c->w = c->maxw;
319 -
	if(c->maxh && *c->h > c->maxh)
320 -
		*c->h = c->maxh;
302 +
	if(c->x > sw) /* might happen on restart */
303 +
		c->x = sw - c->w;
304 +
	if(c->y > sh)
305 +
		c->y = sh - c->h;
306 +
	if(c->minw && c->w < c->minw)
307 +
		c->w = c->minw;
308 +
	if(c->minh && c->h < c->minh)
309 +
		c->h = c->minh;
310 +
	if(c->maxw && c->w > c->maxw)
311 +
		c->w = c->maxw;
312 +
	if(c->maxh && c->h > c->maxh)
313 +
		c->h = c->maxh;
321 314
	if(sticky == TopRight || sticky == BotRight)
322 -
		*c->x = right - *c->w;
315 +
		c->x = right - c->w;
323 316
	if(sticky == BotLeft || sticky == BotRight)
324 -
		*c->y = bottom - *c->h;
317 +
		c->y = bottom - c->h;
325 318
326 319
	resizetitle(c);
327 320
	XSetWindowBorderWidth(dpy, c->win, 1);
328 -
	XMoveResizeWindow(dpy, c->win, *c->x, *c->y, *c->w, *c->h);
321 +
	XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h);
329 322
330 323
	e.type = ConfigureNotify;
331 324
	e.event = c->win;
332 325
	e.window = c->win;
333 -
	e.x = *c->x;
334 -
	e.y = *c->y;
335 -
	e.width = *c->w;
336 -
	e.height = *c->h;
326 +
	e.x = c->x;
327 +
	e.y = c->y;
328 +
	e.width = c->w;
329 +
	e.height = c->h;
337 330
	e.border_width = c->border;
338 331
	e.above = None;
339 332
	e.override_redirect = False;
340 333
	XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
341 334
	XSync(dpy, False);
342 -
}
343 -
344 -
void
345 -
setgeom(Client *c)
346 -
{
347 -
	if((arrange == dotile) && !c->isfloat) {
348 -
		c->x = &c->tx;
349 -
		c->y = &c->ty;
350 -
		c->w = &c->tw;
351 -
		c->h = &c->th;
352 -
	}
353 -
	else {
354 -
		c->x = &c->fx;
355 -
		c->y = &c->fy;
356 -
		c->w = &c->fw;
357 -
		c->h = &c->fh;
358 -
	}
359 335
}
360 336
361 337
void
dwm.h +2 −5
67 67
	char name[256];
68 68
	char *tags[TLast];
69 69
	int proto;
70 -
	int *x, *y, *w, *h; /* current geom */
71 -
	int bx, by, bw, bh; /* title bar */
72 -
	int fx, fy, fw, fh; /* floating geom */
73 -
	int tx, ty, tw, th; /* tiled geom */
70 +
	int x, y, w, h;
71 +
	int tx, ty, tw, th; /* title */
74 72
	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
75 73
	int grav;
76 74
	unsigned int border;
109 107
extern void maximize(Arg *arg);
110 108
extern void pop(Client *c);
111 109
extern void resize(Client *c, Bool inc, Corner sticky);
112 -
extern void setgeom(Client *c);
113 110
extern void setsize(Client *c);
114 111
extern void settitle(Client *c);
115 112
extern void unmanage(Client *c);
event.c +15 −15
70 70
	unsigned int dui;
71 71
	Window dummy;
72 72
73 -
	ocx = *c->x;
74 -
	ocy = *c->y;
73 +
	ocx = c->x;
74 +
	ocy = c->y;
75 75
	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
76 76
				None, cursor[CurMove], CurrentTime) != GrabSuccess)
77 77
		return;
85 85
			break;
86 86
		case MotionNotify:
87 87
			XSync(dpy, False);
88 -
			*c->x = ocx + (ev.xmotion.x - x1);
89 -
			*c->y = ocy + (ev.xmotion.y - y1);
88 +
			c->x = ocx + (ev.xmotion.x - x1);
89 +
			c->y = ocy + (ev.xmotion.y - y1);
90 90
			resize(c, False, TopLeft);
91 91
			break;
92 92
		case ButtonRelease:
103 103
	int ocx, ocy;
104 104
	Corner sticky;
105 105
106 -
	ocx = *c->x;
107 -
	ocy = *c->y;
106 +
	ocx = c->x;
107 +
	ocy = c->y;
108 108
	if(XGrabPointer(dpy, root, False, MouseMask, GrabModeAsync, GrabModeAsync,
109 109
				None, cursor[CurResize], CurrentTime) != GrabSuccess)
110 110
		return;
111 -
	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, *c->w, *c->h);
111 +
	XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w, c->h);
112 112
	for(;;) {
113 113
		XMaskEvent(dpy, MouseMask | ExposureMask, &ev);
114 114
		switch(ev.type) {
118 118
			break;
119 119
		case MotionNotify:
120 120
			XSync(dpy, False);
121 -
			*c->w = abs(ocx - ev.xmotion.x);
122 -
			*c->h = abs(ocy - ev.xmotion.y);
123 -
			*c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - *c->w;
124 -
			*c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - *c->h;
121 +
			c->w = abs(ocx - ev.xmotion.x);
122 +
			c->h = abs(ocy - ev.xmotion.y);
123 +
			c->x = (ocx <= ev.xmotion.x) ? ocx : ocx - c->w;
124 +
			c->y = (ocy <= ev.xmotion.y) ? ocy : ocy - c->h;
125 125
			if(ocx <= ev.xmotion.x)
126 126
				sticky = (ocy <= ev.xmotion.y) ? TopLeft : BotLeft;
127 127
			else
203 203
	if((c = getclient(ev->window))) {
204 204
		gravitate(c, True);
205 205
		if(ev->value_mask & CWX)
206 -
			*c->x = ev->x;
206 +
			c->x = ev->x;
207 207
		if(ev->value_mask & CWY)
208 -
			*c->y = ev->y;
208 +
			c->y = ev->y;
209 209
		if(ev->value_mask & CWWidth)
210 -
			*c->w = ev->width;
210 +
			c->w = ev->width;
211 211
		if(ev->value_mask & CWHeight)
212 -
			*c->h = ev->height;
212 +
			c->h = ev->height;
213 213
		if(ev->value_mask & CWBorderWidth)
214 214
			c->border = 1;
215 215
		gravitate(c, False);
tag.c +16 −18
53 53
54 54
	arrange = dofloat;
55 55
	for(c = clients; c; c = c->next) {
56 -
		setgeom(c);
57 56
		if(c->tags[tsel]) {
58 57
			resize(c, True, TopLeft);
59 58
		}
87 86
		h = sh - bh;
88 87
89 88
	for(i = 0, c = clients; c; c = c->next) {
90 -
		setgeom(c);
91 89
		if(c->tags[tsel]) {
92 90
			if(c->isfloat) {
93 91
				higher(c);
95 93
				continue;
96 94
			}
97 95
			if(n == 1) {
98 -
				*c->x = sx;
99 -
				*c->y = sy + bh;
100 -
				*c->w = sw - 2 * c->border;
101 -
				*c->h = sh - 2 * c->border - bh;
96 +
				c->x = sx;
97 +
				c->y = sy + bh;
98 +
				c->w = sw - 2 * c->border;
99 +
				c->h = sh - 2 * c->border - bh;
102 100
			}
103 101
			else if(i == 0) {
104 -
				*c->x = sx;
105 -
				*c->y = sy + bh;
106 -
				*c->w = mw - 2 * c->border;
107 -
				*c->h = sh - 2 * c->border - bh;
102 +
				c->x = sx;
103 +
				c->y = sy + bh;
104 +
				c->w = mw - 2 * c->border;
105 +
				c->h = sh - 2 * c->border - bh;
108 106
			}
109 107
			else if(h > bh) {
110 -
				*c->x = sx + mw;
111 -
				*c->y = sy + (i - 1) * h + bh;
112 -
				*c->w = w - 2 * c->border;
113 -
				*c->h = h - 2 * c->border;
108 +
				c->x = sx + mw;
109 +
				c->y = sy + (i - 1) * h + bh;
110 +
				c->w = w - 2 * c->border;
111 +
				c->h = h - 2 * c->border;
114 112
			}
115 113
			else { /* fallback if h < bh */
116 -
				*c->x = sx + mw;
117 -
				*c->y = sy + bh;
118 -
				*c->w = w - 2 * c->border;
119 -
				*c->h = sh - 2 * c->border - bh;
114 +
				c->x = sx + mw;
115 +
				c->y = sy + bh;
116 +
				c->w = w - 2 * c->border;
117 +
				c->h = sh - 2 * c->border - bh;
120 118
			}
121 119
			resize(c, False, TopLeft);
122 120
			i++;