Include mod_xrandr instead of using submodules
[notion/jeffpc.git] / ioncore / region.c
blob9f2b6880eb71723ce57ae1433321a278abee6df0
1 /*
2 * ion/ioncore/region.c
4 * Copyright (c) Tuomo Valkonen 1999-2009.
6 * See the included file LICENSE for details.
7 */
9 #include <string.h>
11 #include <X11/Xatom.h>
13 #include <libtu/objp.h>
14 #include <libextl/extl.h>
15 #include <libmainloop/defer.h>
17 #include "property.h"
18 #include "common.h"
19 #include "global.h"
20 #include "region.h"
21 #include "focus.h"
22 #include "regbind.h"
23 #include "names.h"
24 #include "resize.h"
25 #include "manage.h"
26 #include "extlconv.h"
27 #include "activity.h"
28 #include "region-iter.h"
29 #include "return.h"
30 #include "key.h"
33 #define D2(X)
36 WHook *region_notify_hook=NULL;
39 static void region_notify_change_(WRegion *reg, WRegionNotify how);
42 /*{{{ Init & deinit */
45 void region_init(WRegion *reg, WWindow *par, const WFitParams *fp)
47 if(fp->g.w<0 || fp->g.h<0)
48 warn(TR("Creating region with negative width or height!"));
50 reg->geom=fp->g;
51 reg->flags=0;
52 reg->bindings=NULL;
53 reg->rootwin=NULL;
55 reg->children=NULL;
56 reg->parent=NULL;
57 reg->p_next=NULL;
58 reg->p_prev=NULL;
60 reg->active_sub=NULL;
61 reg->active_prev=NULL;
62 reg->active_next=NULL;
64 reg->ni.name=NULL;
65 reg->ni.inst_off=0;
66 reg->ni.node=NULL;
68 reg->manager=NULL;
70 reg->submapstat=NULL;
72 reg->mgd_activity=FALSE;
74 if(par!=NULL){
75 reg->rootwin=((WRegion*)par)->rootwin;
76 region_set_parent(reg, par);
77 }else{
78 assert(OBJ_IS(reg, WRootWin));
83 static void destroy_children(WRegion *reg)
85 WRegion *sub, *prev=NULL;
86 bool complained=FALSE;
88 /* destroy children */
89 while(1){
90 sub=reg->children;
91 if(sub==NULL)
92 break;
93 assert(!OBJ_IS_BEING_DESTROYED(sub));
94 assert(sub!=prev);
95 if(ioncore_g.opmode!=IONCORE_OPMODE_DEINIT && !complained && OBJ_IS(reg, WClientWin)){
96 warn(TR("Destroying object \"%s\" with client windows as "
97 "children."), region_name(reg));
98 complained=TRUE;
100 prev=sub;
101 destroy_obj((Obj*)sub);
106 void region_deinit(WRegion *reg)
108 region_notify_change(reg, ioncore_g.notifies.deinit);
110 destroy_children(reg);
112 if(ioncore_g.focus_next==reg){
113 D(warn("Region to be focused next destroyed[1]."));
114 ioncore_g.focus_next=NULL;
117 assert(reg->submapstat==NULL);
118 /*region_free_submapstat(reg);*/
119 region_detach_manager(reg);
120 region_unset_return(reg);
121 region_unset_parent(reg);
122 region_remove_bindings(reg);
124 region_unregister(reg);
126 region_focuslist_deinit(reg);
128 if(ioncore_g.focus_next==reg){
129 D(warn("Region to be focused next destroyed[2]."));
130 ioncore_g.focus_next=NULL;
135 /*}}}*/
138 /*{{{ Dynfuns */
141 bool region_fitrep(WRegion *reg, WWindow *par, const WFitParams *fp)
143 bool ret=FALSE;
144 CALL_DYN_RET(ret, bool, region_fitrep, reg, (reg, par, fp));
145 return ret;
149 void region_updategr(WRegion *reg)
151 CALL_DYN(region_updategr, reg, (reg));
155 void region_map(WRegion *reg)
157 CALL_DYN(region_map, reg, (reg));
158 region_notify_change_(reg, ioncore_g.notifies.map);
162 void region_unmap(WRegion *reg)
164 CALL_DYN(region_unmap, reg, (reg));
165 region_notify_change_(reg, ioncore_g.notifies.unmap);
169 void region_notify_rootpos(WRegion *reg, int x, int y)
171 CALL_DYN(region_notify_rootpos, reg, (reg, x, y));
175 Window region_xwindow(const WRegion *reg)
177 Window ret=None;
178 CALL_DYN_RET(ret, Window, region_xwindow, reg, (reg));
179 return ret;
183 void region_activated(WRegion *reg)
185 CALL_DYN(region_activated, reg, (reg));
189 void region_inactivated(WRegion *reg)
191 CALL_DYN(region_inactivated, reg, (reg));
195 void region_do_set_focus(WRegion *reg, bool warp)
197 CALL_DYN(region_do_set_focus, reg, (reg, warp));
201 /*{{{ Manager region dynfuns */
204 static bool region_managed_prepare_focus_default(WRegion *mgr, WRegion *reg,
205 int flags,
206 WPrepareFocusResult *res)
208 if(!region_prepare_focus(mgr, flags, res))
209 return FALSE;
211 res->reg=reg;
212 res->flags=flags;
213 return TRUE;
217 bool region_managed_prepare_focus(WRegion *mgr, WRegion *reg,
218 int flags,
219 WPrepareFocusResult *res)
221 bool ret=TRUE;
222 CALL_DYN_RET(ret, bool, region_managed_prepare_focus, mgr,
223 (mgr, reg, flags, res));
224 return ret;
228 void region_managed_notify(WRegion *mgr, WRegion *reg, WRegionNotify how)
230 CALL_DYN(region_managed_notify, mgr, (mgr, reg, how));
234 void region_managed_remove(WRegion *mgr, WRegion *reg)
236 CALL_DYN(region_managed_remove, mgr, (mgr, reg));
240 /*EXTL_DOC
241 * Return the object, if any, that is considered ``currently active''
242 * within the objects managed by \var{mplex}.
244 EXTL_SAFE
245 EXTL_EXPORT_MEMBER
246 WRegion *region_current(WRegion *mgr)
248 WRegion *ret=NULL;
249 CALL_DYN_RET(ret, WRegion*, region_current, mgr, (mgr));
250 return ret;
254 void region_child_removed(WRegion *reg, WRegion *sub)
256 CALL_DYN(region_child_removed, reg, (reg, sub));
260 /*}}}*/
263 /*{{{ Dynfun defaults */
266 void region_updategr_default(WRegion *reg)
268 WRegion *sub=NULL;
270 FOR_ALL_CHILDREN(reg, sub){
271 region_updategr(sub);
276 /*}}}*/
279 /*}}}*/
282 /*{{{ Goto */
285 bool region_prepare_focus(WRegion *reg, int flags,
286 WPrepareFocusResult *res)
289 if(TRUE /* !REGION_IS_ACTIVE(reg) ||
290 !REGION_IS_MAPPED(reg) ||
291 ioncore_g.focus_next!=NULL*/){
292 WRegion *mgr=REGION_MANAGER(reg);
293 WRegion *par=REGION_PARENT_REG(reg);
295 if(mgr!=NULL){
296 return region_managed_prepare_focus(mgr, reg, flags, res);
297 }else if(par!=NULL){
298 if(!region_prepare_focus(par, flags, res))
299 return FALSE;
300 /* Just focus reg, if it has no manager, and parent can be
301 * focused.
303 }else if(!REGION_IS_MAPPED(reg)){
304 region_map(reg);
308 res->reg=reg;
309 res->flags=flags;
310 return TRUE;
314 bool region_goto_flags(WRegion *reg, int flags)
316 WPrepareFocusResult res;
317 bool ret;
319 ret=region_prepare_focus(reg, flags, &res);
321 if(res.reg!=NULL){
322 if(res.flags&REGION_GOTO_FOCUS)
323 region_maybewarp(res.reg, !(res.flags&REGION_GOTO_NOWARP));
326 return ret;
330 /*EXTL_DOC
331 * Attempt to display \var{reg}, save region activity status and then
332 * warp to (or simply set focus to if warping is disabled) \var{reg}.
334 * Note that this function is asynchronous; the region will not
335 * actually have received the focus when this function returns.
337 EXTL_EXPORT_MEMBER
338 bool region_goto_focus(WRegion *reg)
340 return region_goto_flags(reg, REGION_GOTO_FOCUS);
343 /*EXTL_DOC
344 * Deprecated in favour of \fnref{WRegion.goto_focus} because 'goto' is a
345 * keyword since Lua 5.2.
347 EXTL_EXPORT_MEMBER
348 bool region_goto(WRegion *reg)
350 return region_goto_focus(reg);
354 * Kept for backwards compatibility
356 EXTL_EXPORT_MEMBER
357 bool region_goto_(WRegion *reg)
359 return region_goto_focus(reg);
363 * Kept for backwards compatibility
365 EXTL_EXPORT_MEMBER
366 bool region_display(WRegion *reg)
368 return region_goto_focus(reg);
372 /*}}}*/
375 /*{{{ Fit/reparent */
378 void region_fit(WRegion *reg, const WRectangle *geom, WRegionFitMode mode)
380 WFitParams fp;
381 fp.g=*geom;
382 fp.mode=mode&~REGION_FIT_GRAVITY;
383 fp.gravity=ForgetGravity;
384 region_fitrep(reg, NULL, &fp);
388 bool region_reparent(WRegion *reg, WWindow *par,
389 const WRectangle *geom, WRegionFitMode mode)
391 WFitParams fp;
392 fp.g=*geom;
393 fp.mode=mode;
394 return region_fitrep(reg, par, &fp);
398 /*}}}*/
401 /*{{{ Close */
404 static void region_rqclose_default(WRegion *reg, bool relocate)
406 if(relocate || region_may_dispose(reg))
407 region_defer_rqdispose(reg);
411 /*EXTL_DOC
412 * Attempt to close/destroy \var{reg}. Whether this operation works
413 * depends on whether the particular type of region in question has
414 * implemented the feature and, in case of client windows, whether
415 * the client supports the \code{WM_DELETE} protocol (see also
416 * \fnref{WClientWin.kill}). The region will not be destroyed when
417 * this function returns. To find out if and when it is destroyed,
418 * use the \codestr{deinit} notification. If \var{relocate} is not set,
419 * and \var{reg} manages other regions, it will not be closed. Otherwise
420 * the managed regions will be attempted to be relocated.
422 EXTL_EXPORT_MEMBER
423 void region_rqclose(WRegion *reg, bool relocate)
425 CALL_DYN(region_rqclose, reg, (reg, relocate));
429 static WRegion *region_rqclose_propagate_default(WRegion *reg,
430 WRegion *maybe_sub)
432 if(maybe_sub==NULL)
433 maybe_sub=region_current(reg);
435 if(maybe_sub!=NULL){
436 return region_rqclose_propagate(maybe_sub, NULL);
437 }else{
438 region_rqclose(reg, FALSE);
439 return reg;
444 /*EXTL_DOC
445 * Recursively attempt to close a region or one of the regions managed by
446 * it. If \var{sub} is set, it will be used as the managed region, otherwise
447 * \fnref{WRegion.current}\code{(reg)}. The object to be closed is
448 * returned, or NULL if nothing can be closed. For further details, see
449 * notes for \fnref{WRegion.rqclose}.
451 EXTL_EXPORT_MEMBER
452 WRegion *region_rqclose_propagate(WRegion *reg, WRegion *maybe_sub)
454 WRegion *ret=NULL;
455 CALL_DYN_RET(ret, WRegion*, region_rqclose_propagate, reg,
456 (reg, maybe_sub));
457 return ret;
461 bool region_may_dispose_default(WRegion *reg)
463 bool res=region_rescue_needed(reg);
465 if(res){
466 const char *name=region_name(reg);
467 warn(TR("Can not destroy %s: contains client windows."),
468 (name!=NULL ? name : TR("(unknown)")));
471 return !res;
475 bool region_may_dispose(WRegion *reg)
477 bool ret=TRUE;
478 CALL_DYN_RET(ret, bool, region_may_dispose, reg, (reg));
479 return ret;
483 static WRegion *region_managed_disposeroot_default(WRegion *mgr, WRegion *reg)
485 return reg;
489 WRegion *region_managed_disposeroot(WRegion *mgr, WRegion *reg)
491 WRegion *ret=NULL;
492 CALL_DYN_RET(ret, WRegion*, region_managed_disposeroot, mgr, (mgr, reg));
493 return ret;
497 WRegion *region_disposeroot(WRegion *reg)
499 WRegion *mgr=REGION_MANAGER(reg);
501 return (mgr!=NULL
502 ? region_managed_disposeroot(mgr, reg)
503 : reg);
507 bool region_rqdispose(WRegion *reg)
509 WRegion *root;
511 if(!region_may_dispose(reg))
512 return FALSE;
514 root=region_disposeroot(reg);
516 if(root==NULL)
517 return FALSE;
519 return region_dispose(root);
523 bool region_dispose_(WRegion *reg, bool not_simple)
525 bool rescue=not_simple;
526 bool was_mcf=(not_simple && region_may_control_focus(reg));
527 WPHolder *ph=NULL;
529 if(rescue){
530 if(!region_rescue(reg, NULL, 0)){
531 warn(TR("Failed to rescue some client windows - not closing."));
532 return FALSE;
536 if(was_mcf)
537 ph=region_unset_get_return(reg);
539 destroy_obj((Obj*)reg);
541 if(ph!=NULL){
542 pholder_goto(ph);
543 destroy_obj((Obj*)ph);
546 return TRUE;
550 bool region_dispose(WRegion *reg)
552 return region_dispose_(reg, TRUE);
556 void region_defer_rqdispose(WRegion *reg)
558 mainloop_defer_action((Obj*)reg, (WDeferredAction*)region_rqdispose);
562 /*}}}*/
565 /*{{{ Manager/parent stuff */
568 /* Routine to call to unmanage a region */
569 void region_detach_manager(WRegion *reg)
571 WRegion *mgr=REGION_MANAGER(reg);
573 if(mgr==NULL)
574 return;
576 region_managed_remove(mgr, reg);
578 assert(REGION_MANAGER(reg)==NULL);
582 void region_unset_manager_pseudoactivity(WRegion *reg)
584 WRegion *mgr=reg->manager, *par=REGION_PARENT_REG(reg);
586 if(mgr==NULL || mgr==par || !REGION_IS_PSEUDOACTIVE(mgr))
587 return;
589 mgr->flags&=~REGION_PSEUDOACTIVE;
591 region_notify_change(mgr, ioncore_g.notifies.pseudoinactivated);
593 region_unset_manager_pseudoactivity(mgr);
597 void region_set_manager_pseudoactivity(WRegion *reg)
599 WRegion *mgr=reg->manager, *par=REGION_PARENT_REG(reg);
601 if(!REGION_IS_ACTIVE(reg) && !REGION_IS_PSEUDOACTIVE(reg))
602 return;
604 if(mgr==NULL || mgr==par || REGION_IS_PSEUDOACTIVE(mgr))
605 return;
607 mgr->flags|=REGION_PSEUDOACTIVE;
609 region_notify_change(mgr, ioncore_g.notifies.pseudoactivated);
611 region_set_manager_pseudoactivity(mgr);
615 /* This should only be called within region_managed_remove,
616 * _after_ any managed lists and other essential structures
617 * of mgr have been broken.
619 void region_unset_manager(WRegion *reg, WRegion *mgr)
621 if(reg->manager!=mgr)
622 return;
624 region_notify_change_(reg, ioncore_g.notifies.unset_manager);
626 region_unset_manager_pseudoactivity(reg);
628 reg->manager=NULL;
630 /* Reset status, as it is set by manager */
631 reg->flags&=~REGION_SKIP_FOCUS;
633 if(region_is_activity_r(reg))
634 region_clear_mgd_activity(mgr);
636 region_unset_return(reg);
640 /* This should be called within region attach routines,
641 * _after_ any managed lists and other essential structures
642 * of mgr have been set up.
644 void region_set_manager(WRegion *reg, WRegion *mgr)
646 assert(reg->manager==NULL);
648 reg->manager=mgr;
650 region_set_manager_pseudoactivity(reg);
652 if(region_is_activity_r(reg))
653 region_mark_mgd_activity(mgr);
655 region_notify_change_(reg, ioncore_g.notifies.set_manager);
659 void region_set_parent(WRegion *reg, WWindow *parent)
661 assert(reg->parent==NULL && parent!=NULL);
662 LINK_ITEM(((WRegion*)parent)->children, reg, p_next, p_prev);
663 reg->parent=parent;
667 void region_unset_parent(WRegion *reg)
669 WRegion *p=REGION_PARENT_REG(reg);
671 if(p==NULL || p==reg)
672 return;
674 UNLINK_ITEM(p->children, reg, p_next, p_prev);
675 reg->parent=NULL;
677 if(p->active_sub==reg){
678 p->active_sub=NULL;
679 region_update_owned_grabs(p);
682 region_child_removed(p, reg);
686 /*EXTL_DOC
687 * Returns the region that manages \var{reg}.
689 EXTL_SAFE
690 EXTL_EXPORT_MEMBER
691 WRegion *region_manager(WRegion *reg)
693 return reg->manager;
697 /*EXTL_DOC
698 * Returns the parent region of \var{reg}.
700 EXTL_SAFE
701 EXTL_EXPORT_MEMBER
702 WWindow *region_parent(WRegion *reg)
704 return reg->parent;
708 WRegion *region_manager_or_parent(WRegion *reg)
710 if(reg->manager!=NULL)
711 return reg->manager;
712 else
713 return (WRegion*)(reg->parent);
717 WRegion *region_get_manager_chk(WRegion *p, const ClassDescr *descr)
719 WRegion *mgr=NULL;
721 if(p!=NULL){
722 mgr=REGION_MANAGER(p);
723 if(obj_is((Obj*)mgr, descr))
724 return mgr;
727 return NULL;
730 /*}}}*/
733 /*{{{ Stacking and ordering */
736 static void region_stacking_default(WRegion *reg,
737 Window *bottomret, Window *topret)
739 Window win=region_xwindow(reg);
740 *bottomret=win;
741 *topret=win;
745 void region_stacking(WRegion *reg, Window *bottomret, Window *topret)
747 CALL_DYN(region_stacking, reg, (reg, bottomret, topret));
751 void region_restack(WRegion *reg, Window other, int mode)
753 CALL_DYN(region_restack, reg, (reg, other, mode));
758 bool region_managed_rqorder(WRegion *reg, WRegion *sub, WRegionOrder order)
760 bool ret=FALSE;
761 CALL_DYN_RET(ret, bool, region_managed_rqorder, reg, (reg, sub, order));
762 return ret;
766 bool region_rqorder(WRegion *reg, WRegionOrder order)
768 WRegion *mgr=REGION_MANAGER(reg);
770 if(mgr==NULL)
771 return FALSE;
772 else
773 return region_managed_rqorder(mgr, reg, order);
777 /*EXTL_DOC
778 * Request ordering. Currently supported values for \var{ord}
779 * are \codestr{front} and \codestr{back}.
781 EXTL_EXPORT_AS(WRegion, rqorder)
782 bool region_rqorder_extl(WRegion *reg, const char *ord)
784 WRegionOrder order;
786 if(strcmp(ord, "front")==0){
787 order=REGION_ORDER_FRONT;
788 }else if(strcmp(ord, "back")==0){
789 order=REGION_ORDER_BACK;
790 }else{
791 return FALSE;
794 return region_rqorder(reg, order);
798 /*}}}*/
801 /*{{{ Misc. */
804 /*EXTL_DOC
805 * Returns the root window \var{reg} is on.
807 EXTL_SAFE
808 EXTL_EXPORT_MEMBER
809 WRootWin *region_rootwin_of(const WRegion *reg)
811 WRootWin *rw;
812 assert(reg!=NULL); /* Lua interface should not pass NULL reg. */
813 rw=(WRootWin*)(reg->rootwin);
814 assert(rw!=NULL);
815 return rw;
819 /*EXTL_DOC
820 * Returns the screen \var{reg} is on.
822 EXTL_SAFE
823 EXTL_EXPORT_MEMBER
824 WScreen *region_screen_of(WRegion *reg)
826 while(reg!=NULL){
827 if(OBJ_IS(reg, WScreen))
828 return (WScreen*)reg;
829 reg=REGION_PARENT_REG(reg);
831 return NULL;
835 Window region_root_of(const WRegion *reg)
837 return WROOTWIN_ROOT(region_rootwin_of(reg));
841 bool region_same_rootwin(const WRegion *reg1, const WRegion *reg2)
843 return (reg1->rootwin==reg2->rootwin);
847 /*EXTL_DOC
848 * Is \var{reg} visible/is it and all it's ancestors mapped?
850 EXTL_SAFE
851 EXTL_EXPORT_AS(WRegion, is_mapped)
852 bool region_is_fully_mapped(WRegion *reg)
854 for(; reg!=NULL; reg=REGION_PARENT_REG(reg)){
855 if(!REGION_IS_MAPPED(reg))
856 return FALSE;
859 return TRUE;
863 void region_rootpos(WRegion *reg, int *xret, int *yret)
865 WRegion *par;
867 par=REGION_PARENT_REG(reg);
869 if(par==NULL || par==reg){
870 *xret=0;
871 *yret=0;
872 return;
875 region_rootpos(par, xret, yret);
877 *xret+=REGION_GEOM(reg).x;
878 *yret+=REGION_GEOM(reg).y;
882 typedef struct{
883 WRegion *reg;
884 WRegionNotify how;
885 } MRSHP;
888 static bool mrsh_notify_change(WHookDummy *fn, void *p_)
890 MRSHP *p=(MRSHP*)p_;
892 fn(p->reg, p->how);
894 return TRUE;
898 static bool mrshe_notify_change(ExtlFn fn, void *p_)
900 MRSHP *p=(MRSHP*)p_;
902 extl_call(fn, "os", NULL, p->reg, stringstore_get(p->how));
904 return TRUE;
908 static void region_notify_change_(WRegion *reg, WRegionNotify how)
910 MRSHP p;
912 p.reg=reg;
913 p.how=how;
915 extl_protect(NULL);
916 hook_call(region_notify_hook, &p, mrsh_notify_change, mrshe_notify_change),
917 extl_unprotect(NULL);
921 void region_notify_change(WRegion *reg, WRegionNotify how)
923 WRegion *mgr=REGION_MANAGER(reg);
925 if(mgr!=NULL)
926 region_managed_notify(mgr, reg, how);
928 region_notify_change_(reg, how);
932 /*EXTL_DOC
933 * Returns the geometry of \var{reg} within its parent; a table with fields
934 * \var{x}, \var{y}, \var{w} and \var{h}.
936 EXTL_SAFE
937 EXTL_EXPORT_MEMBER
938 ExtlTab region_geom(WRegion *reg)
940 return extl_table_from_rectangle(&REGION_GEOM(reg));
944 bool region_handle_drop(WRegion *reg, int x, int y, WRegion *dropped)
946 bool ret=FALSE;
947 CALL_DYN_RET(ret, bool, region_handle_drop, reg, (reg, x, y, dropped));
948 return ret;
952 WRegion *region_managed_within(WRegion *reg, WRegion *mgd)
954 while(mgd!=NULL &&
955 (REGION_PARENT_REG(mgd)==reg ||
956 REGION_PARENT_REG(mgd)==REGION_PARENT_REG(reg))){
958 if(REGION_MANAGER(mgd)==reg)
959 return mgd;
960 mgd=REGION_MANAGER(mgd);
963 return NULL;
966 void ioncore_region_notify(WRegion *reg, WRegionNotify how)
968 const char *p[1];
970 if(how==ioncore_g.notifies.name && obj_is((Obj*)reg, &CLASSDESCR(WWindow))){
971 p[0] = region_name(reg);
972 xwindow_set_text_property(((WWindow*)reg)->win, XA_WM_NAME, p, 1);
976 /*}}}*/
979 /*{{{ Dynamic function table and class implementation */
982 static DynFunTab region_dynfuntab[]={
983 {region_managed_rqgeom,
984 region_managed_rqgeom_allow},
986 {region_managed_rqgeom_absolute,
987 region_managed_rqgeom_absolute_default},
989 {region_updategr,
990 region_updategr_default},
992 {(DynFun*)region_rescue_clientwins,
993 (DynFun*)region_rescue_child_clientwins},
995 {(DynFun*)region_may_dispose,
996 (DynFun*)region_may_dispose_default},
998 {(DynFun*)region_prepare_manage,
999 (DynFun*)region_prepare_manage_default},
1001 {(DynFun*)region_prepare_manage_transient,
1002 (DynFun*)region_prepare_manage_transient_default},
1004 {(DynFun*)region_managed_prepare_focus,
1005 (DynFun*)region_managed_prepare_focus_default},
1007 {(DynFun*)region_managed_disposeroot,
1008 (DynFun*)region_managed_disposeroot_default},
1010 {(DynFun*)region_rqclose_propagate,
1011 (DynFun*)region_rqclose_propagate_default},
1013 {(DynFun*)region_rqclose,
1014 (DynFun*)region_rqclose_default},
1016 {(DynFun*)region_displayname,
1017 (DynFun*)region_name},
1019 {region_stacking,
1020 region_stacking_default},
1022 END_DYNFUNTAB
1026 EXTL_EXPORT
1027 IMPLCLASS(WRegion, Obj, region_deinit, region_dynfuntab);
1030 /*}}}*/