/*
* ion/ioncore/manage.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 <libtu/objp.h>
if(r==NULL)
return NULL;
-
- return region_prepare_manage(r, cwin, param, MANAGE_REDIR_PREFER_NO);
+
+ if(!region_same_rootwin(r, (WRegion*)cwin))
+ return NULL;
+
+ return region_prepare_manage(r, cwin, param, MANAGE_PRIORITY_NONE);
}
if(ph==NULL){
ph=region_prepare_manage(reg, cwin, param,
- MANAGE_REDIR_PREFER_YES);
+ MANAGE_PRIORITY_NONE);
if(ph==NULL)
destroy_obj((Obj*)reg);
if(fs_scr!=NULL){
WPHolder *fs_ph=region_prepare_manage((WRegion*)fs_scr, cwin, param,
- MANAGE_REDIR_STRICT_NO);
+ MANAGE_PRIORITY_NOREDIR);
if(fs_ph!=NULL){
int swf=(param->switchto ? PHOLDER_ATTACH_SWITCHTO : 0);
if(ph==NULL){
/* Find a placeholder for non-fullscreen state */
ph=region_prepare_manage((WRegion*)scr, cwin, param,
- MANAGE_REDIR_PREFER_YES);
-
+ MANAGE_PRIORITY_NONE);
+
if(try_fullscreen(cwin, scr, param)){
if(pholder_target(ph)!=(WRegion*)region_screen_of((WRegion*)cwin)){
WRegion *grp=region_groupleader_of((WRegion*)cwin);
WPHolder *region_prepare_manage(WRegion *reg, const WClientWin *cwin,
- const WManageParams *param, int redir)
+ const WManageParams *param, int priority)
{
WPHolder *ret=NULL;
CALL_DYN_RET(ret, WPHolder*, region_prepare_manage, reg,
- (reg, cwin, param, redir));
+ (reg, cwin, param, priority));
return ret;
}
WPHolder *region_prepare_manage_default(WRegion *reg, const WClientWin *cwin,
- const WManageParams *param, int redir)
+ const WManageParams *param, int priority)
{
- WRegion *curr;
-
- if(redir==MANAGE_REDIR_STRICT_NO)
- return NULL;
-
- curr=region_current(reg);
+ int cpriority=MANAGE_PRIORITY_SUB(priority, MANAGE_PRIORITY_NONE);
+ WRegion *curr=region_current(reg);
if(curr==NULL)
return NULL;
- return region_prepare_manage(curr, cwin, param, MANAGE_REDIR_PREFER_YES);
+ return region_prepare_manage(curr, cwin, param, cpriority);
}
bool region_manage_clientwin(WRegion *reg, WClientWin *cwin,
- const WManageParams *par, int redir)
+ const WManageParams *par, int priority)
{
bool ret;
- WPHolder *ph=region_prepare_manage(reg, cwin, par, redir);
+ WPHolder *ph=region_prepare_manage(reg, cwin, par, priority);
int swf=(par->switchto ? PHOLDER_ATTACH_SWITCHTO : 0);
if(ph==NULL)
WRegion *get_rescue;
bool failed_get;
bool test;
+ int flags;
};
}
+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)
+{
+ 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{
+ int phf=(info->flags®ION_RESCUE_PHFLAGS_OK ? ph_flags : 0);
+ WPHolder *ph=rescueinfo_pholder(info);
+
+ return (ph==NULL
+ ? FALSE
+ : pholder_attach(info->ph, phf, tosave));
+ }
+}
+
+
bool region_rescue_some_clientwins(WRegion *reg, WRescueInfo *info,
WRegionIterator *iter, void *st)
{
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;
}
}
}
-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;
WRescueInfo info;
info.ph=NULL;
+ info.flags=0;
info.test=TRUE;
info.get_rescue=reg;
info.failed_get=FALSE;