2 * ion/ioncore/pholder.c
4 * Copyright (c) Tuomo Valkonen 2005-2006.
6 * Ion is free software; you can redistribute it and/or modify it under
7 * the terms of the GNU Lesser General Public License as published by
8 * the Free Software Foundation; either version 2.1 of the License, or
9 * (at your option) any later version.
12 #include <libtu/objp.h>
18 bool pholder_init(WPHolder *ph)
25 void pholder_deinit(WPHolder *ph)
27 if(ph->redirect!=NULL)
28 destroy_obj((Obj*)ph->redirect);
32 WRegion *pholder_do_attach(WPHolder *ph, int flags,
33 WRegionAttachData *data)
37 CALL_DYN_RET(ret, WRegion*, pholder_do_attach, ph, (ph, flags, data));
42 static WRegion *add_fn_reparent(WWindow *par, const WFitParams *fp,
45 if(!region_fitrep(reg, par, fp)){
46 warn(TR("Unable to reparent."));
49 region_detach_manager(reg);
54 WRegion *pholder_attach_(WPHolder *ph, int flags, WRegionAttachData *data)
56 if(ph->redirect!=NULL)
57 return pholder_attach_(ph->redirect, flags, data);
59 return pholder_do_attach(ph, flags, data);
63 bool pholder_attach(WPHolder *ph, int flags, WRegion *reg)
65 WRegionAttachData data;
67 data.type=REGION_ATTACH_REPARENT;
70 return (pholder_attach_(ph, flags, &data)!=NULL);
74 WRegion *pholder_do_target(WPHolder *ph)
77 CALL_DYN_RET(ret, WRegion*, pholder_do_target, ph, (ph));
82 WRegion *pholder_target(WPHolder *ph)
84 if(ph->redirect!=NULL)
85 return pholder_target(ph->redirect);
87 return pholder_do_target(ph);
91 static bool pholder_do_check_reparent_default(WPHolder *ph, WRegion *reg)
93 WRegion *target=pholder_do_target(ph);
98 return region_attach_reparent_check(target, reg);
102 DYNFUN bool pholder_do_check_reparent(WPHolder *ph, WRegion *reg)
105 CALL_DYN_RET(ret, bool, pholder_do_check_reparent, ph, (ph, reg));
110 bool pholder_check_reparent(WPHolder *ph, WRegion *reg)
112 if(ph->redirect!=NULL)
113 return pholder_check_reparent(ph->redirect, reg);
115 return pholder_do_check_reparent(ph, reg);
119 bool pholder_do_goto(WPHolder *ph)
122 CALL_DYN_RET(ret, bool, pholder_do_goto, ph, (ph));
127 bool pholder_goto(WPHolder *ph)
129 if(ph->redirect!=NULL)
130 return pholder_goto(ph->redirect);
132 return pholder_do_goto(ph);
137 bool pholder_redirect(WPHolder *ph, WRegion *old_target)
139 WPHolder *ph2=region_get_rescue_pholder(old_target);
144 if(ph->redirect!=NULL)
145 destroy_obj((Obj*)ph->redirect);
153 WPHolder *region_managed_get_pholder(WRegion *reg, WRegion *mgd)
156 CALL_DYN_RET(ret, WPHolder*, region_managed_get_pholder,
162 WPHolder *region_get_rescue_pholder_for(WRegion *reg, WRegion *mgd)
164 if(OBJ_IS_BEING_DESTROYED(reg) || reg->flags®ION_CWINS_BEING_RESCUED){
169 CALL_DYN_RET(ret, WPHolder*, region_get_rescue_pholder_for,
176 WPHolder *region_get_rescue_pholder(WRegion *reg)
182 mgr=region_manager_or_parent(reg);
185 ph=region_get_rescue_pholder_for(mgr, reg);
195 WPHolder *pholder_either(WPHolder *a, WPHolder *b)
197 return (a!=NULL ? a : b);
201 static DynFunTab pholder_dynfuntab[]={
202 {(DynFun*)pholder_do_check_reparent,
203 (DynFun*)pholder_do_check_reparent_default},
209 IMPLCLASS(WPHolder, Obj, pholder_deinit, pholder_dynfuntab);