diff -r c2d4ba4e9023 dwm.c --- a/dwm.c Mon Nov 17 22:53:18 2008 +0100 +++ b/dwm.c Tue Nov 18 18:10:00 2008 +0100 @@ -133,6 +133,7 @@ /* function declarations */ static void applyrules(Client *c); static void arrange(void); +static void arrangefloating(Client *c); static void attach(Client *c); static void attachaftersel(Client *c); static void attachstack(Client *c); @@ -171,6 +172,7 @@ static void maprequest(XEvent *e); static void monocle(void); static void movemouse(const Arg *arg); +static Client *nextfloating(Client *c); static Client *nexttiled(Client *c); static void propertynotify(XEvent *e); static void quit(const Arg *arg); @@ -285,6 +287,44 @@ if(lt[sellt]->arrange) lt[sellt]->arrange(); restack(); +} + +void +arrangefloating(Client *c) { + int x, y, w, h; + Client *oc; + int foundslot=0; + + x = c->x; + y = c->y; + w = c->w; + h = c->h; + + while(!foundslot) { + for(oc = nextfloating(clients); oc; oc = nextfloating(oc->next)) { + if(x + w <= oc->x) continue; + if(x >= oc->x + oc->w) continue; + if(y + h <= oc->y) continue; + if(y >= oc->y + oc->h) continue; + x = oc->x + oc->w; + } + + if(x + w > sw) { + x = c->x; + y++; + if(y + h > sh) + break; + } + else + foundslot=1; + } + + if(!foundslot) { + x = rand() % (sw - w); + y = rand() % (sh - h); + } + + resize(c, x, y, w, h, resizehints); } void @@ -931,6 +971,10 @@ c->isfloating = trans != None || c->isfixed; if(c->isfloating) XRaiseWindow(dpy, c->win); + if(!lt[sellt]->arrange) { + c->isfloating = True; + arrangefloating(c); + } attachaftersel(c); attachstack(c); XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ @@ -1021,6 +1065,12 @@ if(usegrab) XUngrabServer(dpy); XUngrabPointer(dpy, CurrentTime); +} + +Client * +nextfloating(Client *c) { + for(; c && (!c->isfloating || !ISVISIBLE(c)); c = c->next); + return c; } Client *