about summary refs log tree commit diff stats
path: root/client.c
diff options
context:
space:
mode:
authorAnselm R. Garbe <arg@10kloc.org>2006-09-04 08:55:49 +0200
committerAnselm R. Garbe <arg@10kloc.org>2006-09-04 08:55:49 +0200
commit26157e6973f240a9b5ee407b9d2d5eca9358844f (patch)
tree540e8c0d6b646782dc0a9fde26c3af6109103241 /client.c
parent6d22782e8f991a99f9adef56b2b729e5ab5454d2 (diff)
downloaddwm-26157e6973f240a9b5ee407b9d2d5eca9358844f.tar.gz
applied Sanders max_and_focus.patch
Diffstat (limited to 'client.c')
-rw-r--r--client.c50
1 files changed, 29 insertions, 21 deletions
diff --git a/client.c b/client.c
index 9645444..8a8a99e 100644
--- a/client.c
+++ b/client.c
@@ -82,22 +82,29 @@ ban(Client *c)
 void
 focus(Client *c)
 {
-	Client *old = sel;
+	Client *old;
 
 	if(!issel)
 		return;
 	if(!sel)
 		sel = c;
 	else if(sel != c) {
-		if(sel->ismax)
+		if(maximized)
 			togglemax(NULL);
+		old = sel;
 		sel = c;
-		grabbuttons(old, False);
-		drawtitle(old);
+		if(old) {
+			grabbuttons(old, False);
+			drawtitle(old);
+		}
+	}
+	if(c) {
+		grabbuttons(c, True);
+		drawtitle(c);
+		XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
 	}
-	grabbuttons(c, True);
-	drawtitle(c);
-	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
+	else
+		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
 }
 
 Client *
@@ -247,8 +254,6 @@ manage(Window w, XWindowAttributes *wa)
 	clients = c;
 
 	settitle(c);
-	if(isvisible(c))
-		sel = c;
 	arrange(NULL);
 	XMapWindow(dpy, c->win);
 	XMapWindow(dpy, c->twin);
@@ -366,12 +371,13 @@ void
 togglemax(Arg *arg)
 {
 	int ox, oy, ow, oh;
+	Client *c;
 	XEvent ev;
 
 	if(!sel)
 		return;
 
-	if((sel->ismax = !sel->ismax)) {
+	if((maximized = !maximized)) {
 		ox = sel->x;
 		oy = sel->y;
 		ow = sel->w;
@@ -382,6 +388,9 @@ togglemax(Arg *arg)
 		sel->h = sh - 2 - bh;
 
 		restack();
+		for(c = getnext(clients); c; c = getnext(c->next))
+			if(c != sel)
+				ban(c);
 		resize(sel, arrange == dofloat, TopLeft);
 
 		sel->x = ox;
@@ -390,37 +399,36 @@ togglemax(Arg *arg)
 		sel->h = oh;
 	}
 	else
-		resize(sel, False, TopLeft);
+		arrange(NULL);
 	while(XCheckMaskEvent(dpy, EnterWindowMask, &ev));
 }
 
 void
 unmanage(Client *c)
 {
-	Client *tc;
+	Client *tc, *fc;
 	Window trans;
 	XGrabServer(dpy);
 	XSetErrorHandler(xerrordummy);
 
-	XGetTransientForHint(dpy, c->win, &trans);
-
-	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
-	XDestroyWindow(dpy, c->twin);
-
 	detach(c);
 	if(sel == c) {
+		XGetTransientForHint(dpy, c->win, &trans);
 		if(trans && (tc = getclient(trans)) && isvisible(tc))
-			sel = tc;
+			fc = tc;
 		else
-			sel = getnext(clients);
+			fc = getnext(clients);
+		focus(fc);
 	}
+
+	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
+	XDestroyWindow(dpy, c->twin);
+
 	free(c->tags);
 	free(c);
 
 	XSync(dpy, False);
 	XSetErrorHandler(xerror);
 	XUngrabServer(dpy);
-	if(sel)
-		focus(sel);
 	arrange(NULL);
 }