diff --git a/src/client.c b/src/client.c index 5548832..daa126b 100644 --- a/src/client.c +++ b/src/client.c @@ -742,6 +742,9 @@ client_manage(Window w, XWindowAttributes *wa, Bool ar) c->free_geo = c->pgeo = c->wrgeo = c->split_geo = c->geo; c->tag = seltag[c->screen]; c->focusontag = -1; + + /* Set tilefact to 0 */ + tags[c->screen][c->tag].flags |= CleanFactFlag; cfactor_clean(c); at.event_mask = PropertyChangeMask; @@ -771,7 +774,6 @@ client_manage(Window w, XWindowAttributes *wa, Bool ar) client_attach(c); client_set_rules(c); client_get_name(c); - tags[c->screen][c->tag].flags |= CleanFactFlag; if(c->tag == (uint)seltag[selscreen]) { diff --git a/src/config.c b/src/config.c index 5f22aeb..3774937 100644 --- a/src/config.c +++ b/src/config.c @@ -549,9 +549,13 @@ conf_tag_section(void) }; FLAGAPPLY(default_tag.flags, - fetch_opt_first(def_tag, "False", "resizehint").bool, + fetch_opt_first(def_tag, "false", "resizehint").bool, ResizeHintFlag); + FLAGAPPLY(default_tag.flags, + fetch_opt_first(def_tag, "false", "split").bool, + (SplitFlag | FirstArrangeFlag)); + conf.default_tag = default_tag; /* Mouse button action on tag */ @@ -607,6 +611,10 @@ conf_tag_section(void) fetch_opt_first(tag[i], "false", "abovefc").bool, AboveFCFlag); + FLAGAPPLY(tags[k][conf.ntag[k]].flags, + fetch_opt_first(tag[i], "false", "split").bool, + (SplitFlag | FirstArrangeFlag)); + tmp = fetch_opt_first(tag[i], fetch_opt_first(def_tag, "top", "infobar_position").str, "infobar_position").str; if(!strcmp(tmp ,"none") || !strcmp(tmp, "hide") || !strcmp(tmp, "hidden")) diff --git a/src/layout.c b/src/layout.c index aeadb9f..d0f2b19 100644 --- a/src/layout.c +++ b/src/layout.c @@ -67,10 +67,14 @@ arrange(int screen, Bool update_layout) void layout_func(int screen, int tag) { - if(tags[screen][tag].flags & SplitFlag) + if((tags[screen][tag].flags & SplitFlag) + && !(tags[screen][tag].flags & FirstArrangeFlag)) split_apply_current(screen, tag); else + { tags[screen][tag].layout.func(screen); + tags[screen][tag].flags &= ~FirstArrangeFlag; + } return; } @@ -130,6 +134,7 @@ layoutswitch(Bool b) ewmh_update_current_tag_prop(); tags[selscreen][seltag[selscreen]].flags |= CleanFactFlag; + tags[selscreen][seltag[selscreen]].flags &= ~SplitFlag; layout_func(selscreen, seltag[selscreen]); infobar_draw(selscreen); @@ -864,6 +869,7 @@ uicb_set_layout(uicb_t cmd) tags[selscreen][seltag[selscreen]].layout = conf.layout[j]; tags[selscreen][seltag[selscreen]].flags |= CleanFactFlag; + tags[selscreen][seltag[selscreen]].flags &= ~SplitFlag; arrange(selscreen, True); return; diff --git a/src/split.c b/src/split.c index 07b1f74..aec1bc8 100644 --- a/src/split.c +++ b/src/split.c @@ -92,7 +92,7 @@ split_apply_current(int screen, int tag) /* Integrate in split mode */ if(tags[screen][tag].layout.flags & IntegrationFlag) { - if(tags[screen][tag].layout.nc == (c = sel) + if(!(c = sel) || tags[screen][tag].layout.nc == c || c->screen != screen || c->tag != tag) c = client_get_next(); @@ -312,6 +312,7 @@ split_client_integrate(Client *c, Client *sc, int screen, int tag) c->geo.y = sgeo[screen].y; client_maximize(c); + c->flags |= TileFlag; return; } diff --git a/src/structs.h b/src/structs.h index 2ef952d..a370a3d 100644 --- a/src/structs.h +++ b/src/structs.h @@ -66,6 +66,7 @@ #define CleanFactFlag (1 << 5) #define StayLastFlag (1 << 6) #define SplitFlag (1 << 7) +#define FirstArrangeFlag (1 << 8) #define TagFlag(t) (1 << (t)) diff --git a/wmfsrc b/wmfsrc index f3480d3..0d7ab04 100644 --- a/wmfsrc +++ b/wmfsrc @@ -103,6 +103,7 @@ layout = "tile" resizehint = false infobar_position = "top" + split = false [/default_tag] # whether client_next on the last tag will send you on the first @@ -149,6 +150,7 @@ resizehint = false infobar_position = "top" above_fc = false + split = false #[mouse] [/mouse] Possible multi mouse section [/tag]