}
-bool mplex_may_destroy(WMPlex *mplex)
-{
- if(mplex->mgd!=NULL){
- warn(TR("Refusing to destroy - not empty."));
- return FALSE;
- }
-
- return TRUE;
-}
-
-
/*}}}*/
/*EXTL_DOC
- * Set index of \var{reg} within the multiplexer to \var{index} within
- * the mutually exclusive list. Special values for \var{index} are:
+ * Set index of \var{reg} to \var{index} within the mutually exclusive
+ * list of \var{mplex}. Special values for \var{index} are:
* \begin{tabularx}{\linewidth}{lX}
* $-1$ & Last. \\
* $-2$ & After \fnref{WMPlex.mx_current}. \\
llist_unlink(&(mplex->mx_list), lnode);
}
- /* TODO: Support remove? */
-
after=llist_index_to_after(mplex->mx_list, mplex->mx_current, index);
llist_link_after(&(mplex->mx_list), after, lnode);
mplex_managed_changed(mplex, MPLEX_CHANGE_REORDER, FALSE, reg);
/*EXTL_DOC
- * Get index of \var{reg} within the multiplexer on list 1. The first region
- * managed by \var{mplex} has index zero. If \var{reg} is not managed by
- * \var{mplex}, -1 is returned.
+ * Get index of \var{reg} on the mutually exclusive list of \var{mplex}.
+ * The indices begin from zero.. If \var{reg} is not on the list,
+ * -1 is returned.
*/
EXTL_SAFE
EXTL_EXPORT_MEMBER
/*{{{ Focus */
-static WRegion *mplex_do_to_focus(WMPlex *mplex, WStacking *to_try)
+static WStacking *mplex_do_to_focus(WMPlex *mplex, WStacking *to_try)
{
WStacking *stacking=mplex_get_stacking(mplex);
WStacking *st=NULL;
st=stacking_find_to_focus_mapped(stacking, to_try, NULL);
if(st!=NULL)
- return st->reg;
+ return st;
else if(mplex->mx_current!=NULL)
- return mplex->mx_current->st->reg;
+ return mplex->mx_current->st;
else
return NULL;
}
-WRegion *mplex_to_focus(WMPlex *mplex)
+static WStacking *maybe_focusable(WRegion *reg)
{
- WRegion *reg=REGION_ACTIVE_SUB(mplex);
- WStacking *to_try=NULL;
+ if(reg==NULL || !REGION_IS_MAPPED(reg))
+ return NULL;
+
+ return ioncore_find_stacking(reg);
+}
+
+
+static WStacking *stacking_within(WMPlex *mplex, WRegion *reg)
+{
+ while(reg!=NULL && REGION_MANAGER(reg)!=(WRegion*)mplex)
+ reg=REGION_MANAGER(reg);
- if(reg!=NULL)
- to_try=ioncore_find_stacking(reg);
+ return maybe_focusable(reg);
+}
+
+static WStacking *mplex_to_focus(WMPlex *mplex)
+{
+ WStacking *to_try=NULL;
+ WRegion *reg=NULL;
+
+ to_try=maybe_focusable(REGION_ACTIVE_SUB(mplex));
+
+ if(to_try==NULL){
+ /* Search focus history */
+ for(reg=ioncore_g.focus_current; reg!=NULL; reg=reg->active_next){
+ to_try=stacking_within(mplex, reg);
+ if(to_try!=NULL)
+ break;
+ }
+ }
+
return mplex_do_to_focus(mplex, to_try);
}
-static WRegion *mplex_do_to_focus_on(WMPlex *mplex, WStacking *node,
- WStacking *to_try)
+static WStacking *mplex_do_to_focus_on(WMPlex *mplex, WStacking *node,
+ WStacking *to_try)
{
WStacking *stacking=mplex_get_stacking(mplex);
WStacking *st=NULL;
if(to_try!=NULL && (to_try->reg==NULL || !REGION_IS_MAPPED(to_try->reg)))
to_try=NULL;
- st=stacking_find_to_focus_mapped(stacking, to_try, node->reg);
-
- return (st!=NULL ? st->reg : NULL);
+ return stacking_find_to_focus_mapped(stacking, to_try, node->reg);
}
-static WRegion *mplex_to_focus_on(WMPlex *mplex, WStacking *node,
- WStacking *to_try)
+static WStacking *mplex_to_focus_on(WMPlex *mplex, WStacking *node,
+ WStacking *to_try)
{
- WRegion *reg;
WGroup *grp=OBJ_CAST(node->reg, WGroup);
+ WStacking *st;
if(grp!=NULL){
if(to_try==NULL)
to_try=grp->current_managed;
- reg=mplex_do_to_focus_on(mplex, node, to_try);
- if(reg!=NULL || to_try!=NULL)
- return reg;
+ st=mplex_do_to_focus_on(mplex, node, to_try);
+ if(st!=NULL || to_try!=NULL)
+ return st;
/* We don't know whether something is blocking focus here,
* or if there was nothing to focus (as node->reg itself
* isn't on the stacking list).
*/
}
- reg=mplex_do_to_focus(mplex, node);
- return (reg==node->reg ? reg : NULL);
+ st=mplex_do_to_focus(mplex, node);
+ return (st==node ? st : NULL);
}
void mplex_do_set_focus(WMPlex *mplex, bool warp)
{
if(!MPLEX_MGD_UNVIEWABLE(mplex)){
- WRegion *reg=mplex_to_focus(mplex);
+ WStacking *st=mplex_to_focus(mplex);
- if(reg!=NULL){
- region_do_set_focus(reg, warp);
+ if(st!=NULL){
+ region_do_set_focus(st->reg, warp);
return;
}
}
/* Move stdisp */
if(sub!=NULL && CAN_MANAGE_STDISP(sub)){
if(stdisp!=NULL){
- WRegion *mgrw=region_managed_within((WRegion*)mplex, stdisp);
- if(mgrw!=sub){
- WRegion *mgr=REGION_MANAGER(stdisp);
- if(mgr!=NULL){
- if(CAN_MANAGE_STDISP(mgr))
- region_unmanage_stdisp(mgr, FALSE, FALSE);
- region_detach_manager(stdisp);
- }
-
- region_manage_stdisp(sub, stdisp,
- &(mplex->stdispinfo));
+ WRegion *omgr=REGION_MANAGER(stdisp);
+ if(omgr!=sub && omgr!=NULL){
+ if(CAN_MANAGE_STDISP(omgr))
+ region_unmanage_stdisp(omgr, FALSE, FALSE);
+ region_detach_manager(stdisp);
}
+
+ region_manage_stdisp(sub, stdisp,
+ &(mplex->stdispinfo));
}else{
region_unmanage_stdisp(sub, TRUE, FALSE);
}
- }/*else if(stdisp!=NULL){
- region_detach_manager(stdisp);
- region_unmap(stdisp);
- }*/
+ }
}
* no visible netscape windows.
*/
{
- #warning "TODO: less ugly hack"
WGroup *grp=(WGroup*)OBJ_CAST(sub, WGroupCW);
- if(grp!=NULL && grp->bottom!=NULL){
- region_managed_rqorder((WRegion*)grp, grp->bottom->reg,
- REGION_ORDER_BACK);
+ if(grp!=NULL){
+ WRegion *bottom=group_bottom(grp);
+ if(bottom!=NULL){
+ region_managed_rqorder((WRegion*)grp, bottom,
+ REGION_ORDER_BACK);
+ }
}
}
static bool mplex_refocus(WMPlex *mplex, WStacking *node, bool warp)
{
- WRegion *foc=NULL;
+ WStacking *foc=NULL;
bool ret=TRUE;
if(node!=NULL){
foc=mplex_to_focus(mplex);
}
- if(foc!=NULL /* && !REGION_IS_ACTIVE(foc) */ )
- region_maybewarp(foc, warp);
+ if(foc!=NULL)
+ region_maybewarp(foc->reg, warp);
return ret;
}
WStacking *sub, int flags,
WPrepareFocusResult *res)
{
- WRegion *foc;
+ WStacking *foc;
if(sub==NULL && node==NULL)
return FALSE;
foc=mplex_do_to_focus(mplex, sub);
if(foc!=NULL){
- res->reg=foc;
+ if(ioncore_g.autoraise &&
+ !(flags®ION_GOTO_ENTERWINDOW) &&
+ foc->level>STACKING_LEVEL_BOTTOM){
+ WStacking **stackingp=mplex_get_stackingp(mplex);
+ stacking_restack(stackingp, foc, None, NULL, NULL, FALSE);
+ }
+
+ res->reg=foc->reg;
res->flags=flags;
if(sub==NULL)
- return (foc==node->reg);
+ return (foc==node);
else
- return (foc==sub->reg);
+ return (foc==sub);
}else{
return FALSE;
}
if(OBJ_IS(st->reg, WGroup)){
/* WGroup navigation code should respect modal stuff. */
WRegion *res=region_navi_cont((WRegion*)mplex, st->reg, data);
- if(res!=NULL){
- if(res!=st->reg){
- return res;
- }else{
- #warning "TODO: What to do?"
- }
- }
+ if(res!=NULL && res!=st->reg)
+ return res;
}else{
if(st->level>=min_level && !PASSIVE(st))
return region_navi_cont((WRegion*)mplex, st->reg, data);
WLListNode *lnode=NULL;
WMPlexAttachParams *param=&ph->param;
bool mx_was_empty, sw, modal, mcf, hidden;
+ WSizePolicy szplcy;
uint level;
mcf=region_may_control_focus((WRegion*)mplex);
mx_was_empty=(mplex->mx_list==NULL);
+ szplcy=((param->flags&MPLEX_ATTACH_SIZEPOLICY &&
+ param->szplcy!=SIZEPOLICY_DEFAULT)
+ ? param->szplcy
+ : (param->flags&MPLEX_ATTACH_UNNUMBERED
+ ? SIZEPOLICY_FULL_BOUNDS
+ : SIZEPOLICY_FULL_EXACT));
+
modal=(param->flags&MPLEX_ATTACH_LEVEL
? param->level>=STACKING_LEVEL_MODAL1
: param->flags&MPLEX_ATTACH_MODAL);
hidden=(hidden || (!sw && !(param->flags&MPLEX_ATTACH_UNNUMBERED)));
-
node=create_stacking();
if(node==NULL)
}
node->hidden=TRUE;
- node->szplcy=param->szplcy;
+ node->szplcy=szplcy;
node->level=level;
if(lnode!=NULL){
region_set_manager(reg, (WRegion*)mplex);
+ if(!(param->flags&MPLEX_ATTACH_WHATEVER)){
+ WFitParams fp;
+
+ mplex_managed_geom(mplex, &(fp.g));
+
+ sizepolicy(&node->szplcy, reg,
+ (param->flags&MPLEX_ATTACH_GEOM ? &(param->geom) : NULL),
+ 0, &fp);
+
+ if(rectangle_compare(&fp.g, ®ION_GEOM(reg))!=RECTANGLE_SAME)
+ region_fitrep(reg, NULL, &fp);
+ }
+
if(!hidden)
mplex_do_node_display(mplex, node, FALSE);
else
WRegionAttachData *data)
{
WMPlexAttachParams *param=&(ph->param);
- WSizePolicy szplcy=param->szplcy;
WFitParams fp;
- WRegion *reg;
-
- param->szplcy=(param->flags&MPLEX_ATTACH_SIZEPOLICY &&
- param->szplcy!=SIZEPOLICY_DEFAULT
- ? param->szplcy
- : (param->flags&MPLEX_ATTACH_UNNUMBERED
- ? SIZEPOLICY_FULL_BOUNDS
- : SIZEPOLICY_FULL_EXACT));
-
- mplex_managed_geom(mplex, &(fp.g));
-
- sizepolicy(¶m->szplcy, NULL,
- (param->flags&MPLEX_ATTACH_GEOM
- ? &(param->geom)
- : NULL),
- 0, &fp);
- if(param->flags&MPLEX_ATTACH_WHATEVER)
- fp.mode|=REGION_FIT_WHATEVER;
-
- reg=region_attach_helper((WRegion*)mplex,
- (WWindow*)mplex, &fp,
- (WRegionDoAttachFn*)mplex_do_attach_final,
- (void*)ph, data);
+ if(param->flags&MPLEX_ATTACH_GEOM)
+ fp.g=param->geom;
+ else
+ mplex_managed_geom(mplex, &(fp.g));
- /* restore */
- ph->param.szplcy=szplcy;
+ fp.mode=REGION_FIT_WHATEVER|REGION_FIT_BOUNDS;
- return reg;
+ return region_attach_helper((WRegion*)mplex,
+ (WWindow*)mplex, &fp,
+ (WRegionDoAttachFn*)mplex_do_attach_final,
+ (void*)ph, data);
}
int tmp;
int ok=~mask;
- 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"))
- par->flags|=MPLEX_ATTACH_MODAL;
- }
- }
-
if(extl_table_gets_i(tab, "level", &tmp)){
if(tmp>=0 && ok&MPLEX_ATTACH_LEVEL){
par->flags|=MPLEX_ATTACH_LEVEL;
* \var{hidden} & (boolean) Attach hidden, if not prevented
* by e.g. the mutually exclusive list being empty.
* This option overrides \var{switchto}. \\
- * \var{sizepolicy} & (integer) Size policy.
- * (TODO: document them somewhere.) \\
+ * \var{sizepolicy} & (integer) Size policy. \\
* \var{geom} & (table) Geometry specification. \\
* \end{tabularx}
*
}
-/*EXTL_DOC
- * Attach all tagged regions to \var{mplex}.
- */
-EXTL_EXPORT_MEMBER
-void mplex_attach_tagged(WMPlex *mplex)
-{
- WRegion *reg;
- int flags=MPLEX_ATTACH_SWITCHTO;
-
- while((reg=ioncore_tagged_take_first())!=NULL){
- mplex_attach_simple(mplex, reg, flags);
- /*flags=0;*/
- }
-}
-
-
static bool mplex_handle_drop(WMPlex *mplex, int x, int y,
WRegion *dropped)
{
ap.flags=((param->switchto ? MPLEX_ATTACH_SWITCHTO : 0)
|MPLEX_ATTACH_SIZEPOLICY);
- ap.szplcy=SIZEPOLICY_FULL_BOUNDS;
+ ap.szplcy=SIZEPOLICY_FULL_EXACT;
mph=create_mplexpholder(mplex, NULL, &ap);
}
-bool mplex_rescue_clientwins(WMPlex *mplex, WPHolder *ph)
+bool mplex_rescue_clientwins(WMPlex *mplex, WRescueInfo *info)
{
bool ret1, ret2;
WMPlexIterTmp tmp;
mplex_iter_init(&tmp, mplex);
- ret1=region_rescue_some_clientwins((WRegion*)mplex, ph,
+ ret1=region_rescue_some_clientwins((WRegion*)mplex, info,
(WRegionIterator*)mplex_iter,
&tmp);
- ret2=region_rescue_child_clientwins((WRegion*)mplex, ph);
+ ret2=region_rescue_child_clientwins((WRegion*)mplex, info);
return (ret1 && ret2);
}
}
if(oldstdisp!=NULL && oldstdisp!=reg)
- region_dispose((WRegion*)oldstdisp, FALSE);
+ mainloop_defer_destroy((Obj*)oldstdisp);
return TRUE;
}
st=region_get_configuration(node->reg);
if(st!=extl_table_none()){
- /*"TODO: better switchto saving? */
if(mplex->mx_current!=NULL && node==mplex->mx_current->st)
extl_table_sets_b(st, "switchto", TRUE);
extl_table_sets_i(st, "sizepolicy", node->szplcy);
{(DynFun*)region_get_rescue_pholder_for,
(DynFun*)mplex_get_rescue_pholder_for},
- {(DynFun*)region_may_destroy,
- (DynFun*)mplex_may_destroy},
-
{(DynFun*)region_navi_first,
(DynFun*)mplex_navi_first},