X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=tile.c;h=82696769e02a403fc6af59e7efe0a20e939260a3;hp=2481eb3be8143314703343ac9f62587f383dae31;hb=6bdef73a4f0c2a96f8984ddc10b55f1d753ab5fe;hpb=f6e41b0bc3a00a2c48a996e2da4ad84be9a719f7 diff --git a/tile.c b/tile.c index 2481eb3..8269676 100644 --- a/tile.c +++ b/tile.c @@ -1,87 +1,102 @@ /* See LICENSE file for copyright and license details. */ -#include "dwm.h" -#include +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 tileresize(Client *c, int x, int y, int w, int h); +void updatetilegeom(void); void -addtomwfact(const char *arg) { - double delta; +setmfact(const char *arg) { + double d; - if(lt->arrange != tile) + if(!arg || lt->arrange != tile) return; - - /* arg handling, manipulate mwfact */ - if(arg && (1 == sscanf(arg, "%lf", &delta))) { - if(delta + mwfact > 0.1 && delta + mwfact < 0.9) - mwfact += delta; + else { + d = strtod(arg, NULL); + if(arg[0] == '-' || arg[0] == '+') + d += mfact; + if(d < 0.1 || d > 0.9) + return; + mfact = d; } - lt->arrange(); + updatetilegeom(); + arrange(); } void tile(void) { - unsigned int i, n, nx, ny, nw, nh, mw, th; + int x, y, h, w; + 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 = clients; c; c = c->next) - if(isvisible(c)) { - unban(c); - if(c->isfloating) - continue; - 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 */ + x = (tx > c->x + c->w) ? c->x + c->w + 2 * c->bw : tw; + y = ty; + w = (tx > c->x + c->w) ? wx + ww - x : tw; + 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, x, y, w - 2 * c->bw, (ty + th) - y - 2 * c->bw); else - ban(c); - focus(NULL); - restack(); + tileresize(c, x, y, w - 2 * c->bw, h - 2 * c->bw); + if(h != th) + y = c->y + c->h + 2 * c->bw; + } +} + +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 || lt->arrange == floating || 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); - lt->arrange(); + if(lt->arrange == tile && !sel->isfloating) { + detach(c); + attach(c); + focus(c); + } + arrange(); +} + +void +updatetilegeom(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; }