2 * ion/ioncore/pholder.c
4 * Copyright (c) Tuomo Valkonen 2005-2007.
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>
19 bool pholder_init(WPHolder *ph)
26 void pholder_deinit(WPHolder *ph)
28 if(ph->redirect!=NULL)
29 destroy_obj((Obj*)ph->redirect);
33 WRegion *pholder_do_attach(WPHolder *ph, int flags,
34 WRegionAttachData *data)
38 CALL_DYN_RET(ret, WRegion*, pholder_do_attach, ph, (ph, flags, data));
43 static WRegion *add_fn_reparent(WWindow *par, const WFitParams *fp,
46 if(!region_fitrep(reg, par, fp)){
47 warn(TR("Unable to reparent."));
50 region_detach_manager(reg);
55 WRegion *pholder_attach_(WPHolder *ph, int flags, WRegionAttachData *data)
57 WPHolder *root=pholder_root(ph);
59 /* Use the root, so that extra containers are not added from
65 : pholder_do_attach(root, flags, data));
69 bool pholder_attach(WPHolder *ph, int flags, WRegion *reg)
71 WRegionAttachData data;
73 data.type=REGION_ATTACH_REPARENT;
76 return (pholder_attach_(ph, flags, &data)!=NULL);
80 bool pholder_attach_mcfgoto(WPHolder *ph, int flags, WRegion *reg)
82 bool cf=region_may_control_focus(reg);
84 if(!pholder_attach(ph, flags, reg))
94 WRegion *pholder_do_target(WPHolder *ph)
97 CALL_DYN_RET(ret, WRegion*, pholder_do_target, ph, (ph));
102 WRegion *pholder_target(WPHolder *ph)
104 return (ph->redirect!=NULL
105 ? pholder_target(ph->redirect)
106 : pholder_do_target(ph));
110 static bool pholder_do_check_reparent_default(WPHolder *ph, WRegion *reg)
112 WRegion *target=pholder_do_target(ph);
117 return region_attach_reparent_check(target, reg);
121 DYNFUN bool pholder_do_check_reparent(WPHolder *ph, WRegion *reg)
124 CALL_DYN_RET(ret, bool, pholder_do_check_reparent, ph, (ph, reg));
129 bool pholder_check_reparent(WPHolder *ph, WRegion *reg)
131 if(ph->redirect!=NULL)
132 return pholder_check_reparent(ph->redirect, reg);
134 return pholder_do_check_reparent(ph, reg);
138 bool pholder_do_goto(WPHolder *ph)
141 CALL_DYN_RET(ret, bool, pholder_do_goto, ph, (ph));
146 bool pholder_goto(WPHolder *ph)
148 return (ph->redirect!=NULL
149 ? pholder_goto(ph->redirect)
150 : pholder_do_goto(ph));
154 WPHolder *pholder_do_root_default(WPHolder *ph)
160 WPHolder *pholder_do_root(WPHolder *ph)
163 CALL_DYN_RET(ret, WPHolder*, pholder_do_root, ph, (ph));
168 WPHolder *pholder_root(WPHolder *ph)
170 return (ph->redirect!=NULL
171 ? pholder_root(ph->redirect)
172 : pholder_do_root(ph));
176 bool pholder_stale(WPHolder *ph)
178 return (pholder_root(ph)!=ph);
182 bool pholder_redirect(WPHolder *ph, WRegion *old_target)
184 WPHolder *ph2=region_get_rescue_pholder(old_target);
189 if(ph->redirect!=NULL)
190 destroy_obj((Obj*)ph->redirect);
198 WPHolder *region_managed_get_pholder(WRegion *reg, WRegion *mgd)
201 CALL_DYN_RET(ret, WPHolder*, region_managed_get_pholder,
207 WPHolder *region_get_rescue_pholder_for(WRegion *reg, WRegion *mgd)
209 if(OBJ_IS_BEING_DESTROYED(reg) || reg->flags®ION_CWINS_BEING_RESCUED){
214 CALL_DYN_RET(ret, WPHolder*, region_get_rescue_pholder_for,
221 WPHolder *region_get_rescue_pholder(WRegion *reg)
227 mgr=region_manager_or_parent(reg);
230 ph=region_get_rescue_pholder_for(mgr, reg);
240 WPHolder *pholder_either(WPHolder *a, WPHolder *b)
242 return (a!=NULL ? a : b);
246 static DynFunTab pholder_dynfuntab[]={
247 {(DynFun*)pholder_do_check_reparent,
248 (DynFun*)pholder_do_check_reparent_default},
250 {(DynFun*)pholder_do_root,
251 (DynFun*)pholder_do_root_default},
257 IMPLCLASS(WPHolder, Obj, pholder_deinit, pholder_dynfuntab);