applied anydot's 3 minor patches, thank you anydot - dwm - dynamic window manager HTML git clone https://git.parazyd.org/dwm DIR Log DIR Files DIR Refs DIR README DIR LICENSE --- DIR commit 199a6016114875656102d11e79a80939bfaff3b3 DIR parent 492c6f10fcf9acf74d84eb3fe005ecf2dd42611a HTML Author: Anselm R. Garbe <arg@suckless.org> Date: Tue, 29 May 2007 11:35:20 +0200 applied anydot's 3 minor patches, thank you anydot Diffstat: M client.c | 17 ++++------------- M dwm.h | 3 +-- M event.c | 4 ++-- M layout.c | 41 ++++++++++++++++++------------- 4 files changed, 31 insertions(+), 34 deletions(-) --- DIR diff --git a/client.c b/client.c @@ -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); DIR diff --git a/dwm.h b/dwm.h @@ -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, DIR diff --git a/event.c b/event.c @@ -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); } } DIR diff --git a/layout.c b/layout.c @@ -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(); }