applied sanders focus_ patches 0a25fe91
Anselm R. Garbe · 2006-08-28 08:06 2 file(s) · +49 −26
client.c +48 −25
11 11
/* static functions */
12 12
13 13
static void
14 -
grabbutton(Client *c, unsigned int button, unsigned int modifier)
14 +
grabbuttons(Client *c, Bool focus)
15 15
{
16 -
	XGrabButton(dpy, button, modifier, c->win, False, BUTTONMASK,
17 -
			GrabModeAsync, GrabModeSync, None, None);
18 -
	XGrabButton(dpy, button, modifier | LockMask, c->win, False, BUTTONMASK,
19 -
			GrabModeAsync, GrabModeSync, None, None);
20 -
	XGrabButton(dpy, button, modifier | numlockmask, c->win, False, BUTTONMASK,
21 -
			GrabModeAsync, GrabModeSync, None, None);
22 -
	XGrabButton(dpy, button, modifier | numlockmask | LockMask, c->win, False, BUTTONMASK,
23 -
			GrabModeAsync, GrabModeSync, None, None);
16 +
	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
17 +
18 +
	if(focus) {
19 +
		XGrabButton(dpy, Button1, MODKEY, c->win, False, BUTTONMASK,
20 +
				GrabModeAsync, GrabModeSync, None, None);
21 +
		XGrabButton(dpy, Button1, MODKEY | LockMask, c->win, False, BUTTONMASK,
22 +
				GrabModeAsync, GrabModeSync, None, None);
23 +
		XGrabButton(dpy, Button1, MODKEY | numlockmask, c->win, False, BUTTONMASK,
24 +
				GrabModeAsync, GrabModeSync, None, None);
25 +
		XGrabButton(dpy, Button1, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
26 +
				GrabModeAsync, GrabModeSync, None, None);
27 +
28 +
		XGrabButton(dpy, Button2, MODKEY, c->win, False, BUTTONMASK,
29 +
				GrabModeAsync, GrabModeSync, None, None);
30 +
		XGrabButton(dpy, Button2, MODKEY | LockMask, c->win, False, BUTTONMASK,
31 +
				GrabModeAsync, GrabModeSync, None, None);
32 +
		XGrabButton(dpy, Button2, MODKEY | numlockmask, c->win, False, BUTTONMASK,
33 +
				GrabModeAsync, GrabModeSync, None, None);
34 +
		XGrabButton(dpy, Button2, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
35 +
				GrabModeAsync, GrabModeSync, None, None);
36 +
37 +
		XGrabButton(dpy, Button3, MODKEY, c->win, False, BUTTONMASK,
38 +
				GrabModeAsync, GrabModeSync, None, None);
39 +
		XGrabButton(dpy, Button3, MODKEY | LockMask, c->win, False, BUTTONMASK,
40 +
				GrabModeAsync, GrabModeSync, None, None);
41 +
		XGrabButton(dpy, Button3, MODKEY | numlockmask, c->win, False, BUTTONMASK,
42 +
				GrabModeAsync, GrabModeSync, None, None);
43 +
		XGrabButton(dpy, Button3, MODKEY | numlockmask | LockMask, c->win, False, BUTTONMASK,
44 +
				GrabModeAsync, GrabModeSync, None, None);
45 +
	}
46 +
	else
47 +
		XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, BUTTONMASK,
48 +
				GrabModeAsync, GrabModeSync, None, None);
49 +
24 50
}
25 51
26 52
static void
40 66
41 67
}
42 68
43 -
static void
44 -
ungrabbutton(Client *c, unsigned int button, unsigned int modifier)
45 -
{
46 -
	XUngrabButton(dpy, button, modifier, c->win);
47 -
	XUngrabButton(dpy, button, modifier | LockMask, c->win);
48 -
	XUngrabButton(dpy, button, modifier | numlockmask, c->win);
49 -
	XUngrabButton(dpy, button, modifier | numlockmask | LockMask, c->win);
50 -
}
51 -
52 69
static int
53 70
xerrordummy(Display *dsply, XErrorEvent *ee)
54 71
{
77 94
		if(sel->ismax)
78 95
			togglemax(NULL);
79 96
		sel = c;
80 -
		grabbutton(old, AnyButton, 0);
97 +
		grabbuttons(old, False);
81 98
		drawtitle(old);
82 99
	}
83 -
	ungrabbutton(c, AnyButton, 0);
100 +
	grabbuttons(c, True);
84 101
	drawtitle(c);
85 102
	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
86 103
}
220 237
	c->next = clients;
221 238
	clients = c;
222 239
223 -
	grabbutton(c, Button1, MODKEY);
224 -
	grabbutton(c, Button2, MODKEY);
225 -
	grabbutton(c, Button3, MODKEY);
240 +
	grabbuttons(c, False);
226 241
227 242
	if((tc = getclient(trans))) /* inherit tags */
228 243
		for(i = 0; i < ntags; i++)
384 399
void
385 400
unmanage(Client *c)
386 401
{
402 +
	Client *tc;
403 +
	Window trans;
387 404
	XGrabServer(dpy);
388 405
	XSetErrorHandler(xerrordummy);
389 406
407 +
	XGetTransientForHint(dpy, c->win, &trans);
408 +
390 409
	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
391 410
	XDestroyWindow(dpy, c->twin);
392 411
396 415
		c->next->prev = c->prev;
397 416
	if(c == clients)
398 417
		clients = c->next;
399 -
	if(sel == c)
400 -
		sel = getnext(clients);
418 +
	if(sel == c) {
419 +
		if(trans && (tc = getclient(trans)) && isvisible(tc))
420 +
			sel = tc;
421 +
		else
422 +
			sel = getnext(clients);
423 +
	}
401 424
	free(c->tags);
402 425
	free(c);
403 426
event.c +1 −1
123 123
	}
124 124
	else if((c = getclient(ev->window))) {
125 125
		focus(c);
126 -
		if(CLEANMASK(ev->state) == 0)
126 +
		if(CLEANMASK(ev->state) != MODKEY)
127 127
			return;
128 128
		switch(ev->button) {
129 129
		default: