bool groupws_attach_framed_extl(WGroupWS *ws, WRegion *reg, ExtlTab t)
{
WGroupAttachParams ap=GROUPATTACHPARAMS_INIT;
- WFramedParam fp=FRAMEDPARAM_INIT;
- ExtlTab gt;
+ WFramedParam frp=FRAMEDPARAM_INIT;
if(reg==NULL)
return FALSE;
- fp.gravity=ForgetGravity;
-
- if(extl_table_is_bool_set(t, "switchto")){
- ap.switchto_set=TRUE;
- ap.switchto=TRUE;
- }
+ group_get_attach_params(&ws->grp, t, &ap);
- if(extl_table_gets_t(t, "geom", >)){
- int pos=0, size=0;
-
- fp.inner_geom.x=0;
- fp.inner_geom.y=0;
-
- if(extl_table_gets_i(gt, "x", &(ap.geom.x)))
- pos++;
- if(extl_table_gets_i(gt, "y", &(ap.geom.y)))
- pos++;
-
- if(extl_table_gets_i(gt, "w", &(ap.geom.w)))
- size++;
- if(extl_table_gets_i(gt, "h", &(ap.geom.h)))
- size++;
-
- fp.inner_geom.w=maxof(fp.inner_geom.w, 1);
- fp.inner_geom.h=maxof(fp.inner_geom.h, 1);
+ /* Sensible size is given in framedparams */
+ if(ap.geom_set){
+ ap.geom_set=0;
+ ap.geom_weak_set=1;
+ ap.geom_weak=0;
- fp.inner_geom_gravity_set=(size==2 && pos==2);
-
- extl_unref_table(gt);
+ frp.inner_geom_gravity_set=1;
+ frp.inner_geom=ap.geom;
+ frp.gravity=NorthWestGravity;
+ extl_table_gets_i(t, "gravity", &frp.gravity);
}
- return groupws_attach_framed(ws, &ap, &fp, reg);
+ return groupws_attach_framed(ws, &ap, &frp, reg);
}
}
+static bool group_empty_for_bottom_stdisp(WGroup *ws)
+{
+ WGroupIterTmp tmp;
+ WStacking *st;
+
+ FOR_ALL_NODES_IN_GROUP(ws, st, tmp){
+ if(st!=ws->bottom && st!=ws->managed_stdisp)
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+
+static WRegion *groupws_managed_disposeroot(WGroupWS *ws, WRegion *reg)
+{
+ if(group_bottom(&ws->grp)==reg){
+ if(group_empty_for_bottom_stdisp(&ws->grp)){
+ WRegion *tmpr=region_disposeroot((WRegion*)ws);
+ return (tmpr!=NULL ? tmpr : reg);
+ }
+ }
+
+ return reg;
+}
+
+
/*}}}*/
{(DynFun*)region_prepare_manage_transient,
(DynFun*)groupws_prepare_manage_transient},
+
+ {(DynFun*)region_managed_disposeroot,
+ (DynFun*)groupws_managed_disposeroot},
{(DynFun*)region_handle_drop,
(DynFun*)groupws_handle_drop},