added gravity stuff 2e836ecc
Anselm R. Garbe · 2006-07-12 17:17 4 file(s) · +76 −7
client.c +67 −5
18 18
		return;
19 19
	stack->x = sx;
20 20
	stack->y = bh;
21 -
	stack->w = sw - 2;
22 -
	stack->h = sh - bh - 2;
21 +
	stack->w = sw - 2 * stack->border;
22 +
	stack->h = sh - bh - 2 * stack->border;
23 23
	resize(stack);
24 +
	discard_events(EnterWindowMask);
24 25
}
25 26
26 27
void
43 44
	else
44 45
		cols = rows;
45 46
46 -
	gw = (sw - 1)  / cols;
47 -
	gh = (sh - bh - 1) / rows;
47 +
	gw = (sw - 2 * c->border)  / cols;
48 +
	gh = (sh - bh - 2 * c->border) / rows;
48 49
49 50
	for(i = j = 0, c = clients; c; c = c->next) {
50 51
		c->x = i * gw;
57 58
			i = 0;
58 59
		}
59 60
	}
61 +
	discard_events(EnterWindowMask);
60 62
}
61 63
62 64
void
161 163
	}
162 164
	else
163 165
		c->minw = c->minh = 0;
166 +
	if(c->flags & PWinGravity)
167 +
		c->grav = size.win_gravity;
168 +
	else
169 +
		c->grav = NorthWestGravity;
164 170
}
165 171
166 172
void
213 219
	c->tw = c->w = wa->width;
214 220
	c->h = wa->height;
215 221
	c->th = bh;
222 +
	c->border = 1;
216 223
	update_size(c);
217 224
	XSetWindowBorderWidth(dpy, c->win, 1);
218 225
	XSetWindowBorder(dpy, c->win, brush.border);
247 254
}
248 255
249 256
void
257 +
gravitate(Client *c, Bool invert)
258 +
{
259 +
	int dx = 0, dy = 0;
260 +
261 +
	switch(c->grav) {
262 +
	case StaticGravity:
263 +
	case NorthWestGravity:
264 +
	case NorthGravity:
265 +
	case NorthEastGravity:
266 +
		dy = c->border;
267 +
		break;
268 +
	case EastGravity:
269 +
	case CenterGravity:
270 +
	case WestGravity:
271 +
		dy = -(c->h / 2) + c->border;
272 +
		break;
273 +
	case SouthEastGravity:
274 +
	case SouthGravity:
275 +
	case SouthWestGravity:
276 +
		dy = -c->h;
277 +
		break;
278 +
	default:
279 +
		break;
280 +
	}
281 +
282 +
	switch (c->grav) {
283 +
	case StaticGravity:
284 +
	case NorthWestGravity:
285 +
	case WestGravity:
286 +
	case SouthWestGravity:
287 +
		dx = c->border;
288 +
		break;
289 +
	case NorthGravity:
290 +
	case CenterGravity:
291 +
	case SouthGravity:
292 +
		dx = -(c->w / 2) + c->border;
293 +
		break;
294 +
	case NorthEastGravity:
295 +
	case EastGravity:
296 +
	case SouthEastGravity:
297 +
		dx = -(c->w + c->border);
298 +
		break;
299 +
	default:
300 +
		break;
301 +
	}
302 +
303 +
	if(invert) {
304 +
		dx = -dx;
305 +
		dy = -dy;
306 +
	}
307 +
	c->x += dx;
308 +
	c->y += dy;
309 +
}
310 +
311 +
void
250 312
resize(Client *c)
251 313
{
252 314
	XConfigureEvent e;
260 322
	e.y = c->y;
261 323
	e.width = c->w;
262 324
	e.height = c->h;
263 -
	e.border_width = 0;
325 +
	e.border_width = c->border;
264 326
	e.above = None;
265 327
	e.override_redirect = False;
266 328
	XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&e);
event.c +4 −0
77 77
78 78
	ev->value_mask &= ~CWSibling;
79 79
	if((c = getclient(ev->window))) {
80 +
		gravitate(c, True);
80 81
		if(ev->value_mask & CWX)
81 82
			c->x = ev->x;
82 83
		if(ev->value_mask & CWY)
85 86
			c->w = ev->width;
86 87
		if(ev->value_mask & CWHeight)
87 88
			c->h = ev->height;
89 +
		if(ev->value_mask & CWBorderWidth)
90 +
			c->border = ev->border_width;
91 +
		gravitate(c, False);
88 92
	}
89 93
90 94
	wc.x = ev->x;
kb.c +1 −1
8 8
#include <X11/keysym.h>
9 9
10 10
static const char *term[] = { 
11 -
	"xterm", "-bg", "black", "-fg", "white", "-fn",
11 +
	"aterm", "-tr", "+sb", "-bg", "black", "-fg", "white", "-fn",
12 12
	"-*-terminus-medium-*-*-*-13-*-*-*-*-*-iso10646-*", 0 
13 13
};
14 14
wm.h +4 −1
27 27
	int x, y, w, h;
28 28
	int tx, ty, tw, th;
29 29
	int basew, baseh, incw, inch, maxw, maxh, minw, minh;
30 +
	int grav;
31 +
	unsigned int border;
30 32
	long flags; 
31 33
	Window win;
32 34
	Window trans;
73 75
extern void kill(void *aux);
74 76
extern void sel(void *aux);
75 77
extern void max(void *aux);
76 -
extern void arrange();
78 +
extern void arrange(void *aux);
79 +
extern void gravitate(Client *c, Bool invert);
77 80
78 81
/* event.c */
79 82
extern void discard_events(long even_mask);