diff options
| -rw-r--r-- | client.c | 50 | ||||
| -rw-r--r-- | dwm.h | 3 | ||||
| -rw-r--r-- | event.c | 8 | ||||
| -rw-r--r-- | main.c | 1 | ||||
| -rw-r--r-- | view.c | 30 | 
5 files changed, 48 insertions, 44 deletions
| @@ -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);  } @@ -58,7 +58,6 @@ struct Client {  	long flags;   	unsigned int border, weight;  	Bool isfloat; -	Bool ismax;  	Bool *tags;  	Client *next;  	Client *prev; @@ -73,7 +72,7 @@ extern unsigned int ntags, numlockmask;  extern void (*handler[LASTEvent])(XEvent *);  extern void (*arrange)(Arg *);  extern Atom wmatom[WMLast], netatom[NetLast]; -extern Bool running, issel, *seltag; +extern Bool running, issel, maximized, *seltag;  extern Client *clients, *sel;  extern Cursor cursor[CurLast];  extern DC dc; @@ -131,15 +131,15 @@ buttonpress(XEvent *e)  	}  	else if((c = getclient(ev->window))) {  		focus(c); -		if(c->ismax || CLEANMASK(ev->state) != MODKEY) +		if(maximized || CLEANMASK(ev->state) != MODKEY)  			return; -		if((ev->button == Button1) && ((arrange == dofloat) || c->isfloat)) { +		if(ev->button == Button1 && (arrange == dofloat || c->isfloat)) {  			restack(c);  			movemouse(c);  		}  		else if(ev->button == Button2)  			zoom(NULL); -		else if(ev->button == Button3 && ((arrange == dofloat) || c->isfloat)) { +		else if(ev->button == Button3 && (arrange == dofloat || c->isfloat)) {  			restack(c);  			resizemouse(c);  		} @@ -173,7 +173,7 @@ configurerequest(XEvent *e)  	XWindowChanges wc;  	if((c = getclient(ev->window))) { -		if(!c->isfloat && (arrange != dofloat) && c->ismax) { +		if((c == sel) && !c->isfloat && (arrange != dofloat) && maximized) {  			synconfig(c, sx, sy + bh, sw - 2, sh - 2 - bh, ev->border_width);  			XSync(dpy, False);  			return; @@ -24,6 +24,7 @@ unsigned int ntags, numlockmask;  Atom wmatom[WMLast], netatom[NetLast];  Bool running = True;  Bool issel = True; +Bool maximized = False;  Client *clients = NULL;  Client *sel = NULL;  Cursor cursor[CurLast]; @@ -57,22 +57,20 @@ detach(Client *c)  void  dofloat(Arg *arg)  { -	Client *c; +	Client *c, *fc; + +	maximized = False;  	for(c = clients; c; c = c->next) { -		c->ismax = False;  		if(isvisible(c)) {  			resize(c, True, TopLeft);  		}  		else  			ban(c);  	} -	if(!sel || !isvisible(sel)) -		sel = getnext(clients); -	if(sel) -		focus(sel); -	else -		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); +	if(!(fc = sel) || !isvisible(fc)) +		fc = getnext(clients); +	focus(fc);  	restack();  } @@ -80,7 +78,9 @@ void  dotile(Arg *arg)  {  	int h, i, n, w; -	Client *c; +	Client *c, *fc; + +	maximized = False;  	w = sw - mw;  	for(n = 0, c = clients; c; c = c->next) @@ -93,7 +93,6 @@ dotile(Arg *arg)  		h = sh - bh;  	for(i = 0, c = clients; c; c = c->next) { -		c->ismax = False;  		if(isvisible(c)) {  			if(c->isfloat) {  				resize(c, True, TopLeft); @@ -132,12 +131,9 @@ dotile(Arg *arg)  		else  			ban(c);  	} -	if(!sel || !isvisible(sel)) -		sel = getnext(clients); -	if(sel) -		focus(sel); -	else -		XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); +	if(!(fc = sel) || !isvisible(fc)) +		fc = getnext(clients); +	focus(fc);  	restack();  } @@ -289,7 +285,7 @@ zoom(Arg *arg)  {  	Client *c = sel; -	if(!c || (arrange != dotile) || c->isfloat || c->ismax) +	if(!c || (arrange != dotile) || c->isfloat || maximized)  		return;  	if(c == getnext(clients)) | 
