X-Git-Url: https://git.xinqibao.xyz/dwm.git/blobdiff_plain/0a25fe91888f30a382ca0cfb492283ce9aa3296c..c60de1acd47778b4835c14898fd8b1803537f9b3:/client.c

diff --git a/client.c b/client.c
index e8fe150..586a87f 100644
--- a/client.c
+++ b/client.c
@@ -52,8 +52,6 @@ grabbuttons(Client *c, Bool focus)
 static void
 resizetitle(Client *c)
 {
-	int i;
-
 	c->tw = textw(c->name);
 	if(c->tw > c->w)
 		c->tw = c->w + 2;
@@ -84,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);
+		}
 	}
-	grabbuttons(c, True);
-	drawtitle(c);
-	XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
+	if(c) {
+		grabbuttons(c, True);
+		drawtitle(c);
+		XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime);
+	}
+	else
+		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime);
 }
 
 Client *
@@ -194,7 +199,7 @@ void
 manage(Window w, XWindowAttributes *wa)
 {
 	unsigned int i;
-	Client *c, *tc;
+	Client *c;
 	Window trans;
 	XSetWindowAttributes twa;
 
@@ -232,30 +237,25 @@ manage(Window w, XWindowAttributes *wa)
 			DefaultVisual(dpy, screen),
 			CWOverrideRedirect | CWBackPixmap | CWEventMask, &twa);
 
-	if(clients)
-		clients->prev = c;
-	c->next = clients;
-	clients = c;
-
 	grabbuttons(c, False);
-
-	if((tc = getclient(trans))) /* inherit tags */
-		for(i = 0; i < ntags; i++)
-			c->tags[i] = tc->tags[i];
-	else
-		settags(c);
+	settags(c, getclient(trans));
 	if(!c->isfloat)
 		c->isfloat = trans
 			|| (c->maxw && c->minw &&
 				c->maxw == c->minw && c->maxh == c->minh);
+
+	if(clients)
+		clients->prev = c;
+	c->next = clients;
+	clients = c;
+
 	settitle(c);
-	if(isvisible(c))
-		sel = c;
-	arrange(NULL);
+	ban(c);
 	XMapWindow(dpy, c->win);
 	XMapWindow(dpy, c->twin);
 	if(isvisible(c))
 		focus(c);
+	arrange(NULL);
 }
 
 void
@@ -340,7 +340,7 @@ void
 settitle(Client *c)
 {
 	char **list = NULL;
-	int i, n;
+	int n;
 	XTextProperty name;
 
 	name.nitems = 0;
@@ -368,12 +368,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;
@@ -384,6 +385,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;
@@ -392,42 +396,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);
-
-	if(c->prev)
-		c->prev->next = c->next;
-	if(c->next)
-		c->next->prev = c->prev;
-	if(c == clients)
-		clients = c->next;
+	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);
 }