I grabbed the latest dwm earlier to port various bits of my own into clean patches against the latest dwm. I hadn't looked at the standard tile function for a little while, but I notice that the current incarnation recalculates the window geometries (mw and th) for each client rather than once in front of the client loop. hg bisect says this started happening at changeset 1072:5a06b4b69479 when the Xinerama work began.
Obviously mw and th are different from monitor to monitor, but within a monitor they're constant, so I think the following (trivial) patch is correct: diff --git a/dwm.c b/dwm.c --- a/dwm.c +++ b/dwm.c @@ -1689,12 +1689,13 @@ tile(void) { for(n = 0, c = nexttiled(clients, m); c; c = nexttiled(c->next, m)) n++; + /* window geoms */ + mw = (n == 1) ? m->waw : m->mwfact * m->waw; + th = (n > 1) ? m->wah / (n - 1) : 0; + if(n > 1 && th < bh) + th = m->wah; + for(j = 0, c = mc = nexttiled(clients, m); c; c = nexttiled(c->next, m)) { - /* window geoms */ - mw = (n == 1) ? m->waw : m->mwfact * m->waw; - th = (n > 1) ? m->wah / (n - 1) : 0; - if(n > 1 && th < bh) - th = m->wah; if(j == 0) { /* master */ nx = m->wax; ny = m->way; Best wishes, Chris.