diff options
| -rw-r--r-- | client.c | 17 | ||||
| -rw-r--r-- | dwm.h | 3 | ||||
| -rw-r--r-- | event.c | 4 | ||||
| -rw-r--r-- | layout.c | 41 | 
4 files changed, 31 insertions, 34 deletions
| @@ -129,8 +129,8 @@ detach(Client *c) {  void  focus(Client *c) { -	if(c && !isvisible(c)) -		return; +	if( !c && selscreen || c && !isvisible(c)) +		for(c = stack; c && !isvisible(c); c = c->snext);  	if(sel && sel != c) {  		grabbuttons(sel, False);  		XSetWindowBorder(dpy, sel->win, dc.norm[ColBorder]); @@ -153,14 +153,6 @@ focus(Client *c) {  }  void -focustopvisible(void) { -	Client *c; - -	for(c = stack; c && !isvisible(c); c = c->snext); -	focus(c); -} - -void  killclient(const char *arg) {  	XEvent ev; @@ -230,8 +222,7 @@ manage(Window w, XWindowAttributes *wa) {  	XMoveWindow(dpy, w, c->x + 2 * sw, c->y);  	XMapWindow(dpy, w);  	setclientstate(c, NormalState); -	if(isvisible(c)) -		focus(c); +	focus(c);  	lt->arrange();  } @@ -401,7 +392,7 @@ unmanage(Client *c) {  	detach(c);  	detachstack(c);  	if(sel == c) -		focustopvisible(); +		focus(NULL);  	XUngrabButton(dpy, AnyButton, AnyModifier, c->win);  	setclientstate(c, WithdrawnState);  	free(c->tags); @@ -100,8 +100,7 @@ Window root, barwin;  void attach(Client *c);			/* attaches c to global client list */  void configure(Client *c);		/* send synthetic configure event */  void detach(Client *c);			/* detaches c from global client list */ -void focus(Client *c);			/* focus c, c may be NULL */ -void focustopvisible(void);		/* focus top visible window on stack */ +void focus(Client *c);			/* focus c if visible && !NULL, or focus top visible */  void killclient(const char *arg);	/* kill sel  nicely */  void manage(Window w, XWindowAttributes *wa);	/* manage new client */  void resize(Client *c, int x, int y, @@ -242,11 +242,11 @@ enternotify(XEvent *e) {  	if(ev->mode != NotifyNormal || ev->detail == NotifyInferior)  		return; -	if((c = getclient(ev->window)) && isvisible(c)) +	if(c = getclient(ev->window))  		focus(c);  	else if(ev->window == root) {  		selscreen = True; -		focustopvisible(); +		focus(NULL);  	}  } @@ -14,6 +14,22 @@ static unsigned int masterw = MASTERWIDTH;  static unsigned int nmaster = NMASTER;  static void +ban(Client *c) { +	if (c->isbanned) +		return; +	XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); +	c->isbanned = True; +} + +static void +unban(Client *c) { +	if (!c->isbanned) +		return; +	XMoveWindow(dpy, c->win, c->x, c->y); +	c->isbanned = False; +} + +static void  tile(void) {  	unsigned int i, n, nx, ny, nw, nh, mw, mh, tw, th;  	Client *c; @@ -28,9 +44,7 @@ tile(void) {  	for(i = 0, c = clients; c; c = c->next)  		if(isvisible(c)) { -			if(c->isbanned) -				XMoveWindow(dpy, c->win, c->x, c->y); -			c->isbanned = False; +			unban(c);  			if(c->isfloating)  				continue;  			c->ismax = False; @@ -60,12 +74,9 @@ tile(void) {  			resize(c, nx, ny, nw, nh, False);  			i++;  		} -		else { -			c->isbanned = True; -			XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); -		} -	if(!sel || !isvisible(sel))  -		focustopvisible(); +		else +			ban(c); +	focus(NULL);  	restack();  } @@ -77,20 +88,16 @@ void  floating(void) {  	Client *c; -	for(c = clients; c; c = c->next) { +	for(c = clients; c; c = c->next)  		if(isvisible(c)) {  			if(c->isbanned)  				XMoveWindow(dpy, c->win, c->x, c->y);  			c->isbanned = False;  			resize(c, c->x, c->y, c->w, c->h, True);  		} -		else { -			c->isbanned = True; -			XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y); -		} -	} -	if(!sel || !isvisible(sel)) -		focustopvisible(); +		else +			ban(c); +	focus(NULL);  	restack();  } | 
