void grid(Monitor *m) { unsigned int i, n, cx, cy, cw, ch, aw, ah, cols, rows; Client *c; for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) n++; /* grid dimensions */ for(rows = 0; rows <= n/2; rows++) if(rows*rows >= n) break; cols = (rows && (rows - 1) * rows >= n) ? rows - 1 : rows; /* window geoms (cell height/width) */ ch = m->wh / (rows ? rows : 1); cw = m->ww / (cols ? cols : 1); for(i = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next)) { cx = m->wx + (i / rows) * cw; cy = m->wy + (i % rows) * ch; /* adjust height/width of last row/column's windows */ ah = ((i + 1) % rows == 0) ? m->wh - ch * rows : 0; aw = (i >= rows * (cols - 1)) ? m->ww - cw * cols : 0; resize(c, cx, cy, cw - 2 * c->bw + aw, ch - 2 * c->bw + ah, False); i++; } } void tcl(Monitor * m) { int x, y, h, w, mw, sw, bdw; unsigned int i, n; Client * c; for (n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); if (n == 0) return; c = nexttiled(m->clients); mw = m->mfact * m->ww; sw = (m->ww - mw) / 2; bdw = (2 * c->bw); resize(c, n < 3 ? m->wx : m->wx + sw, m->wy, n == 1 ? m->ww - bdw : mw - bdw, m->wh - bdw, False); if (--n == 0) return; w = (m->ww - mw) / ((n > 1) + 1); c = nexttiled(c->next); if (n > 1) { x = m->wx + ((n > 1) ? mw + sw : mw); y = m->wy; h = m->wh / (n / 2); if (h < bh) h = m->wh; for (i = 0; c && i < n / 2; c = nexttiled(c->next), i++) { resize(c, x, y, w - bdw, (i + 1 == n / 2) ? m->wy + m->wh - y - bdw : h - bdw, False); if (h != m->wh) y = c->y + HEIGHT(c); } } x = (n + 1 / 2) == 1 ? mw : m->wx; y = m->wy; h = m->wh / ((n + 1) / 2); if (h < bh) h = m->wh; for (i = 0; c; c = nexttiled(c->next), i++) { resize(c, x, y, (i + 1 == (n + 1) / 2) ? w - bdw : w - bdw, (i + 1 == (n + 1) / 2) ? m->wy + m->wh - y - bdw : h - bdw, False); if (h != m->wh) y = c->y + HEIGHT(c); } }