2 * ion/ioncore/group-cw.c
4 * Copyright (c) Tuomo Valkonen 1999-2007.
6 * See the included file LICENSE for details.
11 #include <libtu/objp.h>
12 #include <libmainloop/defer.h>
16 #include "clientwin.h"
23 #include "framedpholder.h"
24 #include "grouppholder.h"
27 #define DFLT_SZPLCY SIZEPOLICY_FREE_GLUE__SOUTH
30 /*{{{ Add/remove managed */
33 static WPHolder *groupcw_transient_pholder(WGroupCW *cwg,
34 const WClientWin *cwin,
35 const WManageParams *mp)
37 WGroupAttachParams param=GROUPATTACHPARAMS_INIT;
38 WFramedParam fp=FRAMEDPARAM_INIT;
42 param.level=STACKING_LEVEL_MODAL1;
45 param.szplcy=cwg->transient_szplcy;
50 param.geom_weak_set=1;
51 param.geom_weak=REGION_RQGEOM_WEAK_ALL;
53 if(!ioncore_g.framed_transients){
57 return (WPHolder*)create_grouppholder(&cwg->grp, NULL, ¶m);
59 fp.inner_geom_gravity_set=1;
60 fp.inner_geom=mp->geom;
61 fp.gravity=ForgetGravity;
62 fp.mode=FRAME_MODE_TRANSIENT;
64 ph=(WPHolder*)create_grouppholder(&cwg->grp, NULL, ¶m);
66 return pholder_either((WPHolder*)create_framedpholder(ph, &fp), ph);
71 WPHolder *groupcw_prepare_manage(WGroupCW *cwg, const WClientWin *cwin,
72 const WManageParams *param, int priority)
74 if(!MANAGE_PRIORITY_OK(priority, MANAGE_PRIORITY_GROUP))
77 /* Only catch windows with transient mode set to current here. */
78 if(clientwin_get_transient_mode(cwin)!=TRANSIENT_MODE_CURRENT)
81 return groupcw_transient_pholder(cwg, cwin, param);
85 static bool groupcw_should_manage_transient(WGroupCW *cwg,
90 if(group_find_stacking(&cwg->grp, (WRegion*)tfor))
93 mgr=REGION_MANAGER(tfor);
95 if(mgr!=NULL && ioncore_g.framed_transients && OBJ_IS(mgr, WFrame))
96 return (group_find_stacking(&cwg->grp, mgr)!=NULL);
102 WPHolder *groupcw_prepare_manage_transient(WGroupCW *cwg,
103 const WClientWin *transient,
104 const WManageParams *param,
107 WPHolder *ph=region_prepare_manage_transient_default((WRegion*)cwg,
112 if(ph==NULL && groupcw_should_manage_transient(cwg, param->tfor))
113 ph=groupcw_transient_pholder(cwg, transient, param);
126 * Toggle transients managed by \var{cwin} between top/bottom
130 void groupcw_toggle_transients_pos(WGroupCW *cwg)
135 if((cwg->transient_szplcy&SIZEPOLICY_VERT_MASK)==SIZEPOLICY_VERT_TOP){
136 cwg->transient_szplcy&=~SIZEPOLICY_VERT_MASK;
137 cwg->transient_szplcy|=SIZEPOLICY_VERT_BOTTOM;
139 cwg->transient_szplcy&=~SIZEPOLICY_VERT_MASK;
140 cwg->transient_szplcy|=SIZEPOLICY_VERT_TOP;
143 FOR_ALL_NODES_IN_GROUP(&cwg->grp, st, tmp){
144 st->szplcy&=~SIZEPOLICY_VERT_MASK;
145 st->szplcy|=(cwg->transient_szplcy&SIZEPOLICY_VERT_MASK);
150 fp.g=REGION_GEOM(cwg);
152 sizepolicy(&st->szplcy, st->reg, NULL,
153 REGION_RQGEOM_WEAK_ALL, &fp);
154 region_fitrep(st->reg, NULL, &fp);
160 const char *groupcw_displayname(WGroupCW *cwg)
162 const char *name=NULL;
164 if(cwg->grp.bottom!=NULL && cwg->grp.bottom->reg!=NULL)
165 name=region_name(cwg->grp.bottom->reg);
168 name=region_name((WRegion*)cwg);
174 void groupcw_managed_notify(WGroupCW *cwg, WRegion *reg, WRegionNotify how)
176 if(group_bottom(&cwg->grp)==reg && how==ioncore_g.notifies.name){
177 /* Title has changed */
178 region_notify_change((WRegion*)cwg, how);
181 group_managed_notify(&cwg->grp, reg, how);
188 /*{{{ WGroupCW class */
191 bool groupcw_init(WGroupCW *cwg, WWindow *parent, const WFitParams *fp)
193 cwg->transient_szplcy=DFLT_SZPLCY;
195 if(!group_init(&(cwg->grp), parent, fp))
198 region_add_bindmap((WRegion*)cwg, ioncore_groupcw_bindmap);
204 WGroupCW *create_groupcw(WWindow *parent, const WFitParams *fp)
206 CREATEOBJ_IMPL(WGroupCW, groupcw, (p, parent, fp));
210 void groupcw_deinit(WGroupCW *cwg)
212 group_deinit(&(cwg->grp));
216 WRegion *groupcw_load(WWindow *par, const WFitParams *fp, ExtlTab tab)
219 ExtlTab substab, subtab;
222 ws=create_groupcw(par, fp);
227 if(!extl_table_gets_t(tab, "managed", &substab))
230 n=extl_table_get_n(substab);
232 if(extl_table_geti_t(substab, i, &subtab)){
233 group_attach_new(&ws->grp, subtab);
234 extl_unref_table(subtab);
238 extl_unref_table(substab);
240 if(ws->grp.managed_list==NULL){
241 destroy_obj((Obj*)ws);
249 static DynFunTab groupcw_dynfuntab[]={
250 {(DynFun*)region_prepare_manage,
251 (DynFun*)groupcw_prepare_manage},
253 {(DynFun*)region_prepare_manage_transient,
254 (DynFun*)groupcw_prepare_manage_transient},
257 {(DynFun*)region_handle_drop,
258 (DynFun*)groupcw_handle_drop},
260 {(DynFun*)group_do_add_managed,
261 (DynFun*)groupcw_do_add_managed},
265 {(DynFun*)region_get_rescue_pholder_for,
266 (DynFun*)groupcw_get_rescue_pholder_for},
269 {(DynFun*)region_prepare_manage,
270 (DynFun*)groupcw_prepare_manage},
272 {(DynFun*)region_prepare_manage_transient,
273 (DynFun*)groupcw_prepare_manage_transient},
275 {(DynFun*)region_displayname,
276 (DynFun*)groupcw_displayname},
278 {region_managed_notify,
279 groupcw_managed_notify},
286 IMPLCLASS(WGroupCW, WGroup, groupcw_deinit, groupcw_dynfuntab);