dwm

my fork of dwm
Index Commits Files Refs README LICENSE
commit 199a6016114875656102d11e79a80939bfaff3b3
parent 492c6f10fcf9acf74d84eb3fe005ecf2dd42611a
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:
Mclient.c | 17++++-------------
Mdwm.h | 3+--
Mevent.c | 4++--
Mlayout.c | 41++++++++++++++++++++++++-----------------
4 files changed, 31 insertions(+), 34 deletions(-)
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);
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,
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);
     }
 }
 
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();
 }