]> git.decadent.org.uk Git - ion3.git/blob - ioncore/pholder.c
Imported Upstream version 20090110
[ion3.git] / ioncore / pholder.c
1 /*
2  * ion/ioncore/pholder.c
3  *
4  * Copyright (c) Tuomo Valkonen 2005-2009. 
5  *
6  * See the included file LICENSE for details.
7  */
8
9 #include <libtu/objp.h>
10 #include "common.h"
11 #include "attach.h"
12 #include "pholder.h"
13 #include "focus.h"
14
15
16 bool pholder_init(WPHolder *ph)
17 {
18     return TRUE;
19 }
20
21
22 void pholder_deinit(WPHolder *ph)
23 {
24 }
25
26
27 WRegion *pholder_do_attach(WPHolder *ph, int flags,
28                            WRegionAttachData *data)
29
30 {
31     WRegion *ret=NULL;
32     CALL_DYN_RET(ret, WRegion*, pholder_do_attach, ph, (ph, flags, data));
33     return ret;
34 }
35
36
37 bool pholder_attach(WPHolder *ph, int flags, WRegion *reg)
38 {
39     WRegionAttachData data;
40         
41     data.type=REGION_ATTACH_REPARENT;
42     data.u.reg=reg;
43     
44     return (pholder_do_attach(ph, flags, &data)!=NULL);
45 }
46
47
48 bool pholder_attach_mcfgoto(WPHolder *ph, int flags, WRegion *reg)
49 {
50     bool cf=region_may_control_focus(reg);
51     
52     if(!pholder_attach(ph, flags, reg))
53         return FALSE;
54         
55     if(cf)
56         region_goto(reg);
57     
58     return TRUE;
59 }
60
61
62 WRegion *pholder_do_target(WPHolder *ph)
63 {
64     WRegion *ret=NULL;
65     CALL_DYN_RET(ret, WRegion*, pholder_do_target, ph, (ph));
66     return ret;
67 }
68
69
70 WRegion *pholder_target(WPHolder *ph)
71 {
72     return pholder_do_target(ph);
73 }
74
75
76 static bool pholder_do_check_reparent_default(WPHolder *ph, WRegion *reg)
77 {
78     WRegion *target=pholder_do_target(ph);
79     
80     return (target==NULL 
81             ? FALSE
82             : region_ancestor_check(target, reg));
83 }
84
85
86 DYNFUN bool pholder_do_check_reparent(WPHolder *ph, WRegion *reg)
87 {
88     bool ret=FALSE;
89     CALL_DYN_RET(ret, bool, pholder_do_check_reparent, ph, (ph, reg));
90     return ret;
91 }
92
93
94 bool pholder_check_reparent(WPHolder *ph, WRegion *reg)
95 {
96     return pholder_do_check_reparent(ph, reg);
97 }
98     
99
100 bool pholder_do_goto(WPHolder *ph)
101 {
102     bool ret=FALSE;
103     CALL_DYN_RET(ret, bool, pholder_do_goto, ph, (ph));
104     return ret;
105 }
106
107
108 bool pholder_goto(WPHolder *ph)
109 {
110     return pholder_do_goto(ph);
111 }
112
113
114 bool pholder_stale_default(WPHolder *ph)
115 {
116     return (pholder_target(ph)==NULL);
117 }
118
119
120 bool pholder_stale(WPHolder *ph)
121 {
122     bool ret=TRUE;
123     CALL_DYN_RET(ret, bool, pholder_stale, ph, (ph));
124     return ret;
125 }
126
127
128 WPHolder *region_managed_get_pholder(WRegion *reg, WRegion *mgd)
129 {
130     WPHolder *ret=NULL;
131     CALL_DYN_RET(ret, WPHolder*, region_managed_get_pholder, 
132                  reg, (reg, mgd));
133     return ret;
134 }
135
136
137 WPHolder *region_get_rescue_pholder_for(WRegion *reg, WRegion *mgd)
138 {
139     if(OBJ_IS_BEING_DESTROYED(reg) || reg->flags&REGION_CWINS_BEING_RESCUED){
140         return FALSE;
141     }else{
142         WPHolder *ret=NULL;
143     
144         CALL_DYN_RET(ret, WPHolder*, region_get_rescue_pholder_for,
145                      reg, (reg, mgd));
146         return ret;
147     }
148 }
149
150
151 WPHolder *region_get_rescue_pholder(WRegion *reg)
152 {
153     WRegion *mgr;
154     WPHolder *ph=NULL;
155
156     while(1){
157         mgr=region_manager_or_parent(reg);
158         if(mgr==NULL)
159             break;
160         ph=region_get_rescue_pholder_for(mgr, reg);
161         if(ph!=NULL)
162             break;
163         reg=mgr;
164     }
165     
166     return ph;
167 }
168
169
170 WPHolder *pholder_either(WPHolder *a, WPHolder *b)
171 {
172     return (a!=NULL ? a : b);
173 }
174
175
176 static DynFunTab pholder_dynfuntab[]={
177     {(DynFun*)pholder_do_check_reparent, 
178      (DynFun*)pholder_do_check_reparent_default},
179      
180     {(DynFun*)pholder_stale, 
181      (DynFun*)pholder_stale_default},
182
183     END_DYNFUNTAB
184 };
185
186
187 IMPLCLASS(WPHolder, Obj, pholder_deinit, pholder_dynfuntab);
188