X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fmanage.c;h=9215804123b63c79444ee0fe394016b4b9b8db4f;hp=69b7711f9f7311e060d0a8c4cd53ece76af9193a;hb=e3aec18706513a87eaa7839dfdaf7e0fcd0d8d2a;hpb=a6561c9679cd701b0d50c3cfd44e4664f7df2b2f diff --git a/ioncore/manage.c b/ioncore/manage.c index 69b7711..9215804 100644 --- a/ioncore/manage.c +++ b/ioncore/manage.c @@ -1,7 +1,7 @@ /* * ion/ioncore/manage.c * - * Copyright (c) Tuomo Valkonen 1999-2007. + * Copyright (c) Tuomo Valkonen 1999-2009. * * See the included file LICENSE for details. */ @@ -72,6 +72,9 @@ static WPHolder *try_target(WClientWin *cwin, const WManageParams *param, if(r==NULL) return NULL; + if(!region_same_rootwin(r, (WRegion*)cwin)) + return NULL; + return region_prepare_manage(r, cwin, param, MANAGE_PRIORITY_NONE); } @@ -183,6 +186,7 @@ bool clientwin_do_manage_default(WClientWin *cwin, WPHolder *ph=NULL; int swf=(param->switchto ? PHOLDER_ATTACH_SWITCHTO : 0); bool ok, uq=FALSE; + WRegion *createroot=NULL; /* Find a suitable screen */ scr=clientwin_find_suitable_screen(cwin, param); @@ -223,15 +227,22 @@ bool clientwin_do_manage_default(WClientWin *cwin, return FALSE; /* Not in full-screen mode; use the placeholder to attach. */ - - ok=pholder_attach(ph, swf, (WRegion*)cwin); - + { + WRegionAttachData data; + data.type=REGION_ATTACH_REPARENT; + data.u.reg=(WRegion*)cwin; + + createroot=pholder_do_attach(ph, + swf|PHOLDER_ATTACH_RETURN_CREATEROOT, + &data); + } + destroy_obj((Obj*)ph); - if(uq && ok) - ioncore_unsqueeze((WRegion*)cwin, FALSE); + if(uq && createroot!=NULL) + ioncore_unsqueeze(createroot, FALSE); - return ok; + return (createroot!=NULL); } @@ -339,6 +350,23 @@ bool region_rescue_child_clientwins(WRegion *reg, WRescueInfo *info) } +WPHolder *rescueinfo_pholder(WRescueInfo *info) +{ + if(info->test) + return NULL; + + if(info->ph==NULL){ + info->ph=region_get_rescue_pholder(info->get_rescue); + if(info->ph==NULL){ + info->failed_get=TRUE; + return NULL; + } + } + + return info->ph; +} + + /* Bah, unsplitissä oikestaan pitäisi tehä non-deep rescue */ bool region_do_rescue_this(WRegion *tosave_, WRescueInfo *info, int ph_flags) @@ -359,19 +387,13 @@ bool region_do_rescue_this(WRegion *tosave_, WRescueInfo *info, int ph_flags) 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); + WPHolder *ph=rescueinfo_pholder(info); - 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); + return (ph==NULL + ? FALSE + : pholder_attach(info->ph, phf, tosave)); } }