#include "names.h"
#include "framedpholder.h"
#include "grouppholder.h"
+#include "return.h"
+#include "saveload.h"
#define DFLT_SZPLCY SIZEPOLICY_FREE_GLUE__SOUTH
/*}}}*/
+/*{{{ Rescue */
+
+
+static void group_migrate_phs_to_ph(WGroup *group, WPHolder *rph)
+{
+ WGroupPHolder *phs, *ph;
+
+ phs=group->phs;
+ group->phs=NULL;
+
+ phs->recreate_pholder=rph;
+
+ for(ph=phs; ph!=NULL; ph=ph->next)
+ ph->group=NULL;
+}
+
+
+bool groupcw_rescue_clientwins(WGroupCW *cwg, WRescueInfo *info)
+{
+ bool ret=group_rescue_clientwins(&cwg->grp, info);
+
+ /* If this group can be recreated, arrange remaining placeholders
+ * to do so. This takes care of e.g. recreating client window groups
+ * when recreating layout delayedly under a session manager.
+ */
+ if(cwg->grp.phs!=NULL){
+ WPHolder *rph=region_make_return_pholder((WRegion*)cwg);
+
+ if(rph!=NULL)
+ group_migrate_phs_to_ph(&cwg->grp, rph);
+ }
+
+ return ret;
+}
+
+
+/*}}}*/
+
+
+
/*{{{ WGroupCW class */
WRegion *groupcw_load(WWindow *par, const WFitParams *fp, ExtlTab tab)
{
- WGroupCW *ws;
+ WGroupCW *cwg;
ExtlTab substab, subtab;
int i, n;
- ws=create_groupcw(par, fp);
+ cwg=create_groupcw(par, fp);
- if(ws==NULL)
+ if(cwg==NULL)
return NULL;
-
- if(!extl_table_gets_t(tab, "managed", &substab))
- return (WRegion*)ws;
-
- n=extl_table_get_n(substab);
- for(i=1; i<=n; i++){
- if(extl_table_geti_t(substab, i, &subtab)){
- group_attach_new(&ws->grp, subtab);
- extl_unref_table(subtab);
- }
- }
-
- extl_unref_table(substab);
+
+ group_do_load(&cwg->grp, tab);
- if(ws->grp.managed_list==NULL){
- destroy_obj((Obj*)ws);
+ if(cwg->grp.managed_list==NULL){
+ if(cwg->grp.phs!=NULL){
+ /* Session management hack */
+ WPHolder *ph=ioncore_get_load_pholder();
+ if(ph!=NULL)
+ group_migrate_phs_to_ph(&cwg->grp, ph);
+ }
+ destroy_obj((Obj*)cwg);
return NULL;
}
- return (WRegion*)ws;
+ return (WRegion*)cwg;
}
{group_bottom_set,
groupcw_bottom_set},
+
+ {(DynFun*)region_rescue_clientwins,
+ (DynFun*)groupcw_rescue_clientwins},
END_DYNFUNTAB
};