static void setlayout(const Arg *arg);
static void setmfact(const Arg *arg);
static void setup(void);
+static void showhide(Client *c);
static void spawn(const Arg *arg);
static void tag(const Arg *arg);
static int textnw(const char *text, unsigned int len);
void
arrange(void) {
- Client *c;
-
- for(c = clients; c; c = c->next)
- if(ISVISIBLE(c)) {
- XMoveWindow(dpy, c->win, c->x, c->y);
- if(!lt[sellt]->arrange || c->isfloating)
- resize(c, c->x, c->y, c->w, c->h, True);
- }
- else {
- XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
- }
-
+ showhide(stack);
focus(NULL);
if(lt[sellt]->arrange)
lt[sellt]->arrange();
void
checkotherwm(void) {
otherwm = False;
- XSetErrorHandler(xerrorstart);
+ xerrorxlib = XSetErrorHandler(xerrorstart);
/* this causes an error if some other window manager is running */
XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask);
XSync(dpy, False);
if(otherwm)
die("dwm: another window manager is already running\n");
- XSetErrorHandler(NULL);
- xerrorxlib = XSetErrorHandler(xerror);
+ XSetErrorHandler(xerror);
XSync(dpy, False);
}
void
manage(Window w, XWindowAttributes *wa) {
+ static Client cz;
Client *c, *t = NULL;
Window trans = None;
XWindowChanges wc;
- if(!(c = calloc(1, sizeof(Client))))
- die("fatal: could not calloc() %u bytes\n", sizeof(Client));
+ if(!(c = malloc(sizeof(Client))))
+ die("fatal: could not malloc() %u bytes\n", sizeof(Client));
+ *c = cz;
c->win = w;
/* geometry */
/* adjust for aspect limits */
if(c->mina > 0 && c->maxa > 0) {
- if(c->maxa < (float)(w / h))
+ if(c->maxa < (float)w / h)
w = h * c->maxa;
- else if(c->mina < (float)(h / w))
+ else if(c->mina < (float)h / w)
h = w * c->mina;
}
grabkeys();
}
+void
+showhide(Client *c) {
+ if(!c)
+ return;
+ if(ISVISIBLE(c)) { /* show clients top down */
+ XMoveWindow(dpy, c->win, c->x, c->y);
+ if(!lt[sellt]->arrange || c->isfloating)
+ resize(c, c->x, c->y, c->w, c->h, True);
+ showhide(c->snext);
+ }
+ else { /* hide clients bottom up */
+ showhide(c->snext);
+ XMoveWindow(dpy, c->win, c->x + 2 * sw, c->y);
+ }
+}
+
void
spawn(const Arg *arg) {
/* The double-fork construct avoids zombie processes and keeps the code
long msize;
XSizeHints size;
- XGetWMNormalHints(dpy, c->win, &size, &msize);
+ if(!XGetWMNormalHints(dpy, c->win, &size, &msize))
+ /* size is uninitialized, ensure that size.flags aren't used */
+ size.flags = PSize;
if(size.flags & PBaseSize) {
c->basew = size.base_width;
c->baseh = size.base_height;
else
c->maxa = c->mina = 0.0;
c->isfixed = (c->maxw && c->minw && c->maxh && c->minh
- && c->maxw == c->minw && c->maxh == c->minh);
+ && c->maxw == c->minw && c->maxh == c->minh);
}
void