X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fmplex.c;h=a202e7c51672b0565baacfb03f95539d230d3eb8;hp=158b9ffa42f1b9a74c17b950ef355e28f77de32c;hb=20070203;hpb=8366314611bf30a0f31d25bf5f5023186fa87692 diff --git a/ioncore/mplex.c b/ioncore/mplex.c index 158b9ff..a202e7c 100644 --- a/ioncore/mplex.c +++ b/ioncore/mplex.c @@ -1,7 +1,7 @@ /* * 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 @@ -94,8 +94,8 @@ WStacking *mplex_iter_nodes(WMPlexIterTmp *tmp) /*{{{ 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; @@ -110,21 +110,13 @@ bool mplex_do_init(WMPlex *mplex, WWindow *parent, Window win, 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. */ @@ -136,7 +128,7 @@ bool mplex_do_init(WMPlex *mplex, WWindow *parent, Window win, 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); } @@ -266,31 +258,36 @@ WRegion *mplex_mx_nth(WMPlex *mplex, uint n) /*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); } @@ -298,8 +295,8 @@ ExtlTab mplex_managed_list(WMPlex *mplex) * 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 @@ -514,7 +511,7 @@ static void mplex_managed_rqgeom(WMPlex *mplex, WRegion *sub, 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; @@ -921,11 +918,11 @@ typedef WStacking *NxtFn(WMPlex *mplex, WStacking *st, bool wrap); 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); @@ -968,20 +965,22 @@ WRegion *mplex_navi_first(WMPlex *mplex, WRegionNavi nh, 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); } @@ -989,6 +988,7 @@ WRegion *mplex_navi_next(WMPlex *mplex, WRegion *rel, WRegionNavi nh, WRegionNaviData *data) { WStacking *st; + WRegion *res; if(rel!=NULL){ st=mplex_find_stacking(mplex, rel); @@ -999,17 +999,19 @@ WRegion *mplex_navi_next(WMPlex *mplex, WRegion *rel, WRegionNavi nh, }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); } @@ -1265,15 +1267,15 @@ WRegion *mplex_attach_simple(WMPlex *mplex, WRegion *reg, int flags) } -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")) @@ -1282,34 +1284,36 @@ static void get_params(WMPlex *mplex, ExtlTab tab, WMPlexAttachParams *par) } 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; } @@ -1321,13 +1325,13 @@ static void get_params(WMPlex *mplex, ExtlTab tab, WMPlexAttachParams *par) 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; @@ -1336,6 +1340,20 @@ WRegion *mplex_attach(WMPlex *mplex, WRegion *reg, ExtlTab param) } +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). @@ -1365,15 +1383,9 @@ WRegion *mplex_attach(WMPlex *mplex, WRegion *reg, ExtlTab param) 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); } @@ -1384,9 +1396,12 @@ EXTL_EXPORT_MEMBER 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;*/ + } } @@ -1597,17 +1612,14 @@ bool mplex_set_stdisp(WMPlex *mplex, WRegion *reg, 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) @@ -1619,6 +1631,9 @@ bool mplex_set_stdisp(WMPlex *mplex, WRegion *reg, mplex_remanage_stdisp(mplex); } + if(oldstdisp!=NULL && oldstdisp!=reg) + region_dispose((WRegion*)oldstdisp, FALSE); + return TRUE; } @@ -1920,7 +1935,7 @@ ExtlTab mplex_get_configuration(WMPlex *mplex) 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){ @@ -1964,16 +1979,17 @@ void mplex_load_contents(WMPlex *mplex, ExtlTab tab) 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;