2 * ion/ioncore/pholder.c
4 * Copyright (c) Tuomo Valkonen 2005-2007.
6 * See the included file LICENSE for details.
9 #include <libtu/objp.h>
16 bool pholder_init(WPHolder *ph)
23 void pholder_deinit(WPHolder *ph)
25 if(ph->redirect!=NULL)
26 destroy_obj((Obj*)ph->redirect);
30 WRegion *pholder_do_attach(WPHolder *ph, int flags,
31 WRegionAttachData *data)
35 CALL_DYN_RET(ret, WRegion*, pholder_do_attach, ph, (ph, flags, data));
40 WRegion *pholder_attach_(WPHolder *ph, int flags, WRegionAttachData *data)
42 WPHolder *root=pholder_root(ph);
44 /* Use the root, so that extra containers are not added from
50 : pholder_do_attach(root, flags, data));
54 bool pholder_attach(WPHolder *ph, int flags, WRegion *reg)
56 WRegionAttachData data;
58 data.type=REGION_ATTACH_REPARENT;
61 return (pholder_attach_(ph, flags, &data)!=NULL);
65 bool pholder_attach_mcfgoto(WPHolder *ph, int flags, WRegion *reg)
67 bool cf=region_may_control_focus(reg);
69 if(!pholder_attach(ph, flags, reg))
79 WRegion *pholder_do_target(WPHolder *ph)
82 CALL_DYN_RET(ret, WRegion*, pholder_do_target, ph, (ph));
87 WRegion *pholder_target(WPHolder *ph)
89 return (ph->redirect!=NULL
90 ? pholder_target(ph->redirect)
91 : pholder_do_target(ph));
95 static bool pholder_do_check_reparent_default(WPHolder *ph, WRegion *reg)
97 WRegion *target=pholder_do_target(ph);
101 : region_ancestor_check(target, reg));
105 DYNFUN bool pholder_do_check_reparent(WPHolder *ph, WRegion *reg)
108 CALL_DYN_RET(ret, bool, pholder_do_check_reparent, ph, (ph, reg));
113 bool pholder_check_reparent(WPHolder *ph, WRegion *reg)
115 if(ph->redirect!=NULL)
116 return pholder_check_reparent(ph->redirect, reg);
118 return pholder_do_check_reparent(ph, reg);
122 bool pholder_do_goto(WPHolder *ph)
125 CALL_DYN_RET(ret, bool, pholder_do_goto, ph, (ph));
130 bool pholder_goto(WPHolder *ph)
132 return (ph->redirect!=NULL
133 ? pholder_goto(ph->redirect)
134 : pholder_do_goto(ph));
138 WPHolder *pholder_do_root_default(WPHolder *ph)
144 WPHolder *pholder_do_root(WPHolder *ph)
147 CALL_DYN_RET(ret, WPHolder*, pholder_do_root, ph, (ph));
152 WPHolder *pholder_root(WPHolder *ph)
154 return (ph->redirect!=NULL
155 ? pholder_root(ph->redirect)
156 : pholder_do_root(ph));
160 bool pholder_stale(WPHolder *ph)
162 return (pholder_root(ph)!=ph);
166 bool pholder_redirect(WPHolder *ph, WRegion *old_target)
168 WPHolder *ph2=region_get_rescue_pholder(old_target);
173 if(ph->redirect!=NULL)
174 destroy_obj((Obj*)ph->redirect);
182 WPHolder *region_managed_get_pholder(WRegion *reg, WRegion *mgd)
185 CALL_DYN_RET(ret, WPHolder*, region_managed_get_pholder,
191 WPHolder *region_get_rescue_pholder_for(WRegion *reg, WRegion *mgd)
193 if(OBJ_IS_BEING_DESTROYED(reg) || reg->flags®ION_CWINS_BEING_RESCUED){
198 CALL_DYN_RET(ret, WPHolder*, region_get_rescue_pholder_for,
205 WPHolder *region_get_rescue_pholder(WRegion *reg)
211 mgr=region_manager_or_parent(reg);
214 ph=region_get_rescue_pholder_for(mgr, reg);
224 WPHolder *pholder_either(WPHolder *a, WPHolder *b)
226 return (a!=NULL ? a : b);
230 static DynFunTab pholder_dynfuntab[]={
231 {(DynFun*)pholder_do_check_reparent,
232 (DynFun*)pholder_do_check_reparent_default},
234 {(DynFun*)pholder_do_root,
235 (DynFun*)pholder_do_root_default},
241 IMPLCLASS(WPHolder, Obj, pholder_deinit, pholder_dynfuntab);