diff --git a/src/cfactor.c b/src/cfactor.c index f1ca62a..ea09628 100644 --- a/src/cfactor.c +++ b/src/cfactor.c @@ -32,7 +32,7 @@ #include "wmfs.h" -#define RPOS(x) (x % 2 ? p - 1 : p + 1) +#define RPOS(x) (x % 2 ? x - 1 : x + 1) char scanfac[4][2] = { @@ -64,10 +64,9 @@ cfactor_clean(Client *c) XRectangle cfactor_geo(XRectangle geo, int fact[4], int *err) { - XRectangle cgeo = { 0, 0, 0, 0 }; + XRectangle cgeo = geo; *err = 0; - cgeo = geo; /* Right factor */ cgeo.width += fact[Right]; @@ -155,13 +154,37 @@ _cfactor_arrange_row(Client *c, Position p, int fac) static void cfactor_arrange_two(Client *c1, Client *c2, Position p, int fac) { + c1->tilefact[p] += fac; c2->tilefact[RPOS(p)] -= fac; + /* Needed in case of padding */ + if(conf.client.padding) + { + c1->flags |= FLayFlag; + c2->flags |= FLayFlag; + } + client_moveresize(c1, c1->geo, tags[c1->screen][c1->tag].resizehint); client_moveresize(c2, c2->geo, tags[c2->screen][c2->tag].resizehint); return; + +} + +/* Check 2 clients parenting compatibility + *\param g1 client1 geo + *\param g2 client2 geo + *\param p Direction of resizing + *\returm 1/0 +*/ +static Bool +cfactor_check_2pc(XRectangle g1, XRectangle g2, Position p) +{ + if(p < Top) + return (g1.height == g2.height); + else + return (g1.width == g2.width); } /** Get c parents of row and resize, exception checking same size before arranging row @@ -173,8 +196,8 @@ cfactor_arrange_two(Client *c1, Client *c2, Position p, int fac) static void cfactor_arrange_row(Client *c, Client *gc, Position p, int fac) { - if(((p == Right || p == Left) && gc->geo.height == c->geo.height) - || ((p == Top || p == Bottom) && gc->geo.width == c->geo.width)) + + if(cfactor_check_2pc(c->frame_geo, gc->frame_geo, p)) cfactor_arrange_two(c, gc, p, fac); else { diff --git a/src/client.c b/src/client.c index 4d191cf..8e91e36 100644 --- a/src/client.c +++ b/src/client.c @@ -533,8 +533,8 @@ client_urgent(Client *c, Bool u) for(cc = clients; cc; cc = cc->next) if(!ishide(cc, selscreen) && (cc->flags & TileFlag) && cc != c) - if(cc->frame_geo.x <= x && cc->frame_geo.x + cc->frame_geo.width >= x - && cc->frame_geo.y <= y && cc->frame_geo.y + cc->frame_geo.height >= y) + if(cc->frame_geo.x < x && cc->frame_geo.x + cc->frame_geo.width > x + && cc->frame_geo.y < y && cc->frame_geo.y + cc->frame_geo.height > y) return cc; return c; @@ -1021,42 +1021,50 @@ void client_moveresize(Client *c, XRectangle geo, Bool r) { int os, e; + XRectangle fg; if(!c) return; os = c->screen; + /* Apply padding and cfactor */ if(c->flags & TileFlag) + { geo = cfactor_geo(c->pgeo, c->tilefact, &e); - if(e) - printf("EE: &e\n"); - if(r) - client_geo_hints(&geo, c); + if(conf.client.padding && (c->flags & FLayFlag)) + { + geo.x += conf.client.padding; + geo.y += conf.client.padding; + geo.width -= conf.client.padding * 2; + geo.height -= conf.client.padding * 2; + + c->flags &= ~FLayFlag; + } + } c->flags &= ~MaxFlag; - if(conf.client.padding && c->flags & TileFlag && c->flags & FLayFlag) - { - geo.x += conf.client.padding; - geo.y += conf.client.padding; - geo.width -= conf.client.padding * 2; - geo.height -= conf.client.padding * 2; + fg = geo; - c->flags &= ~FLayFlag; - } + /* Apply geometry hints */ + if(r) + client_geo_hints(&geo, c); c->geo = geo; - if(c->flags & FreeFlag || !(c->flags & (TileFlag | LMaxFlag)) || conf.keep_layout_geo) + /* Sett free_geo */ + if(c->flags & FreeFlag || !(c->flags & (TileFlag | LMaxFlag)) + || conf.keep_layout_geo) c->free_geo = c->geo; + /* Check to set new screen if needed */ if((c->screen = screen_get_with_geo(c->geo.x, c->geo.y)) != os && c->tag != MAXTAG + 1) c->tag = seltag[c->screen]; - frame_moveresize(c, c->geo); + frame_moveresize(c, fg); XMoveResizeWindow(dpy, c->win, BORDH, TBARH, c->geo.width, c->geo.height); diff --git a/src/layout.c b/src/layout.c index 001a6ec..e1321c7 100644 --- a/src/layout.c +++ b/src/layout.c @@ -887,17 +887,19 @@ layout_split_client(Client *c, Bool p) geo = sgeo = c->geo; + /* Vertical */ if(p) { - geo.x += (geo.width / 2); geo.width /= 2; sgeo.width = (sgeo.width / 2) - (BORDH * 2); + sgeo.x = FRAMEW(geo.x + geo.width); } + /* Horizontal */ else { - geo.y += (geo.height / 2); - geo.height /= 2; - sgeo.height = (sgeo.height / 2) - (BORDH + TBARH); + geo.height = (geo.height / 2) - TBARH; + sgeo.height = (sgeo.height / 2) - BORDH; + sgeo.y = FRAMEH(geo.y + geo.height); } tags[c->screen][c->tag].layout.sgeo = sgeo; diff --git a/wmfsrc b/wmfsrc index e2e6997..9ed070c 100644 --- a/wmfsrc +++ b/wmfsrc @@ -126,7 +126,7 @@ expose_name = "EXPOSE" expose_layout = "tile_left" - + # Border around the tag buttons. border = true @@ -191,7 +191,7 @@ # same as above but for the screen #default_open_screen = 1 - # Space between tiled clients + # Space between tiled clients (px) padding = 0 # Modifier for mouse use @@ -334,7 +334,7 @@ # Swap current client with the previous. [key] mod = {"Alt", "Shift"} key = "t" func = "client_swap_prev" [/key] - + # Set the selected client as Master [key] mod = {"Control"} key = "m" func = "client_set_master" [/key]