some polishing in tileh/tilev

This commit is contained in:
Anselm R Garbe 2008-03-13 13:59:40 +00:00
parent 69439715c0
commit 831428b00c

120
dwm.c
View File

@ -117,6 +117,7 @@ void cleanup(void);
void configure(Client *c);
void configurenotify(XEvent *e);
void configurerequest(XEvent *e);
unsigned int counttiled(void);
void destroynotify(XEvent *e);
void detach(Client *c);
void detachstack(Client *c);
@ -170,7 +171,8 @@ unsigned int textnw(const char *text, unsigned int len);
unsigned int textw(const char *text);
void tileh(void);
void tilehstack(unsigned int n);
unsigned int tilemaster(void);
Client *tilemaster(unsigned int n);
void tileresize(Client *c, int x, int y, int w, int h);
void tilev(void);
void tilevstack(unsigned int n);
void togglefloating(const char *arg);
@ -458,6 +460,15 @@ configurerequest(XEvent *e) {
XSync(dpy, False);
}
unsigned int
counttiled(void) {
unsigned int n;
Client *c;
for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next), n++);
return n;
}
void
destroynotify(XEvent *e) {
Client *c;
@ -1578,6 +1589,44 @@ textw(const char *text) {
return textnw(text, strlen(text)) + dc.font.height;
}
void
tileh(void) {
int x, w;
unsigned int i, n = counttiled();
Client *c;
if(n == 0)
return;
c = tilemaster(n);
if(--n == 0)
return;
x = tx;
w = tw / n;
if(w < bh)
w = tw;
for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
if(i + 1 == n) /* remainder */
tileresize(c, x, ty, (tx + tw) - x - 2 * c->border, th - 2 * c->border);
else
tileresize(c, x, ty, w - 2 * c->border, th - 2 * c->border);
if(w != tw)
x = c->x + c->w + 2 * c->border;
}
}
Client *
tilemaster(unsigned int n) {
Client *c = nexttiled(clients);
if(n == 1)
tileresize(c, mox, moy, mow - 2 * c->border, moh - 2 * c->border);
else
tileresize(c, mx, my, mw - 2 * c->border, mh - 2 * c->border);
return c;
}
void
tileresize(Client *c, int x, int y, int w, int h) {
resize(c, x, y, w, h, RESIZEHINTS);
@ -1587,63 +1636,15 @@ tileresize(Client *c, int x, int y, int w, int h) {
}
void
tileh(void) {
tilehstack(tilemaster());
}
void
tilehstack(unsigned int n) {
int i, x, w;
tilev(void) {
int y, h;
unsigned int i, n = counttiled();
Client *c;
if(n == 0)
return;
x = tx;
w = tw / n;
if(w < bh)
w = tw;
for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i++)
if(i > 0) {
if(i > 1 && i == n) /* remainder */
tileresize(c, x, ty, (tx + tw) - x - 2 * c->border,
th - 2 * c->border);
else
tileresize(c, x, ty, w - 2 * c->border,
th - 2 * c->border);
if(w != tw)
x = c->x + c->w + 2 * c->border;
}
}
unsigned int
tilemaster(void) {
unsigned int n;
Client *c, *mc;
for(n = 0, mc = c = nexttiled(clients); c; c = nexttiled(c->next))
n++;
if(n == 0)
return 0;
if(n == 1)
tileresize(mc, mox, moy, mow - 2 * mc->border, moh - 2 * mc->border);
else
tileresize(mc, mx, my, mw - 2 * mc->border, mh - 2 * mc->border);
return n - 1;
}
void
tilev(void) {
tilevstack(tilemaster());
}
void
tilevstack(unsigned int n) {
int i, y, h;
Client *c;
if(n == 0)
c = tilemaster(n);
if(--n == 0)
return;
y = ty;
@ -1651,14 +1652,11 @@ tilevstack(unsigned int n) {
if(h < bh)
h = th;
for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next), i++)
if(i > 0) {
if(i > 1 && i == n) /* remainder */
tileresize(c, tx, y, tw - 2 * c->border,
(ty + th) - y - 2 * c->border);
for(i = 0, c = nexttiled(c->next); c; c = nexttiled(c->next), i++) {
if(i + 1 == n) /* remainder */
tileresize(c, tx, y, tw - 2 * c->border, (ty + th) - y - 2 * c->border);
else
tileresize(c, tx, y, tw - 2 * c->border,
h - 2 * c->border);
tileresize(c, tx, y, tw - 2 * c->border, h - 2 * c->border);
if(h != th)
y = c->y + c->h + 2 * c->border;
}