/*
* ion/ioncore/group-cw.c
*
- * Copyright (c) Tuomo Valkonen 1999-2007.
+ * Copyright (c) Tuomo Valkonen 1999-2008.
*
- * Ion is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
+ * See the included file LICENSE for details.
*/
#include <string.h>
#include "names.h"
#include "framedpholder.h"
#include "grouppholder.h"
+#include "return.h"
+#include "saveload.h"
#define DFLT_SZPLCY SIZEPOLICY_FREE_GLUE__SOUTH
WPHolder *groupcw_prepare_manage(WGroupCW *cwg, const WClientWin *cwin,
- const WManageParams *param, int redir)
+ const WManageParams *param, int priority)
{
- if(redir==MANAGE_REDIR_STRICT_YES)
+ if(!MANAGE_PRIORITY_OK(priority, MANAGE_PRIORITY_GROUP))
return NULL;
/* Only catch windows with transient mode set to current here. */
}
+static WRegion *groupcw_managed_disposeroot(WGroupCW *ws, WRegion *reg)
+{
+ WGroupIterTmp tmp;
+ WStacking *st;
+ WRegion *tmpr;
+
+ FOR_ALL_NODES_IN_GROUP(&ws->grp, st, tmp){
+ if(st!=ws->grp.managed_stdisp && st->reg!=reg){
+ return reg;
+ }
+ }
+
+ tmpr=region_disposeroot((WRegion*)ws);
+ return (tmpr!=NULL ? tmpr : reg);
+}
+
+
/*}}}*/
if(st->reg!=NULL){
WFitParams fp;
-
+
+ fp.mode=0;
fp.g=REGION_GEOM(cwg);
sizepolicy(&st->szplcy, st->reg, NULL,
}
+void groupcw_bottom_set(WGroupCW *cwg)
+{
+ region_notify_change((WRegion*)cwg, ioncore_g.notifies.name);
+}
+
+
+/*}}}*/
+
+
+/*{{{ 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;
}
{(DynFun*)region_prepare_manage_transient,
(DynFun*)groupcw_prepare_manage_transient},
+
+ {(DynFun*)region_managed_disposeroot,
+ (DynFun*)groupcw_managed_disposeroot},
{(DynFun*)region_displayname,
(DynFun*)groupcw_displayname},
{region_managed_notify,
groupcw_managed_notify},
+
+ {group_bottom_set,
+ groupcw_bottom_set},
+
+ {(DynFun*)region_rescue_clientwins,
+ (DynFun*)groupcw_rescue_clientwins},
END_DYNFUNTAB
};