]> git.decadent.org.uk Git - ion3.git/blob - ioncore/pholder.c
[svn-inject] Installing original source of ion3
[ion3.git] / ioncore / pholder.c
1 /*
2  * ion/ioncore/pholder.c
3  *
4  * Copyright (c) Tuomo Valkonen 2005-2006. 
5  *
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.
10  */
11
12 #include <libtu/objp.h>
13 #include "common.h"
14 #include "attach.h"
15 #include "pholder.h"
16
17
18 bool pholder_init(WPHolder *ph)
19 {
20     ph->redirect=NULL;
21     return TRUE;
22 }
23
24
25 void pholder_deinit(WPHolder *ph)
26 {
27     if(ph->redirect!=NULL)
28         destroy_obj((Obj*)ph->redirect);
29 }
30
31
32 WRegion *pholder_do_attach(WPHolder *ph, int flags,
33                            WRegionAttachData *data)
34
35 {
36     WRegion *ret=NULL;
37     CALL_DYN_RET(ret, WRegion*, pholder_do_attach, ph, (ph, flags, data));
38     return ret;
39 }
40
41
42 static WRegion *add_fn_reparent(WWindow *par, const WFitParams *fp, 
43                                 WRegion *reg)
44 {
45     if(!region_fitrep(reg, par, fp)){
46         warn(TR("Unable to reparent."));
47         return NULL;
48     }
49     region_detach_manager(reg);
50     return reg;
51 }
52
53
54 WRegion *pholder_attach_(WPHolder *ph, int flags, WRegionAttachData *data)
55 {
56     if(ph->redirect!=NULL)
57         return pholder_attach_(ph->redirect, flags, data);
58     else
59         return pholder_do_attach(ph, flags, data);
60 }
61
62
63 bool pholder_attach(WPHolder *ph, int flags, WRegion *reg)
64 {
65     WRegionAttachData data;
66         
67     data.type=REGION_ATTACH_REPARENT;
68     data.u.reg=reg;
69     
70     return (pholder_attach_(ph, flags, &data)!=NULL);
71 }
72
73
74 WRegion *pholder_do_target(WPHolder *ph)
75 {
76     WRegion *ret=NULL;
77     CALL_DYN_RET(ret, WRegion*, pholder_do_target, ph, (ph));
78     return ret;
79 }
80
81
82 WRegion *pholder_target(WPHolder *ph)
83 {
84     if(ph->redirect!=NULL)
85         return pholder_target(ph->redirect);
86     else
87         return pholder_do_target(ph);
88 }
89
90
91 static bool pholder_do_check_reparent_default(WPHolder *ph, WRegion *reg)
92 {
93     WRegion *target=pholder_do_target(ph);
94     
95     if(target==NULL)
96         return FALSE;
97     else
98         return region_attach_reparent_check(target, reg);
99 }
100
101
102 DYNFUN bool pholder_do_check_reparent(WPHolder *ph, WRegion *reg)
103 {
104     bool ret=FALSE;
105     CALL_DYN_RET(ret, bool, pholder_do_check_reparent, ph, (ph, reg));
106     return ret;
107 }
108
109
110 bool pholder_check_reparent(WPHolder *ph, WRegion *reg)
111 {
112     if(ph->redirect!=NULL)
113         return pholder_check_reparent(ph->redirect, reg);
114     else
115         return pholder_do_check_reparent(ph, reg);
116 }
117     
118
119 bool pholder_do_goto(WPHolder *ph)
120 {
121     bool ret=FALSE;
122     CALL_DYN_RET(ret, bool, pholder_do_goto, ph, (ph));
123     return ret;
124 }
125
126
127 bool pholder_goto(WPHolder *ph)
128 {
129     if(ph->redirect!=NULL)
130         return pholder_goto(ph->redirect);
131     else
132         return pholder_do_goto(ph);
133 }
134
135
136
137 bool pholder_redirect(WPHolder *ph, WRegion *old_target)
138 {
139     WPHolder *ph2=region_get_rescue_pholder(old_target);
140     
141     if(ph2==NULL)
142         return FALSE;
143     
144     if(ph->redirect!=NULL)
145         destroy_obj((Obj*)ph->redirect);
146
147     ph->redirect=ph2;
148     
149     return TRUE;
150 }
151
152
153 WPHolder *region_managed_get_pholder(WRegion *reg, WRegion *mgd)
154 {
155     WPHolder *ret=NULL;
156     CALL_DYN_RET(ret, WPHolder*, region_managed_get_pholder, 
157                  reg, (reg, mgd));
158     return ret;
159 }
160
161
162 WPHolder *region_get_rescue_pholder_for(WRegion *reg, WRegion *mgd)
163 {
164     if(OBJ_IS_BEING_DESTROYED(reg) || reg->flags&REGION_CWINS_BEING_RESCUED){
165         return FALSE;
166     }else{
167         WPHolder *ret=NULL;
168     
169         CALL_DYN_RET(ret, WPHolder*, region_get_rescue_pholder_for,
170                      reg, (reg, mgd));
171         return ret;
172     }
173 }
174
175
176 WPHolder *region_get_rescue_pholder(WRegion *reg)
177 {
178     WRegion *mgr;
179     WPHolder *ph=NULL;
180
181     while(1){
182         mgr=region_manager_or_parent(reg);
183         if(mgr==NULL)
184             break;
185         ph=region_get_rescue_pholder_for(mgr, reg);
186         if(ph!=NULL)
187             break;
188         reg=mgr;
189     }
190     
191     return ph;
192 }
193
194
195 WPHolder *pholder_either(WPHolder *a, WPHolder *b)
196 {
197     return (a!=NULL ? a : b);
198 }
199
200
201 static DynFunTab pholder_dynfuntab[]={
202     {(DynFun*)pholder_do_check_reparent, 
203      (DynFun*)pholder_do_check_reparent_default},
204
205     END_DYNFUNTAB
206 };
207
208
209 IMPLCLASS(WPHolder, Obj, pholder_deinit, pholder_dynfuntab);
210