]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/group-cw.c
Update cfg_kludge_flash for Flash 10
[ion3.git] / ioncore / group-cw.c
index 0084ee204343d993e811e511470376ab2775f713..f117cf66d84b144a1d01370bf77ec9a43de2359b 100644 (file)
@@ -1,12 +1,9 @@
 /*
  * ion/ioncore/group-cw.c
  *
- * Copyright (c) Tuomo Valkonen 1999-2007
+ * Copyright (c) Tuomo Valkonen 1999-2009
  *
- * 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>
@@ -25,6 +22,8 @@
 #include "names.h"
 #include "framedpholder.h"
 #include "grouppholder.h"
+#include "return.h"
+#include "saveload.h"
 
 
 #define DFLT_SZPLCY SIZEPOLICY_FREE_GLUE__SOUTH
@@ -72,9 +71,9 @@ static WPHolder *groupcw_transient_pholder(WGroupCW *cwg,
 
 
 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. */
@@ -119,6 +118,23 @@ WPHolder *groupcw_prepare_manage_transient(WGroupCW *cwg,
 }
 
 
+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);
+}
+
+
 /*}}}*/
 
 
@@ -149,7 +165,8 @@ void groupcw_toggle_transients_pos(WGroupCW *cwg)
         
         if(st->reg!=NULL){
             WFitParams fp;
-
+            
+            fp.mode=0;
             fp.g=REGION_GEOM(cwg);
             
             sizepolicy(&st->szplcy, st->reg, NULL, 
@@ -180,12 +197,60 @@ void groupcw_managed_notify(WGroupCW *cwg, WRegion *reg, WRegionNotify how)
         /* Title has changed */
         region_notify_change((WRegion*)cwg, how);
     }
+    
+    group_managed_notify(&cwg->grp, reg, how);
+}
+
+
+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 */
 
 
@@ -196,8 +261,6 @@ bool groupcw_init(WGroupCW *cwg, WWindow *parent, const WFitParams *fp)
     if(!group_init(&(cwg->grp), parent, fp))
         return FALSE;
     
-    cwg->grp.bottom_last_close=TRUE;
-
     region_add_bindmap((WRegion*)cwg, ioncore_groupcw_bindmap);
     
     return TRUE;
@@ -218,34 +281,29 @@ void groupcw_deinit(WGroupCW *cwg)
 
 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;
 }
 
 
@@ -274,12 +332,21 @@ static DynFunTab groupcw_dynfuntab[]={
 
     {(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
 };