X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fmanage.c;fp=ioncore%2Fmanage.c;h=69b7711f9f7311e060d0a8c4cd53ece76af9193a;hp=bcc8a5388a394de0b3919b747e6eba04ae160461;hb=a6561c9679cd701b0d50c3cfd44e4664f7df2b2f;hpb=cd09055902de482a1be019bf4b4efdae64c98d35 diff --git a/ioncore/manage.c b/ioncore/manage.c index bcc8a53..69b7711 100644 --- a/ioncore/manage.c +++ b/ioncore/manage.c @@ -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®ION_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®ION_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;