]> git.decadent.org.uk Git - ion3.git/blobdiff - ioncore/manage.c
[svn-upgrade] Integrating new upstream version, ion3 (20071109)
[ion3.git] / ioncore / manage.c
index bcc8a5388a394de0b3919b747e6eba04ae160461..69b7711f9f7311e060d0a8c4cd53ece76af9193a 100644 (file)
@@ -319,6 +319,7 @@ DECLSTRUCT(WRescueInfo){
     WRegion *get_rescue;
     bool failed_get;
     bool test;
+    int flags;
 };
 
 
@@ -338,6 +339,43 @@ bool region_rescue_child_clientwins(WRegion *reg, WRescueInfo *info)
 }
 
 
+/* Bah, unsplitissä oikestaan pitäisi tehä non-deep rescue */
+
+bool region_do_rescue_this(WRegion *tosave_, WRescueInfo *info, int ph_flags)
+{
+    WClientWin *cwin=OBJ_CAST(tosave_, WClientWin);
+    WRegion *tosave=NULL;
+    
+    if(cwin!=NULL){
+        if(cwin->flags&CLIENTWIN_UNMAP_RQ)
+            return TRUE;
+        tosave=(WRegion*)cwin;
+    }else if(info->flags&REGION_RESCUE_NODEEP){
+        tosave=tosave_;
+    }else{
+        /* Try to rescue whole groups. */
+        /*tosave=(WRegion*)OBJ_CAST(tosave_, WGroupCW);*/
+    }
+    
+    if(tosave==NULL){
+        return region_rescue_clientwins(tosave_, info);
+    }else if(info->test){
+        return FALSE;
+    }else{
+        int phf=(info->flags&REGION_RESCUE_PHFLAGS_OK ? ph_flags : 0);
+        
+        if(info->ph==NULL){
+            info->ph=region_get_rescue_pholder(info->get_rescue);
+            if(info->ph==NULL){
+                info->failed_get=TRUE;
+                return FALSE;
+            }
+        }
+        return pholder_attach(info->ph, phf, tosave);
+    }
+}
+
+
 bool region_rescue_some_clientwins(WRegion *reg, WRescueInfo *info,
                                    WRegionIterator *iter, void *st)
 {
@@ -351,32 +389,14 @@ bool region_rescue_some_clientwins(WRegion *reg, WRescueInfo *info,
     
     while(TRUE){
         WRegion *tosave=iter(st);
-        WClientWin *cwin;
         
         if(tosave==NULL)
             break;
-        
-        cwin=OBJ_CAST(tosave, WClientWin);
-        
-        if(cwin==NULL){
-            if(!region_rescue_clientwins(tosave, info)){
-                fails++;
-                if(info->failed_get)
-                    break;
-            }
-        }else if(info->test){
+
+        if(!region_do_rescue_this(tosave, info, 0)){
             fails++;
-            break;
-        }else if(!(cwin->flags&CLIENTWIN_UNMAP_RQ)){
-            if(info->ph==NULL){
-                info->ph=region_get_rescue_pholder(info->get_rescue);
-                if(info->ph==NULL){
-                    info->failed_get=TRUE;
-                    break;
-                }
-            }
-            if(!pholder_attach(info->ph, 0, (WRegion*)cwin))
-                fails++;
+            if(info->failed_get)
+                break;
         }
     }
     
@@ -394,19 +414,20 @@ bool region_rescue_clientwins(WRegion *reg, WRescueInfo *info)
 }
 
 
-bool region_rescue(WRegion *reg, WPHolder *ph_param)
+bool region_rescue(WRegion *reg, WPHolder *ph, int flags)
 {
     WRescueInfo info;
     bool ret;
     
-    info.ph=ph_param;
+    info.ph=ph;
+    info.flags=flags;
     info.test=FALSE;
     info.get_rescue=reg;
     info.failed_get=FALSE;
     
     ret=region_rescue_clientwins(reg, &info);
     
-    if(info.ph!=ph_param)
+    if(info.ph!=ph)
         destroy_obj((Obj*)info.ph);
     
     return ret;
@@ -418,6 +439,7 @@ bool region_rescue_needed(WRegion *reg)
     WRescueInfo info;
     
     info.ph=NULL;
+    info.flags=0;
     info.test=TRUE;
     info.get_rescue=reg;
     info.failed_get=FALSE;