/*
* ion/ioncore/mplex.c
*
- * Copyright (c) Tuomo Valkonen 1999-2006.
+ * Copyright (c) Tuomo Valkonen 1999-2007.
*
* Ion is free software; you can redistribute it and/or modify it under
* the terms of the GNU Lesser General Public License as published by
/*{{{ Destroy/create mplex */
-bool mplex_do_init(WMPlex *mplex, WWindow *parent, Window win,
- const WFitParams *fp, bool create)
+bool mplex_do_init(WMPlex *mplex, WWindow *parent,
+ const WFitParams *fp, Window win)
{
mplex->flags=0;
mplex->stdispinfo.pos=MPLEX_STDISP_BL;
mplex->stdispinfo.fullsize=FALSE;
- if(create){
- if(!window_init((WWindow*)mplex, parent, fp))
- return FALSE;
- }else{
- if(!window_do_init((WWindow*)mplex, parent, win, fp))
- return FALSE;
- }
+ if(!window_do_init((WWindow*)mplex, parent, fp, win))
+ return FALSE;
mplex->win.region.flags|=REGION_BINDINGS_ARE_GRABBED;
window_select_input(&(mplex->win), IONCORE_EVENTMASK_CWINMGR);
- region_add_bindmap((WRegion*)mplex, ioncore_mplex_bindmap);
- region_add_bindmap((WRegion*)mplex, ioncore_mplex_toplevel_bindmap);
-
region_register((WRegion*)mplex);
/* Call this to set MPLEX_MANAGED_UNVIEWABLE if necessary. */
bool mplex_init(WMPlex *mplex, WWindow *parent, const WFitParams *fp)
{
- return mplex_do_init(mplex, parent, None, fp, TRUE);
+ return mplex_do_init(mplex, parent, fp, None);
}
/*EXTL_DOC
- * Returns a list of regions on the numbered/mutually exclusive list of
- * \var{mplex}.
+ * Iterate over numbered/mutually exclusive region list of \var{mplex}
+ * until \var{iterfn} returns \code{false}.
+ * The function itself returns \code{true} if it reaches the end of list
+ * without this happening.
*/
EXTL_SAFE
EXTL_EXPORT_MEMBER
-ExtlTab mplex_mx_list(WMPlex *mplex)
+bool mplex_mx_i(WMPlex *mplex, ExtlFn iterfn)
{
WLListIterTmp tmp;
llist_iter_init(&tmp, mplex->mx_list);
- return extl_obj_iterable_to_table((ObjIterator*)llist_iter_regions, &tmp);
+ return extl_iter_objlist_(iterfn, (ObjIterator*)llist_iter_regions, &tmp);
}
/*EXTL_DOC
- * Returns a list of all regions managed by \var{mplex}.
+ * Iterate over managed regions of \var{mplex} until \var{iterfn} returns
+ * \code{false}.
+ * The function itself returns \code{true} if it reaches the end of list
+ * without this happening.
*/
EXTL_SAFE
EXTL_EXPORT_MEMBER
-ExtlTab mplex_managed_list(WMPlex *mplex)
+bool mplex_managed_i(WMPlex *mplex, ExtlFn iterfn)
{
WMPlexIterTmp tmp;
mplex_iter_init(&tmp, mplex);
- return extl_obj_iterable_to_table((ObjIterator*)mplex_iter, &tmp);
+ return extl_iter_objlist_(iterfn, (ObjIterator*)mplex_iter, &tmp);
}
* Set index of \var{reg} within the multiplexer to \var{index} within
* the mutually exclusive list. Special values for \var{index} are:
* \begin{tabularx}{\linewidth}{lX}
- * $-1$ & After \fnref{WMPlex.mx_current}. \\
- * $-2$ & Last. \\
+ * $-1$ & Last. \\
+ * $-2$ & After \fnref{WMPlex.mx_current}. \\
* \end{tabularx}
*/
EXTL_EXPORT_MEMBER
mplex_managed_geom(mplex, &fp.g);
- sizepolicy(&node->szplcy, sub, &rq->geom, &rq->flags, &fp);
+ sizepolicy(&node->szplcy, sub, &rq->geom, rq->flags, &fp);
if(geomret!=NULL)
*geomret=fp.g;
static WRegion *do_navi(WMPlex *mplex, WStacking *sti,
- NxtFn *fn, WRegionNaviData *data, bool sti_ok)
+ NxtFn *fn, WRegionNaviData *data,
+ bool sti_ok, bool wrap)
{
WStacking *st, *stacking;
uint min_level=0;
- bool wrap=FALSE;
stacking=mplex_get_stacking(mplex);
WRegionNaviData *data)
{
WStacking *lst=mplex->mgd;
-
- if(lst==NULL)
- return region_navi_cont((WRegion*)mplex, NULL, data);
+ WRegion *res=NULL;
- if(nh==REGION_NAVI_ANY){
- /* ? */
- }
+ if(lst!=NULL){
+ if(nh==REGION_NAVI_ANY){
+ /* ? */
+ }
- if(nh==REGION_NAVI_ANY || nh==REGION_NAVI_END ||
- nh==REGION_NAVI_BOTTOM || nh==REGION_NAVI_RIGHT){
- return do_navi(mplex, lst, mplex_prv, data, TRUE);
- }else{
- return do_navi(mplex, lst->mgr_prev, mplex_nxt, data, TRUE);
+ if(nh==REGION_NAVI_ANY || nh==REGION_NAVI_END ||
+ nh==REGION_NAVI_BOTTOM || nh==REGION_NAVI_RIGHT){
+ res=do_navi(mplex, lst, mplex_prv, data, TRUE, TRUE);
+ }else{
+ res=do_navi(mplex, lst->mgr_prev, mplex_nxt, data, TRUE, TRUE);
+ }
}
+
+ return region_navi_cont((WRegion*)mplex, res, data);
}
WRegionNaviData *data)
{
WStacking *st;
+ WRegion *res;
if(rel!=NULL){
st=mplex_find_stacking(mplex, rel);
}else{
return mplex_navi_first(mplex, nh, data);
}
-
+
if(nh==REGION_NAVI_ANY){
/* ? */
}
if(nh==REGION_NAVI_ANY || nh==REGION_NAVI_END ||
nh==REGION_NAVI_BOTTOM || nh==REGION_NAVI_RIGHT){
- return do_navi(mplex, st, mplex_nxt, data, FALSE);
+ res=do_navi(mplex, st, mplex_nxt, data, FALSE, FALSE);
}else{
- return do_navi(mplex, st, mplex_prv, data, FALSE);
+ res=do_navi(mplex, st, mplex_prv, data, FALSE, FALSE);
}
+
+ return region_navi_cont((WRegion*)mplex, res, data);
}
}
-static void get_params(WMPlex *mplex, ExtlTab tab, WMPlexAttachParams *par)
+static void get_params(WMPlex *mplex, ExtlTab tab, int mask,
+ WMPlexAttachParams *par)
{
int layer=1;
int tmp;
+ int ok=~mask;
- par->flags=0;
-
- if(extl_table_gets_i(tab, "layer", &tmp)){
- /* backwards compatibility */
+ if(mask==0 && extl_table_gets_i(tab, "layer", &tmp)){
+ /* backwards compatibility. No need to consider masked cases */
if(tmp==2){
par->flags|=MPLEX_ATTACH_UNNUMBERED;
if(!extl_table_is_bool_set(tab, "passive"))
}
if(extl_table_gets_i(tab, "level", &tmp)){
- if(tmp>=0){
+ if(tmp>=0 && ok&MPLEX_ATTACH_LEVEL){
par->flags|=MPLEX_ATTACH_LEVEL;
par->level=tmp;
}
}
if(extl_table_is_bool_set(tab, "modal"))
- par->flags|=MPLEX_ATTACH_MODAL;
+ par->flags|=MPLEX_ATTACH_MODAL&ok;
if(extl_table_is_bool_set(tab, "unnumbered"))
- par->flags|=MPLEX_ATTACH_UNNUMBERED;
+ par->flags|=MPLEX_ATTACH_UNNUMBERED&ok;
if(extl_table_is_bool_set(tab, "switchto"))
- par->flags|=MPLEX_ATTACH_SWITCHTO;
+ par->flags|=MPLEX_ATTACH_SWITCHTO&ok;
if(extl_table_is_bool_set(tab, "hidden"))
- par->flags|=MPLEX_ATTACH_HIDDEN;
+ par->flags|=MPLEX_ATTACH_HIDDEN&ok;
if(extl_table_gets_i(tab, "index", &(par->index)))
- par->flags|=MPLEX_ATTACH_INDEX;
+ par->flags|=MPLEX_ATTACH_INDEX&ok;
if(extl_table_gets_i(tab, "sizepolicy", &tmp)){
- par->flags|=MPLEX_ATTACH_SIZEPOLICY;
- par->szplcy=tmp;
+ if(ok&MPLEX_ATTACH_SIZEPOLICY){
+ par->flags|=MPLEX_ATTACH_SIZEPOLICY;
+ par->szplcy=tmp;
+ }
}
if(extl_table_gets_rectangle(tab, "geom", &par->geom))
- par->flags|=MPLEX_ATTACH_GEOM;
+ par->flags|=MPLEX_ATTACH_GEOM&ok;
}
EXTL_EXPORT_MEMBER
WRegion *mplex_attach(WMPlex *mplex, WRegion *reg, ExtlTab param)
{
- WMPlexAttachParams par;
+ WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
WRegionAttachData data;
if(reg==NULL)
return NULL;
- get_params(mplex, param, &par);
+ get_params(mplex, param, 0, &par);
data.type=REGION_ATTACH_REPARENT;
data.u.reg=reg;
}
+WRegion *mplex_attach_new_(WMPlex *mplex, WMPlexAttachParams *par,
+ int mask, ExtlTab param)
+{
+ WRegionAttachData data;
+
+ get_params(mplex, param, mask, par);
+
+ data.type=REGION_ATTACH_LOAD;
+ data.u.tab=param;
+
+ return mplex_do_attach(mplex, par, &data);
+}
+
+
/*EXTL_DOC
* Create a new region to be managed by \var{mplex}. At least the following
* fields in \var{param} are understood (all but \var{type} are optional).
EXTL_EXPORT_MEMBER
WRegion *mplex_attach_new(WMPlex *mplex, ExtlTab param)
{
- WMPlexAttachParams par;
- WRegionAttachData data;
+ WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
- get_params(mplex, param, &par);
-
- data.type=REGION_ATTACH_LOAD;
- data.u.tab=param;
-
- return mplex_do_attach(mplex, &par, &data);
+ return mplex_attach_new_(mplex, &par, 0, param);
}
void mplex_attach_tagged(WMPlex *mplex)
{
WRegion *reg;
+ int flags=MPLEX_ATTACH_SWITCHTO;
- while((reg=ioncore_tags_take_first())!=NULL)
- mplex_attach_simple(mplex, reg, 0);
+ while((reg=ioncore_tagged_take_first())!=NULL){
+ mplex_attach_simple(mplex, reg, flags);
+ /*flags=0;*/
+ }
}
if(!CAN_MANAGE_STDISP(mgr))
mgr=NULL;
-
- if(oldstdisp!=reg){
- mainloop_defer_destroy((Obj*)oldstdisp);
- watch_reset(&(mplex->stdispwatch));
- }
}
if(din!=NULL)
mplex->stdispinfo=*din;
if(reg==NULL){
+ watch_reset(&(mplex->stdispwatch));
+
if(mgr!=NULL){
region_unmanage_stdisp(mgr, TRUE, FALSE);
if(oldstdisp!=NULL)
mplex_remanage_stdisp(mplex);
}
+ if(oldstdisp!=NULL && oldstdisp!=reg)
+ region_dispose((WRegion*)oldstdisp, FALSE);
+
return TRUE;
}
tab=region_get_base_configuration((WRegion*)mplex);
subs=extl_create_table();
- extl_table_sets_t(tab, "subs", subs);
+ extl_table_sets_t(tab, "managed", subs);
/* First the numbered/mutually exclusive nodes */
FOR_ALL_NODES_ON_LLIST(lnode, mplex->mx_list, ltmp){
extl_unref_table(subtab);
}*/
- if(extl_table_gets_t(tab, "subs", &substab)){
+ if(extl_table_gets_t(tab, "managed", &substab) ||
+ extl_table_gets_t(tab, "subs", &substab)){
n=extl_table_get_n(substab);
for(i=1; i<=n; i++){
if(extl_table_geti_t(substab, i, &subtab)){
/*mplex_attach_new(mplex, subtab);*/
- WMPlexAttachParams par;
+ WMPlexAttachParams par=MPLEXATTACHPARAMS_INIT;
WRegionAttachData data;
char *tmp=NULL;
- get_params(mplex, subtab, &par);
+ get_params(mplex, subtab, 0, &par);
par.flags|=MPLEX_ATTACH_INDEX;
par.index=LLIST_INDEX_LAST;