Remove/mark some unused functions and parameters
[notion.git] / ioncore / grouppholder.c
blobb38584ef1ea659be053a95e1d979de0f908adecc
1 /*
2 * ion/ioncore/grouppholder.c
4 * Copyright (c) Tuomo Valkonen 2005-2009.
6 * See the included file LICENSE for details.
7 */
9 #include <libtu/objp.h>
10 #include <libtu/obj.h>
11 #include <libtu/pointer.h>
12 #include <libmainloop/defer.h>
14 #include <ioncore/common.h>
15 #include "group.h"
16 #include "group-cw.h"
17 #include "grouppholder.h"
20 /*{{{ Primitives */
23 void grouppholder_do_link(WGroupPHolder *ph, WGroup *group, WRegion *stack_above)
25 ph->group=group;
27 if(group!=NULL){
28 LINK_ITEM_FIRST(group->phs, ph, next, prev);
29 }else{
30 /* This seems very crucial for detached pholders... */
31 ph->next=NULL;
32 ph->prev=ph;
35 /* We must move stack_above pointer into a Watch. */
36 if(stack_above!=NULL)
37 watch_setup(&(ph->stack_above_watch), (Obj*)stack_above, NULL);
41 static WGroupPHolder *get_head(WGroupPHolder *ph)
43 while(1){
44 /* ph->prev==NULL should not happen.. */
45 if(ph->prev==NULL || ph->prev->next==NULL)
46 break;
47 ph=ph->prev;
50 return ph;
54 void grouppholder_do_unlink(WGroupPHolder *ph)
56 WGroup *group=ph->group;
58 watch_reset(&(ph->stack_above_watch));
60 if(ph->recreate_pholder!=NULL){
61 if(ph->next!=NULL){
62 ph->next->recreate_pholder=ph->recreate_pholder;
63 }else{
64 /* It might be in use in attach chain! So defer. */
65 mainloop_defer_destroy((Obj*)ph->recreate_pholder);
67 ph->recreate_pholder=NULL;
70 if(group!=NULL){
71 UNLINK_ITEM(group->phs, ph, next, prev);
72 }else if(ph->prev!=NULL){
73 WGroupPHolder *next=ph->next;
75 ph->prev->next=next;
77 if(next==NULL){
78 next=get_head(ph);
79 assert(next->prev==ph);
81 next->prev=ph->prev;
82 }else{
83 /* ph should not be on a list, if prev pointer is NULL (whereas
84 * next alone can be NULL in our semi-doubly-linked lists).
86 assert(ph->next==NULL);
89 ph->group=NULL;
90 ph->next=NULL;
91 ph->prev=NULL;
95 /*}}}*/
98 /*{{{ Init/deinit */
100 static WGroupAttachParams dummy_param=GROUPATTACHPARAMS_INIT;
103 bool grouppholder_init(WGroupPHolder *ph, WGroup *ws,
104 const WStacking *st,
105 const WGroupAttachParams *param)
107 WRegion *stack_above=NULL;
109 pholder_init(&(ph->ph));
111 watch_init(&(ph->stack_above_watch));
112 ph->next=NULL;
113 ph->prev=NULL;
114 ph->group=NULL;
115 ph->recreate_pholder=NULL;
116 ph->param=(param==NULL ? dummy_param : *param);
118 if(st!=NULL){
119 /* TODO? Just link to the stacking structure to remember
120 * stacking order?
123 ph->param.szplcy_set=TRUE;
124 ph->param.szplcy=st->szplcy;
125 ph->param.level_set=TRUE;
126 ph->param.level=st->level;
128 if(st->reg!=NULL){
129 ph->param.geom_set=TRUE;
130 ph->param.geom=REGION_GEOM(st->reg);
133 if(st->above!=NULL && st->above->reg!=NULL)
134 ph->param.stack_above=st->above->reg;
136 ph->param.bottom=(st==ws->bottom);
139 ph->param.switchto_set=FALSE;
141 stack_above=ph->param.stack_above;
142 ph->param.stack_above=NULL;
144 grouppholder_do_link(ph, ws, stack_above);
146 return TRUE;
150 WGroupPHolder *create_grouppholder(WGroup *ws,
151 const WStacking *st,
152 const WGroupAttachParams *param)
154 CREATEOBJ_IMPL(WGroupPHolder, grouppholder, (p, ws, st, param));
158 void grouppholder_deinit(WGroupPHolder *ph)
160 grouppholder_do_unlink(ph);
162 pholder_deinit(&(ph->ph));
166 /*}}}*/
169 /*{{{ Dynfuns */
172 static WPHolder *get_recreate_ph(WGroupPHolder *ph)
174 return get_head(ph)->recreate_pholder;
178 typedef struct{
179 WGroupPHolder *ph, *ph_head;
180 WRegionAttachData *data;
181 WRegion *reg_ret;
182 } RP;
185 static WRegion *recreate_handler(WWindow *par,
186 const WFitParams *fp,
187 void *rp_)
189 WGroupPHolder *phtmp;
190 RP *rp=(RP*)rp_;
191 WGroup *grp;
193 grp=(WGroup*)create_groupcw(par, fp);
195 if(grp==NULL)
196 return NULL;
198 rp->ph->param.whatever=(fp->mode&REGION_FIT_WHATEVER ? 1 : 0);
200 rp->reg_ret=group_do_attach(grp, &rp->ph->param, rp->data);
202 rp->ph->param.whatever=0;
204 if(rp->reg_ret==NULL){
205 destroy_obj((Obj*)grp);
206 return NULL;
207 }else{
208 grp->phs=rp->ph_head;
210 for(phtmp=grp->phs; phtmp!=NULL; phtmp=phtmp->next)
211 phtmp->group=grp;
214 if(fp->mode&REGION_FIT_WHATEVER)
215 REGION_GEOM(grp)=REGION_GEOM(rp->reg_ret);
217 return (WRegion*)grp;
222 static WRegion *grouppholder_attach_recreate(WGroupPHolder *ph, int flags,
223 WRegionAttachData *data)
225 WRegionAttachData data2;
226 WPHolder *rph;
227 WRegion *res;
228 RP rp;
230 rp.ph_head=get_head(ph);
232 assert(rp.ph_head!=NULL);
234 rph=rp.ph_head->recreate_pholder;
236 if(rph==NULL)
237 return NULL;
239 rp.ph=ph;
240 rp.data=data;
241 rp.reg_ret=NULL;
243 data2.type=REGION_ATTACH_NEW;
244 data2.u.n.fn=recreate_handler;
245 data2.u.n.param=&rp;
247 res=pholder_do_attach(rph, flags, &data2);
249 if(res!=NULL){
250 rp.ph_head->recreate_pholder=NULL;
251 /* It might be in use in attach chain! So defer. */
252 mainloop_defer_destroy((Obj*)rph);
255 return (flags&PHOLDER_ATTACH_RETURN_CREATEROOT
256 ? (WRegion*)res
257 : rp.reg_ret);
261 WRegion *grouppholder_do_attach(WGroupPHolder *ph, int flags,
262 WRegionAttachData *data)
264 WGroup *ws=ph->group;
265 WRegion *reg;
267 if(ws==NULL)
268 return grouppholder_attach_recreate(ph, flags, data);
270 ph->param.switchto_set=1;
271 ph->param.switchto=(flags&PHOLDER_ATTACH_SWITCHTO ? 1 : 0);
273 /* Get stack_above from Watch. */
274 ph->param.stack_above=(WRegion*)ph->stack_above_watch.obj;
276 reg=group_do_attach(ws, &ph->param, data);
278 ph->param.stack_above=NULL;
280 return reg;
284 bool grouppholder_do_goto(WGroupPHolder *ph)
286 return (ph->group!=NULL
287 ? region_goto((WRegion*)ph->group)
288 : (ph->recreate_pholder!=NULL
289 ? pholder_do_goto(ph->recreate_pholder)
290 : FALSE));
294 WRegion *grouppholder_do_target(WGroupPHolder *ph)
296 return (ph->group!=NULL
297 ? (WRegion*)ph->group
298 : (ph->recreate_pholder!=NULL
299 ? pholder_do_target(ph->recreate_pholder)
300 : NULL));
304 /*}}}*/
307 /*{{{ WGroup stuff */
310 WGroupPHolder *group_managed_get_pholder(WGroup *ws, WRegion *mgd)
312 WStacking *st=group_find_stacking(ws, mgd);
314 if(mgd==NULL)
315 return NULL;
316 else
317 return create_grouppholder(ws, st, NULL);
321 /*}}}*/
324 /*{{{ Class information */
327 static DynFunTab grouppholder_dynfuntab[]={
328 {(DynFun*)pholder_do_attach,
329 (DynFun*)grouppholder_do_attach},
331 {(DynFun*)pholder_do_goto,
332 (DynFun*)grouppholder_do_goto},
334 {(DynFun*)pholder_do_target,
335 (DynFun*)grouppholder_do_target},
337 END_DYNFUNTAB
340 IMPLCLASS(WGroupPHolder, WPHolder, grouppholder_deinit,
341 grouppholder_dynfuntab);
344 /*}}}*/