X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=tile.c;h=3cdaf49fea4e8d0ac8a242cd06b3862da78660d4;hb=14d8d828abbb91db3305dfa666c8c70358d1d3c7;hp=0955e635b42a4eba7251607dd8c6affc7eea3638;hpb=a923298d3577dca0e69fd70edbef56c7822258e3;p=dwm.git diff --git a/tile.c b/tile.c index 0955e63..3cdaf49 100644 --- a/tile.c +++ b/tile.c @@ -1,87 +1,103 @@ /* See LICENSE file for copyright and license details. */ -#include "dwm.h" -#include +double mfact = MFACT; +int bx, by, bw, bh, blw, mx, my, mw, mh, tx, ty, tw, th, wx, wy, ww, wh; -/* static */ - -static double mwfact = MWFACT; - -/* extern */ +void setmfact(const char *arg); +void tile(void); +void tilegeom(void); +void tileresize(Client *c, int x, int y, int w, int h); void -setmwfact(const char *arg) { - double delta, newfact; +setmfact(const char *arg) { + double d; - if(!isarrange(tile)) + if(lt->arrange != tile) return; - /* arg handling, manipulate mwfact */ - if(arg == NULL) - mwfact = MWFACT; - else if(1 == sscanf(arg, "%lf", &delta)) { - if(arg[0] != '+' && arg[0] != '-') - newfact = delta; - else - newfact = mwfact + delta; - if(newfact < 0.1) - newfact = 0.1; - else if(newfact > 0.9) - newfact = 0.9; - mwfact = newfact; + if(!arg) + mfact = MFACT; + else { + d = strtod(arg, NULL); + if(arg[0] == '-' || arg[0] == '+') + d += mfact; + if(d < 0.1 || d > 0.9) + return; + mfact = d; } + updategeom(); arrange(); } void tile(void) { - unsigned int i, n, nx, ny, nw, nh, mw, th; + int y, h; + unsigned int i, n; Client *c; - for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) - n++; + for(n = 0, c = nextunfloating(clients); c; c = nextunfloating(c->next), n++); + if(n == 0) + return; + + /* master */ + c = nextunfloating(clients); + + if(n == 1) + tileresize(c, wx, wy, ww - 2 * c->bw, wh - 2 * c->bw); + else + tileresize(c, mx, my, mw - 2 * c->bw, mh - 2 * c->bw); - /* window geoms */ - mw = (n == 1) ? waw : mwfact * waw; - th = (n > 1) ? wah / (n - 1) : 0; - if(n > 1 && th < bh) - th = wah; + if(--n == 0) + return; - nx = wax; - ny = way; - for(i = 0, c = nexttiled(clients); c; c = nexttiled(c->next)) { - c->ismax = False; - if(i == 0) { /* master */ - nw = mw - 2 * c->border; - nh = wah - 2 * c->border; - } - else { /* tile window */ - if(i == 1) { - ny = way; - nx += mw; - } - nw = waw - mw - 2 * c->border; - if(i + 1 == n) /* remainder */ - nh = (way + wah) - ny - 2 * c->border; - else - nh = th - 2 * c->border; - } - resize(c, nx, ny, nw, nh, False); - if(n > 1 && th != wah) - ny += nh + 2 * c->border; - i++; + /* tile stack */ + y = ty; + h = th / n; + if(h < bh) + h = th; + + for(i = 0, c = nextunfloating(c->next); c; c = nextunfloating(c->next), i++) { + if(i + 1 == n) /* remainder */ + tileresize(c, tx, y, tw - 2 * c->bw, (ty + th) - y - 2 * c->bw); + else + tileresize(c, tx, y, tw - 2 * c->bw, h - 2 * c->bw); + if(h != th) + y = c->y + c->h + 2 * c->bw; } } void +tilegeom(void) { + /* master area geometry */ + mx = wx; + my = wy; + mw = mfact * ww; + mh = wh; + + /* tile area geometry */ + tx = mx + mw; + ty = wy; + tw = ww - mw; + th = wh; +} + +void +tileresize(Client *c, int x, int y, int w, int h) { + resize(c, x, y, w, h, RESIZEHINTS); + if((RESIZEHINTS) && ((c->h < bh) || (c->h > h) || (c->w < bh) || (c->w > w))) + /* client doesn't accept size constraints */ + resize(c, x, y, w, h, False); +} + +void zoom(const char *arg) { - Client *c; + Client *c = sel; - if(!sel || !isarrange(tile) || sel->isfloating) - return; - if((c = sel) == nexttiled(clients)) - if(!(c = nexttiled(c->next))) + if(c == nextunfloating(clients)) + if(!c || !(c = nextunfloating(c->next))) return; - detach(c); - attach(c); - focus(c); + if(lt->arrange == tile && !sel->isfloating) { + detach(c); + attach(c); + focus(c); + } arrange(); }