X-Git-Url: https://git.decadent.org.uk/gitweb/?p=ion3.git;a=blobdiff_plain;f=ioncore%2Fframe.c;h=4f82aa4fa951a37b7b0d6601a569a542f5c811e9;hp=0f3e8f285e374d6a5908ed4e1afcf23e84c800ad;hb=HEAD;hpb=8366314611bf30a0f31d25bf5f5023186fa87692 diff --git a/ioncore/frame.c b/ioncore/frame.c index 0f3e8f2..4f82aa4 100644 --- a/ioncore/frame.c +++ b/ioncore/frame.c @@ -1,12 +1,9 @@ /* * ion/ioncore/frame.c * - * Copyright (c) Tuomo Valkonen 1999-2006. + * Copyright (c) Tuomo Valkonen 1999-2009. * - * 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 - * the Free Software Foundation; either version 2.1 of the License, or - * (at your option) any later version. + * See the included file LICENSE for details. */ #include @@ -37,8 +34,9 @@ #include "bindmaps.h" #include "regbind.h" #include "gr.h" -#include "activity.h" #include "llist.h" +#include "framedpholder.h" +#include "return.h" extern bool frame_set_background(WFrame *frame, bool set_always); @@ -52,11 +50,32 @@ static void frame_add_mode_bindmaps(WFrame *frame); WHook *frame_managed_changed_hook=NULL; -#define IS_FLOATING_MODE(FRAME) \ - ((FRAME)->mode==FRAME_MODE_FLOATING || (FRAME)->mode==FRAME_MODE_TRANSIENT) -#define FORWARD_CWIN_RQGEOM(FRAME) IS_FLOATING_MODE(FRAME) -#define USE_MINMAX(FRAME) IS_FLOATING_MODE(FRAME) -#define DEST_EMPTY(FRAME) IS_FLOATING_MODE(FRAME) +#define FORWARD_CWIN_RQGEOM(FRAME) framemode_is_floating(frame_mode(FRAME)) +#define USE_MINMAX(FRAME) framemode_is_floating(frame_mode(FRAME)) +#define DEST_EMPTY(FRAME) framemode_is_floating(frame_mode(FRAME)) + + +WFrameMode framemode_unalt(WFrameMode mode) +{ + if(mode==FRAME_MODE_UNKNOWN_ALT) + return FRAME_MODE_UNKNOWN; + else if(mode==FRAME_MODE_TILED_ALT) + return FRAME_MODE_TILED; + else if(mode==FRAME_MODE_FLOATING_ALT) + return FRAME_MODE_FLOATING; + else if(mode==FRAME_MODE_TRANSIENT_ALT) + return FRAME_MODE_TRANSIENT; + else + return mode; +} + + +static WFrameMode framemode_is_floating(WFrameMode mode) +{ + WFrameMode modea=framemode_unalt(mode); + + return (modea==FRAME_MODE_FLOATING || modea==FRAME_MODE_TRANSIENT); +} /*{{{ Destroy/create frame */ @@ -84,6 +103,8 @@ bool frame_init(WFrame *frame, WWindow *parent, const WFitParams *fp, frame->tab_min_w=0; frame->bar_max_width_q=1.0; + gr_stylespec_init(&frame->baseattr); + if(!mplex_init((WMPlex*)frame, parent, fp)) return FALSE; @@ -91,7 +112,7 @@ bool frame_init(WFrame *frame, WWindow *parent, const WFitParams *fp, frame_initialise_titles(frame); region_add_bindmap((WRegion*)frame, ioncore_frame_bindmap); - region_add_bindmap((WRegion*)frame, ioncore_frame_toplevel_bindmap); + region_add_bindmap((WRegion*)frame, ioncore_mplex_bindmap); frame_add_mode_bindmaps(frame); @@ -116,6 +137,7 @@ void frame_deinit(WFrame *frame) { frame_free_titles(frame); frame_release_brushes(frame); + gr_stylespec_unalloc(&frame->baseattr); mplex_deinit((WMPlex*)frame); } @@ -128,17 +150,21 @@ void frame_deinit(WFrame *frame) static void frame_add_mode_bindmaps(WFrame *frame) { - WFrameMode mode=frame->mode; + WFrameMode modea=framemode_unalt(frame->mode); - if(mode==FRAME_MODE_TILED || mode==FRAME_MODE_TILED_ALT){ - region_add_bindmap((WRegion*)frame, ioncore_frame_toplevel_bindmap); - region_add_bindmap((WRegion*)frame, ioncore_frame_tiled_bindmap); - }else if(mode==FRAME_MODE_FLOATING){ + if(modea==FRAME_MODE_FLOATING){ + region_add_bindmap((WRegion*)frame, ioncore_mplex_toplevel_bindmap); region_add_bindmap((WRegion*)frame, ioncore_frame_toplevel_bindmap); region_add_bindmap((WRegion*)frame, ioncore_frame_floating_bindmap); - }else if(mode==FRAME_MODE_TRANSIENT){ + }else if(modea==FRAME_MODE_TRANSIENT){ region_add_bindmap((WRegion*)frame, ioncore_frame_transient_bindmap); - } + region_add_bindmap((WRegion*)frame, ioncore_frame_floating_bindmap); + }else{ + /* mode==FRAME_MODE_TILED || mode==FRAME_MODE_TILED_ALT || mode==FRAME_MODE_UNKNOWN */ + region_add_bindmap((WRegion*)frame, ioncore_mplex_toplevel_bindmap); + region_add_bindmap((WRegion*)frame, ioncore_frame_toplevel_bindmap); + region_add_bindmap((WRegion*)frame, ioncore_frame_tiled_bindmap); + } } @@ -151,20 +177,17 @@ void frame_set_mode(WFrame *frame, WFrameMode mode) frame_release_brushes(frame); + region_remove_bindmap((WRegion*)frame, ioncore_mplex_toplevel_bindmap); region_remove_bindmap((WRegion*)frame, ioncore_frame_toplevel_bindmap); region_remove_bindmap((WRegion*)frame, ioncore_frame_tiled_bindmap); region_remove_bindmap((WRegion*)frame, ioncore_frame_floating_bindmap); region_remove_bindmap((WRegion*)frame, ioncore_frame_transient_bindmap); frame->mode=mode; - - frame_add_mode_bindmaps(frame); - frame_initialise_gr(frame); + frame_add_mode_bindmaps(frame); - mplex_fit_managed(&frame->mplex); - frame_recalc_bar(frame); - frame_set_background(frame, TRUE); + frame_updategr(frame); } @@ -174,11 +197,15 @@ WFrameMode frame_mode(WFrame *frame) } -StringIntMap frame_modes[]={ +static StringIntMap frame_modes[]={ + {"unknown", FRAME_MODE_UNKNOWN}, + {"unknown-alt", FRAME_MODE_UNKNOWN_ALT}, {"tiled", FRAME_MODE_TILED}, {"tiled-alt", FRAME_MODE_TILED_ALT}, {"floating", FRAME_MODE_FLOATING}, + {"floating-alt", FRAME_MODE_FLOATING_ALT}, {"transient", FRAME_MODE_TRANSIENT}, + {"transient-alt", FRAME_MODE_TRANSIENT_ALT}, END_STRINGINTMAP }; @@ -186,6 +213,7 @@ StringIntMap frame_modes[]={ /*EXTL_DOC * Get frame mode. */ +EXTL_SAFE EXTL_EXPORT_AS(WFrame, mode) const char *frame_mode_extl(WFrame *frame) { @@ -194,7 +222,9 @@ const char *frame_mode_extl(WFrame *frame) /*EXTL_DOC - * Set frame mode. + * Set frame mode (one of + * \codestr{unknown}, \codestr{tiled}, \codestr{floating}, \codestr{transient}, + * or any of these suffixed with \codestr{-alt}). */ EXTL_EXPORT_AS(WFrame, set_mode) bool frame_set_mode_extl(WFrame *frame, const char *modestr) @@ -299,46 +329,6 @@ int frame_nth_tab_iw(WFrame *frame, int n) -static void update_attr(WFrame *frame, int i, WRegion *reg) -{ - int flags=0; - static char *attrs[]={ - "unselected-not_tagged-not_dragged-no_activity", - "selected-not_tagged-not_dragged-no_activity", - "unselected-tagged-not_dragged-no_activity", - "selected-tagged-not_dragged-no_activity", - "unselected-not_tagged-dragged-no_activity", - "selected-not_tagged-dragged-no_activity", - "unselected-tagged-dragged-no_activity", - "selected-tagged-dragged-no_activity", - "unselected-not_tagged-not_dragged-activity", - "selected-not_tagged-not_dragged-activity", - "unselected-tagged-not_dragged-activity", - "selected-tagged-not_dragged-activity", - "unselected-not_tagged-dragged-activity", - "selected-not_tagged-dragged-activity", - "unselected-tagged-dragged-activity", - "selected-tagged-dragged-activity" - }; - - if(i>=frame->titles_n){ - /* Might happen when deinitialising */ - return; - } - - if(reg==FRAME_CURRENT(frame)) - flags|=0x01; - if(reg!=NULL && reg->flags®ION_TAGGED) - flags|=0x02; - if(i==frame->tab_dragged_idx) - flags|=0x04; - if(reg!=NULL && region_is_activity_r(reg)) - flags|=0x08; - - frame->titles[i].attr=attrs[flags]; -} - - void frame_update_attr_nth(WFrame *frame, int i) { WRegion *reg; @@ -346,18 +336,18 @@ void frame_update_attr_nth(WFrame *frame, int i) if(i<0 || i>=frame->titles_n) return; - update_attr(frame, i, mplex_mx_nth((WMPlex*)frame, i)); + frame_update_attr(frame, i, mplex_mx_nth((WMPlex*)frame, i)); } -static void update_attrs(WFrame *frame) +static void frame_update_attrs(WFrame *frame) { int i=0; WRegion *sub; WLListIterTmp tmp; FRAME_MX_FOR_ALL(sub, frame, tmp){ - update_attr(frame, i, sub); + frame_update_attr(frame, i, sub); i++; } } @@ -371,6 +361,7 @@ static void frame_free_titles(WFrame *frame) for(i=0; ititles_n; i++){ if(frame->titles[i].text) free(frame->titles[i].text); + gr_stylespec_unalloc(&frame->titles[i].attr); } free(frame->titles); frame->titles=NULL; @@ -383,7 +374,10 @@ static void do_init_title(WFrame *frame, int i, WRegion *sub) { frame->titles[i].text=NULL; frame->titles[i].iw=frame_nth_tab_iw(frame, i); - update_attr(frame, i, sub); + + gr_stylespec_init(&frame->titles[i].attr); + + frame_update_attr(frame, i, sub); } @@ -413,7 +407,7 @@ static bool frame_initialise_titles(WFrame *frame) } } - frame_recalc_bar(frame); + frame_recalc_bar(frame, FALSE); return TRUE; } @@ -433,7 +427,8 @@ bool frame_fitrep(WFrame *frame, WWindow *par, const WFitParams *fp) old_geom=REGION_GEOM(frame); - window_do_fitrep(&(frame->mplex.win), par, &(fp->g)); + if(!window_fitrep(&(frame->mplex.win), par, fp)) + return FALSE; mplex_managed_geom((WMPlex*)frame, &mg); @@ -480,36 +475,36 @@ void frame_size_hints(WFrame *frame, WSizeHints *hints_ret) woff=maxof(REGION_GEOM(frame).w-subgeom.w, 0); hoff=maxof(REGION_GEOM(frame).h-subgeom.h, 0); - if(FRAME_CURRENT(frame)!=NULL){ + if(FRAME_CURRENT(frame)!=NULL) region_size_hints(FRAME_CURRENT(frame), hints_ret); - if(!USE_MINMAX(frame)){ - hints_ret->max_set=0; - hints_ret->min_set=0; - hints_ret->base_set=0; - hints_ret->aspect_set=0; - hints_ret->no_constrain=FALSE; - /*hints_ret->no_constrain=TRUE;*/ - } - }else{ + else sizehints_clear(hints_ret); - } FRAME_MX_FOR_ALL(sub, frame, tmp){ sizehints_adjust_for(hints_ret, sub); } - if(!hints_ret->base_set){ - hints_ret->base_width=0; - hints_ret->base_height=0; - hints_ret->base_set=TRUE; + if(!USE_MINMAX(frame)){ + hints_ret->max_set=0; + hints_ret->min_set=0; + /*hints_ret->base_set=0;*/ + hints_ret->aspect_set=0; + hints_ret->no_constrain=FALSE; + /*hints_ret->no_constrain=TRUE;*/ } - + if(!hints_ret->min_set){ hints_ret->min_width=0; hints_ret->min_height=0; hints_ret->min_set=TRUE; } + if(!hints_ret->base_set){ + hints_ret->base_width=0; + hints_ret->base_height=0; + hints_ret->base_set=TRUE; + } + hints_ret->base_width+=woff; hints_ret->base_height+=hoff; hints_ret->max_width+=woff; @@ -517,13 +512,14 @@ void frame_size_hints(WFrame *frame, WSizeHints *hints_ret) hints_ret->min_width+=woff; hints_ret->min_height+=hoff; - if(frame->barmode==FRAME_BAR_SHAPED){ + /* shaded */ { int f=frame->flags&(FRAME_SHADED|FRAME_SHADED_TOGGLE); if(f==FRAME_SHADED || f==FRAME_SHADED_TOGGLE){ - hints_ret->min_height=frame->bar_h; - hints_ret->max_height=frame->bar_h; - hints_ret->base_height=frame->bar_h; + int h=frame_shaded_height(frame); + hints_ret->min_height=h; + hints_ret->max_height=h; + hints_ret->base_height=h; if(!hints_ret->max_set){ hints_ret->max_width=INT_MAX; hints_ret->max_set=TRUE; @@ -536,24 +532,6 @@ void frame_size_hints(WFrame *frame, WSizeHints *hints_ret) /*}}}*/ -/*{{{ Focus */ - - -void frame_inactivated(WFrame *frame) -{ - window_draw((WWindow*)frame, FALSE); -} - - -void frame_activated(WFrame *frame) -{ - window_draw((WWindow*)frame, FALSE); -} - - -/*}}}*/ - - /*{{{ Client window rqgeom */ @@ -620,6 +598,84 @@ static void frame_managed_rqgeom_absolute(WFrame *frame, WRegion *sub, /*}}}*/ +/*{{{ Frame recreate pholder stuff */ + + +static WFramedPHolder *frame_make_recreate_pholder(WFrame *frame, WPHolder *rph) +{ + WFramedParam fparam=FRAMEDPARAM_INIT; + WFramedPHolder *fph=NULL; + + if(rph!=NULL){ + fparam.mode=frame->mode; + + fph=create_framedpholder(rph, &fparam); + + if(fph==NULL) + destroy_obj((Obj*)rph); + } + + return fph; +} + + +static void mplex_migrate_phs_to_fph(WMPlex *mplex, WFramedPHolder *fph) +{ + WMPlexPHolder *phs, *ph; + + phs=mplex->misc_phs; + mplex->misc_phs=NULL; + + phs->recreate_pholder=fph; + + for(ph=phs; ph!=NULL; ph=ph->next) + ph->mplex=NULL; +} + + + +bool frame_rescue_clientwins(WFrame *frame, WRescueInfo *info) +{ + bool ret; + + ret=mplex_rescue_clientwins(&frame->mplex, info); + + /* Now, do placeholders. + * We can't currently be arsed to keep them ordered with regions... + * First we check if we can simply recreate this frame, which takes + * care of e.g. floating frames being destroyed when entering full + * screen mode. If not, we check if the target would be a WMPlex, and + * migrate there. This takes care of frames destroyed in tilings. + */ + mplex_flatten_phs(&frame->mplex); + + if(frame->mplex.misc_phs!=NULL){ + WPHolder *ret_ph=region_make_return_pholder((WRegion*)frame); + WFramedPHolder *fph=frame_make_recreate_pholder(frame, ret_ph); + + if(fph!=NULL){ + mplex_migrate_phs_to_fph(&frame->mplex, fph); + }else{ + WPHolder *rescueph=rescueinfo_pholder(info); + if(rescueph!=NULL){ + WRegion *target=pholder_target(rescueph); + WMPlex *other_mplex=OBJ_CAST(target, WMPlex); + + if(other_mplex!=NULL){ + assert(other_mplex!=&frame->mplex); + mplex_migrate_phs(&frame->mplex, other_mplex); + } + } + } + } + + return ret; +} + + +/*}}}*/ + + /*{{{ Misc. */ @@ -642,17 +698,9 @@ bool frame_set_shaded(WFrame *frame, int sp) return FALSE; rq.geom.h=frame->saved_h; }else{ - if(frame->barmode==FRAME_BAR_NONE){ + if(frame->barmode==FRAME_BAR_NONE) return FALSE; - }else if(frame->barmode==FRAME_BAR_SHAPED){ - rq.geom.h=frame->bar_h; - }else{ - WRectangle tmp; - - frame_border_inner_geom(frame, &tmp); - - rq.geom.h=rq.geom.h-tmp.h; - } + rq.geom.h=frame_shaded_height(frame); } frame->flags|=FRAME_SHADED_TOGGLE; @@ -667,7 +715,8 @@ bool frame_set_shaded(WFrame *frame, int sp) /*EXTL_DOC * Set shading state according to the parameter \var{how} - * (set/unset/toggle). Resulting state is returned, which may not be + * (\codestr{set}, \codestr{unset}, or \codestr{toggle}). + * Resulting state is returned, which may not be * what was requested. */ EXTL_EXPORT_AS(WFrame, set_shaded) @@ -688,47 +737,67 @@ bool frame_is_shaded(WFrame *frame) } -bool frame_set_numbers(WFrame *frame, int sp) +/* EXTL_DOC + * Is the attribute \var{attr} set? + */ +bool frame_is_grattr(WFrame *frame, const char *attr) { - bool set=frame->flags&FRAME_SHOW_NUMBERS; - bool nset=libtu_do_setparam(sp, set); - - if(XOR(nset, set)){ - frame->flags^=FRAME_SHOW_NUMBERS; - frame_recalc_bar(frame); - frame_draw_bar(frame, TRUE); - } - - return frame->flags&FRAME_SHOW_NUMBERS; + GrAttr a=stringstore_alloc(attr); + bool set=gr_stylespec_isset(&frame->baseattr, a); + stringstore_free(a); + return set; } -/*EXTL_DOC - * Control whether tabs show numbers (set/unset/toggle). - * Resulting state is returned, which may not be what was - * requested. - */ -EXTL_EXPORT_AS(WFrame, set_numbers) -bool frame_set_numbers_extl(WFrame *frame, const char *how) +bool frame_set_grattr(WFrame *frame, GrAttr a, int sp) { - return frame_set_numbers(frame, libtu_string_to_setparam(how)); + bool set=gr_stylespec_isset(&frame->baseattr, a); + bool nset=libtu_do_setparam(sp, set); + + if(XOR(set, nset)){ + if(nset) + gr_stylespec_set(&frame->baseattr, a); + else + gr_stylespec_unset(&frame->baseattr, a); + window_draw((WWindow*)frame, TRUE); + } + + return nset; } /*EXTL_DOC - * Does \var{frame} show numbers for tabs? + * Set extra drawing engine attributes for the frame. + * The parameter \var{attr} is the attribute, and \var{how} is + * one of \codestr{set}, \codestr{unset}, or \codestr{toggle}. */ -bool frame_is_numbers(WFrame *frame) +EXTL_EXPORT_AS(WFrame, set_grattr) +bool frame_set_grattr_extl(WFrame *frame, const char *attr, const char *how) { - return frame->flags&FRAME_SHOW_NUMBERS; + if(attr!=NULL){ + GrAttr a=stringstore_alloc(attr); + bool ret=frame_set_grattr(frame, a, libtu_string_to_setparam(how)); + stringstore_free(a); + return ret; + }else{ + return FALSE; + } } -void frame_managed_notify(WFrame *frame, WRegion *sub, const char *how) +void frame_managed_notify(WFrame *frame, WRegion *sub, WRegionNotify how) { - update_attrs(frame); - frame_recalc_bar(frame); - frame_draw_bar(frame, FALSE); + if(how==ioncore_g.notifies.activated || + how==ioncore_g.notifies.inactivated || + how==ioncore_g.notifies.name || + how==ioncore_g.notifies.activity || + how==ioncore_g.notifies.sub_activity || + how==ioncore_g.notifies.tag){ + + frame_update_attrs(frame); + frame_recalc_bar(frame, FALSE); + frame_draw_bar(frame, FALSE); + } } @@ -738,7 +807,7 @@ static void frame_size_changed_default(WFrame *frame, int bar_w=frame->bar_w; if(wchg) - frame_recalc_bar(frame); + frame_recalc_bar(frame, TRUE); if(frame->barmode==FRAME_BAR_SHAPED && ((!wchg && hchg) || (wchg && bar_w==frame->bar_w))){ @@ -755,7 +824,7 @@ static void frame_managed_changed(WFrame *frame, int mode, bool sw, if(mode!=MPLEX_CHANGE_SWITCHONLY) frame_initialise_titles(frame); else - update_attrs(frame); + frame_update_attrs(frame); if(sw) need_draw=!frame_set_background(frame, FALSE); @@ -769,31 +838,49 @@ static void frame_managed_changed(WFrame *frame, int mode, bool sw, } -#define EMPTY_AND_SHOULD_BE_DESTROYED(FRAME) \ - (DEST_EMPTY(frame) && FRAME_MCOUNT(FRAME)==0 && \ - !OBJ_IS_BEING_DESTROYED(frame)) - - -static void frame_destroy_empty(WFrame *frame) +WRegion *frame_managed_disposeroot(WFrame *frame, WRegion *reg) { - if(EMPTY_AND_SHOULD_BE_DESTROYED(frame)) - destroy_obj((Obj*)frame); + if(DEST_EMPTY(frame) && + frame->mplex.mgd!=NULL && + frame->mplex.mgd->reg==reg && + frame->mplex.mgd->mgr_next==NULL){ + WRegion *tmp=region_disposeroot((WRegion*)frame); + return (tmp!=NULL ? tmp : reg); + } + + return reg; } -void frame_managed_remove(WFrame *frame, WRegion *reg) +int frame_default_index(WFrame *frame) { - mplex_managed_remove((WMPlex*)frame, reg); - if(EMPTY_AND_SHOULD_BE_DESTROYED(frame)){ - mainloop_defer_action((Obj*)frame, - (WDeferredAction*)frame_destroy_empty); - } + return ioncore_g.frame_default_index; } -int frame_default_index(WFrame *frame) +/*}}}*/ + + +/*{{{ prepare_manage_transient */ + + +WPHolder *frame_prepare_manage_transient(WFrame *frame, + const WClientWin *transient, + const WManageParams *param, + int unused) { - return ioncore_g.frame_default_index; + /* Transient manager searches should not cross tiled frames + * unless explicitly floated. + */ + if(framemode_is_floating(frame_mode(frame)) || + extl_table_is_bool_set(transient->proptab, "float")){ + return region_prepare_manage_transient_default((WRegion*)frame, + transient, + param, + unused); + }else{ + return NULL; + } } @@ -853,16 +940,10 @@ WRegion *frame_load(WWindow *par, const WFitParams *fp, ExtlTab tab) WFrame *frame; if(!extl_table_gets_i(tab, "mode", &mode)){ - #warning "TODO: Remove backwards compatibility hack" - char *style=NULL; - if(extl_table_gets_s(tab, "frame_style", &style)){ - if(strcmp(style, "frame-tiled")==0) - mode=FRAME_MODE_TILED; - else if(strcmp(style, "frame-floating")==0) - mode=FRAME_MODE_FLOATING; - else if(strcmp(style, "frame-transientcontainer")==0) - mode=FRAME_MODE_TRANSIENT; - free(style); + char *tmp; + if(extl_table_gets_s(tab, "mode", &tmp)){ + mode=stringintmap_value(frame_modes, tmp, mode); + free(tmp); } } @@ -871,6 +952,19 @@ WRegion *frame_load(WWindow *par, const WFitParams *fp, ExtlTab tab) if(frame!=NULL) frame_do_load(frame, tab); + if(DEST_EMPTY(frame) && frame->mplex.mgd==NULL){ + if(frame->mplex.misc_phs!=NULL){ + /* Session management hack */ + WFramedPHolder *fph; + fph=frame_make_recreate_pholder(frame, ioncore_get_load_pholder()); + if(fph!=NULL) + mplex_migrate_phs_to_fph(&frame->mplex, fph); + } + + destroy_obj((Obj*)frame); + return NULL; + } + return (WRegion*)frame; } @@ -907,14 +1001,21 @@ static DynFunTab frame_dynfuntab[]={ {(DynFun*)region_fitrep, (DynFun*)frame_fitrep}, + + {(DynFun*)region_managed_disposeroot, + (DynFun*)frame_managed_disposeroot}, {region_managed_rqgeom_absolute, frame_managed_rqgeom_absolute}, - {region_managed_remove, frame_managed_remove}, - {(DynFun*)mplex_default_index, (DynFun*)frame_default_index}, + + {(DynFun*)region_prepare_manage_transient, + (DynFun*)frame_prepare_manage_transient}, + + {(DynFun*)region_rescue_clientwins, + (DynFun*)frame_rescue_clientwins}, END_DYNFUNTAB };