UI:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 25 Mar 2009 20:49:15 +0000 (20:49 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Wed, 25 Mar 2009 20:49:15 +0000 (20:49 +0000)
* Screen level regions created for menus are now a separate
  CTX_wm_menu in the context, so they don't interfere with
  existing regions.
* Fix context in popup menus to always come from the area
  and region the popup was opened from.
* Removed some unused context stuff: tasks and reports.
  The places that were using context reports were using it
  wrong anyway.
* Fix F6 closing immediately after editing a button, by
  making uiBlockSetFlag not clear existing flags anymore.
* Don't use ":" in boolean X/Y/Z buttons.

13 files changed:
source/blender/blenkernel/BKE_context.h
source/blender/blenkernel/intern/blender.c
source/blender/blenkernel/intern/context.c
source/blender/editors/include/UI_interface.h
source/blender/editors/interface/interface.c
source/blender/editors/interface/interface_handlers.c
source/blender/editors/interface/interface_layout.c
source/blender/editors/interface/interface_regions.c
source/blender/editors/screen/screen_ops.c
source/blender/editors/transform/transform_conversions.c
source/blender/windowmanager/intern/wm_draw.c
source/blender/windowmanager/intern/wm_event_system.c
source/blender/windowmanager/wm_event_system.h

index dbe5c610688b52e4fbb5b8f0fd7bf1c2d99ff482..f08b14c7820cd7482d0a67f02562f3c97206b2da 100644 (file)
@@ -77,23 +77,7 @@ typedef int (*bContextDataCallback)(const bContext *C,
 bContext *CTX_create(void);
 void CTX_free(bContext *C);
 
-bContext *CTX_copy(const bContext *C, int thread);
-int CTX_thread(const bContext *C);
-
-/* Context Task and Reports */
-
-typedef enum bContextTask {
-       CTX_DRAWING = 0,
-       CTX_EDITING = 1,
-       CTX_EVALUATING = 2,
-       CTX_UNDEFINED = 3
-} bContextTask;
-
-bContextTask CTX_task(const bContext *C);
-void CTX_task_set(bContext *C, bContextTask task);
-
-struct ReportList *CTX_reports(const bContext *C);
-void CTX_reports_set(bContext *C, struct ReportList *reports);
+bContext *CTX_copy(const bContext *C);
 
 /* Window Manager Context */
 
@@ -104,7 +88,7 @@ struct ScrArea *CTX_wm_area(const bContext *C);
 struct SpaceLink *CTX_wm_space_data(const bContext *C);
 struct ARegion *CTX_wm_region(const bContext *C);
 void *CTX_wm_region_data(const bContext *C);
-struct uiBlock *CTX_wm_ui_block(const bContext *C);
+struct ARegion *CTX_wm_menu(const bContext *C);
 
 struct View3D *CTX_wm_view3d(const bContext *C);
 struct RegionView3D *CTX_wm_region_view3d(const bContext *C);
@@ -114,9 +98,9 @@ struct SpaceImage *CTX_wm_space_image(const bContext *C);
 void CTX_wm_manager_set(bContext *C, struct wmWindowManager *wm);
 void CTX_wm_window_set(bContext *C, struct wmWindow *win);
 void CTX_wm_screen_set(bContext *C, struct bScreen *screen); /* to be removed */
-void CTX_wm_area_set(bContext *C, struct ScrArea *win);
-void CTX_wm_region_set(bContext *C, struct ARegion *win);
-void CTX_wm_ui_block_set(bContext *C, struct uiBlock *block, bContextDataCallback cb);
+void CTX_wm_area_set(bContext *C, struct ScrArea *sa);
+void CTX_wm_region_set(bContext *C, struct ARegion *region);
+void CTX_wm_menu_set(bContext *C, struct ARegion *menu);
 
 /* Data Context
 
@@ -194,13 +178,6 @@ struct bPoseChannel *CTX_data_active_pchan(const bContext *C);
 int CTX_data_selected_pchans(const bContext *C, ListBase *list);
 int CTX_data_visible_pchans(const bContext *C, ListBase *list);
 
-/* Data Evaluation Context */
-
-float CTX_eval_frame(const bContext *C);
-
-int CTX_eval_render_resolution(const bContext *C);
-void CTX_eval_render_resolution_set(bContext *C, int render);
-
 #ifdef __cplusplus
 }
 #endif
index be64faec3cfb085b0074509e338368aa32bf2e3a..2033250585d70476a644eba3fc215aef5f8bdfcc 100644 (file)
@@ -348,7 +348,7 @@ static void setup_app_data(bContext *C, BlendFileData *bfd, char *filename)
                CTX_data_scene_set(C, bfd->curscreen->scene);
                CTX_wm_area_set(C, NULL);
                CTX_wm_region_set(C, NULL);
-               CTX_wm_ui_block_set(C, NULL, NULL);
+               CTX_wm_menu_set(C, NULL);
        }
        
        /* this can happen when active scene was lib-linked, and doesnt exist anymore */
index df71dd6037a574787d8cc0723f8a4029729c6857..47622611cb938e2b9bdcd75ee5b4e8df0ad742ef 100644 (file)
@@ -49,8 +49,6 @@
 /* struct */
 
 struct bContext {
-       bContextTask task;
-       ReportList *reports;
        int thread;
 
        /* windowmanager context */
@@ -60,9 +58,7 @@ struct bContext {
                struct bScreen *screen;
                struct ScrArea *area;
                struct ARegion *region;
-               struct uiBlock *block;
-
-               bContextDataCallback block_cb;
+               struct ARegion *menu;
        } wm;
        
        /* data context */
@@ -87,57 +83,21 @@ bContext *CTX_create()
        
        C= MEM_callocN(sizeof(bContext), "bContext");
 
-       C->task= CTX_UNDEFINED;
-       C->thread= 0;
-
        return C;
 }
 
-bContext *CTX_copy(const bContext *C, int thread)
+bContext *CTX_copy(const bContext *C)
 {
-       bContext *newC;
-
-       if(C->task != CTX_UNDEFINED)
-               BKE_report(C->reports, RPT_ERROR_INVALID_CONTEXT, "CTX_copy not allowed for this task");
-       
-       newC= MEM_dupallocN((void*)C);
-       newC->thread= thread;
+       bContext *newC= MEM_dupallocN((void*)C);
 
        return newC;
 }
 
-int CTX_thread(const bContext *C)
-{
-       return C->thread;
-}
-
 void CTX_free(bContext *C)
 {
        MEM_freeN(C);
 }
 
-/* context task and reports */
-
-bContextTask CTX_task(const bContext *C)
-{
-       return C->task;
-}
-
-void CTX_task_set(bContext *C, bContextTask task)
-{
-       C->task= task;
-}
-
-ReportList *CTX_reports(const bContext *C)
-{
-       return C->reports;
-}
-
-void CTX_reports_set(bContext *C, ReportList *reports)
-{
-       C->reports= reports;
-}
-
 /* window manager context */
 
 wmWindowManager *CTX_wm_manager(const bContext *C)
@@ -175,9 +135,9 @@ void *CTX_wm_region_data(const bContext *C)
        return (C->wm.region)? C->wm.region->regiondata: NULL;
 }
 
-struct uiBlock *CTX_wm_ui_block(const bContext *C)
+struct ARegion *CTX_wm_menu(const bContext *C)
 {
-       return C->wm.block;
+       return C->wm.menu;
 }
 
 View3D *CTX_wm_view3d(const bContext *C)
@@ -246,10 +206,9 @@ void CTX_wm_region_set(bContext *C, ARegion *region)
        C->wm.region= region;
 }
 
-void CTX_wm_ui_block_set(bContext *C, struct uiBlock *block, bContextDataCallback cb)
+void CTX_wm_menu_set(bContext *C, ARegion *menu)
 {
-       C->wm.block= block;
-       C->wm.block_cb= cb;
+       C->wm.menu= menu;
 }
 
 /* data context utility functions */
@@ -267,23 +226,19 @@ static int ctx_data_get(bContext *C, const char *member, bContextDataResult *res
 
        /* we check recursion to ensure that we do not get infinite
         * loops requesting data from ourselfs in a context callback */
-       if(!done && recursion < 1 && C->wm.block) {
+       if(!done && recursion < 1 && C->wm.region) {
                C->data.recursion= 1;
-               done= C->wm.block_cb(C, member, result);
-       }
-       if(!done && recursion < 2 && C->wm.region) {
-               C->data.recursion= 2;
                if(C->wm.region->type && C->wm.region->type->context)
                        done= C->wm.region->type->context(C, member, result);
        }
-       if(!done && recursion < 3 && C->wm.area) {
-               C->data.recursion= 3;
+       if(!done && recursion < 2 && C->wm.area) {
+               C->data.recursion= 2;
                if(C->wm.area->type && C->wm.area->type->context)
                        done= C->wm.area->type->context(C, member, result);
        }
-       if(!done && recursion < 4 && C->wm.screen) {
+       if(!done && recursion < 3 && C->wm.screen) {
                bContextDataCallback cb= C->wm.screen->context;
-               C->data.recursion= 4;
+               C->data.recursion= 3;
                if(cb)
                        done= cb(C, member, result);
        }
@@ -562,21 +517,3 @@ int CTX_data_visible_pchans(const bContext *C, ListBase *list)
        return ctx_data_collection_get(C, "visible_pchans", list);
 }
 
-
-/* data evaluation */
-
-float CTX_eval_frame(const bContext *C)
-{
-       return (C->data.scene)? C->data.scene->r.cfra: 0.0f;
-}
-
-int CTX_eval_render_resolution(const bContext *C)
-{
-       return C->eval.render;
-}
-
-void CTX_eval_render_resolution_set(bContext *C, int render)
-{
-       C->eval.render= render;
-}
-
index a93a0f1341d2bfac4b4c5ae5c725a7ce7b2a2ef6..234226f63cc56c083ffbb535aff8b8935a59c697 100644 (file)
@@ -313,6 +313,7 @@ void        uiBlockSetEmboss        (uiBlock *block, int emboss);
 void   uiBlockSetDirection     (uiBlock *block, int direction);
 void   uiBlockFlipOrder        (uiBlock *block);
 void   uiBlockSetFlag          (uiBlock *block, int flag);
+void   uiBlockClearFlag        (uiBlock *block, int flag);
 void   uiBlockSetXOfs          (uiBlock *block, int xofs);
 
 int            uiButGetRetVal          (uiBut *but);
@@ -515,7 +516,7 @@ extern void uiSetPanelHandler(int);
 
 void UI_add_region_handlers(struct ListBase *handlers);
 void UI_add_area_handlers(struct ListBase *handlers);
-void UI_add_popup_handlers(struct ListBase *handlers, uiPopupBlockHandle *menu);
+void UI_add_popup_handlers(struct bContext *C, struct ListBase *handlers, uiPopupBlockHandle *menu);
 
 /* Legacy code
  * Callbacks and utils to get 2.48 work */
index 2f78c4e8ffff2fdcb70e1ed274f7651819f0784d..5bb7ca05feeda1a84c5a19f8a275fd44476b13ed 100644 (file)
@@ -634,9 +634,14 @@ void uiEndBlock(const bContext *C, uiBlock *block)
 
 void uiDrawBlock(const bContext *C, uiBlock *block)
 {
-       ARegion *ar= CTX_wm_region(C);
+       ARegion *ar;
        uiBut *but;
 
+       /* get menu region or area region */
+       ar= CTX_wm_menu(C);
+       if(!ar)
+               ar= CTX_wm_region(C);
+
        if(!block->endblock)
                uiEndBlock(C, block);
 
@@ -646,11 +651,11 @@ void uiDrawBlock(const bContext *C, uiBlock *block)
        if(block->flag & UI_BLOCK_LOOP)
                uiDrawMenuBox(block->minx, block->miny, block->maxx, block->maxy, block->flag, block->direction);
        else if(block->panel)
-               ui_draw_panel(CTX_wm_region(C), block);
+               ui_draw_panel(ar, block);
 
        if(block->drawextra) block->drawextra(C, block);
 
-       for (but= block->buttons.first; but; but= but->next)
+       for(but= block->buttons.first; but; but= but->next)
                ui_draw_but(ar, but);
 
        ui_draw_links(block);
@@ -2306,7 +2311,11 @@ uiBut *ui_def_but_rna(uiBlock *block, int type, int retval, char *str, short x1,
        if(prop) {
                but->rnapoin= *ptr;
                but->rnaprop= prop;
-               but->rnaindex= index;
+
+               if(RNA_property_array_length(&but->rnapoin, but->rnaprop))
+                       but->rnaindex= index;
+               else
+                       but->rnaindex= 0;
        }
        
        if (!prop || !RNA_property_editable(&but->rnapoin, prop)) {
@@ -2851,7 +2860,11 @@ void uiBlockFlipOrder(uiBlock *block)
 
 void uiBlockSetFlag(uiBlock *block, int flag)
 {
-       block->flag= flag;
+       block->flag|= flag;
+}
+void uiBlockClearFlag(uiBlock *block, int flag)
+{
+       block->flag&= ~flag;
 }
 void uiBlockSetXOfs(uiBlock *block, int xofs)
 {
index d7437565c9db824ceadc6d194b8b14a5e2721476..de1d14c14c60bfee843f3e9efe009d7a5e69c3d3 100644 (file)
@@ -2642,16 +2642,17 @@ static int ui_do_button(bContext *C, uiBlock *block, uiBut *but, wmEvent *event)
 
        /* verify if we can edit this button */
        if(ELEM(event->type, LEFTMOUSE, RETKEY)) {
+               /* this should become disabled button .. */
                if(but->lock) {
                        if(but->lockstr) {
-                               BKE_report(CTX_reports(C), RPT_WARNING, but->lockstr);
+                               BKE_report(NULL, RPT_WARNING, but->lockstr);
                                button_activate_state(C, but, BUTTON_STATE_EXIT);
                                return WM_UI_HANDLER_BREAK;
                        }
                } 
                else if(but->pointype && but->poin==0) {
                        /* there's a pointer needed */
-                       BKE_reportf(CTX_reports(C), RPT_WARNING, "DoButton pointer error: %s", but->str);
+                       BKE_reportf(NULL, RPT_WARNING, "DoButton pointer error: %s", but->str);
                        button_activate_state(C, but, BUTTON_STATE_EXIT);
                        return WM_UI_HANDLER_BREAK;
                }
@@ -3306,20 +3307,20 @@ static int ui_mouse_motion_towards_check(uiBlock *block, uiPopupBlockHandle *men
                return menu->dotowards;
        }
 
-       /* verify that we are moving closer towards one of the edges
-        * of the menu block, in other words, in the triangle formed
-        * by the initial mouse location and two edge points. */
-       p1[0]= block->minx;
-       p1[1]= block->miny;
+       /* verify that we are moving towards one of the edges of the
+        * menu block, in other words, in the triangle formed by the
+        * initial mouse location and two edge points. */
+       p1[0]= block->minx-20;
+       p1[1]= block->miny-20;
 
-       p2[0]= block->maxx;
-       p2[1]= block->miny;
+       p2[0]= block->maxx+20;
+       p2[1]= block->miny-20;
        
-       p3[0]= block->maxx;
-       p3[1]= block->maxy;
+       p3[0]= block->maxx+20;
+       p3[1]= block->maxy+20;
 
-       p4[0]= block->minx;
-       p4[1]= block->maxy;
+       p4[0]= block->minx-20;
+       p4[1]= block->maxy+20;
 
        oldp[0]= menu->towardsx;
        oldp[1]= menu->towardsy;
@@ -3327,11 +3328,14 @@ static int ui_mouse_motion_towards_check(uiBlock *block, uiPopupBlockHandle *men
        newp[0]= mx;
        newp[1]= my;
 
+       if(Vec2Lenf(oldp, newp) < 4.0f)
+               return menu->dotowards;
+
        closer= 0;
-       closer |= (PdistVL2Dfl(newp, p1, p2) < PdistVL2Dfl(oldp, p1, p2) + 4);
-       closer |= (PdistVL2Dfl(newp, p2, p3) < PdistVL2Dfl(oldp, p2, p3) + 4);
-       closer |= (PdistVL2Dfl(newp, p3, p4) < PdistVL2Dfl(oldp, p3, p4) + 4);
-       closer |= (PdistVL2Dfl(newp, p4, p1) < PdistVL2Dfl(oldp, p4, p1) + 4);
+       closer |= IsectPT2Df(newp, oldp, p1, p2);
+       closer |= IsectPT2Df(newp, oldp, p2, p3);
+       closer |= IsectPT2Df(newp, oldp, p3, p4);
+       closer |= IsectPT2Df(newp, oldp, p4, p1);
 
        if(!closer)
                menu->dotowards= 0;
@@ -3398,7 +3402,7 @@ int ui_handle_menu_event(bContext *C, wmEvent *event, uiPopupBlockHandle *menu,
                                                else but= ui_but_first(block);
                                        }
 
-                                       if(but && but->type==BLOCK)
+                                       if(but && ELEM(but->type, BLOCK, HMENU))
                                                ui_handle_button_activate(C, ar, but, BUTTON_ACTIVATE_OPEN);
                                }
 
@@ -3720,7 +3724,10 @@ static int ui_handler_region_menu(bContext *C, wmEvent *event, void *userdata)
 
        /* here we handle buttons at the window level, modal, for example
         * while number sliding, text editing, or when a menu block is open */
-       ar= CTX_wm_region(C);
+       ar= CTX_wm_menu(C);
+       if(!ar)
+               ar= CTX_wm_region(C);
+
        but= ui_but_find_activated(ar);
 
        if(but) {
@@ -3811,8 +3818,8 @@ void UI_add_region_handlers(ListBase *handlers)
        WM_event_add_ui_handler(NULL, handlers, ui_handler_region, ui_handler_remove_region, NULL);
 }
 
-void UI_add_popup_handlers(ListBase *handlers, uiPopupBlockHandle *menu)
+void UI_add_popup_handlers(bContext *C, ListBase *handlers, uiPopupBlockHandle *menu)
 {
-       WM_event_add_ui_handler(NULL, handlers, ui_handler_popup, ui_handler_remove_popup, menu);
+       WM_event_add_ui_handler(C, handlers, ui_handler_popup, ui_handler_remove_popup, menu);
 }
 
index 0abf952a8a441e01e750524e190f93706161fb2e..ea26bafc1f805189a83a45609f7307a0e0640155 100644 (file)
@@ -210,19 +210,28 @@ static void ui_item_array(uiBlock *block, uiItemRNA *rnaitem, int len, int x, in
        }
        else if(len <= 4 && ELEM3(subtype, PROP_ROTATION, PROP_VECTOR, PROP_COLOR)) {
                /* layout for known array subtypes */
-               static char *vectoritem[4]= {"X:", "Y:", "Z:", "W:"};
-               static char *quatitem[4]= {"W:", "X:", "Y:", "Z:"};
-               static char *coloritem[4]= {"R:", "G:", "B:", "A:"};
+               static char vectoritem[4]= {'X', 'Y', 'Z', 'W'};
+               static char quatitem[4]= {'W', 'X', 'Y', 'Z'};
+               static char coloritem[4]= {'R', 'G', 'B', 'A'};
+               char str[3];
 
                for(a=0; a<len; a++) {
                        if(len == 4 && subtype == PROP_ROTATION)
-                               name= quatitem[a];
+                               str[0]= quatitem[a];
                        else if(subtype == PROP_VECTOR || subtype == PROP_ROTATION)
-                               name= vectoritem[a];
+                               str[0]= vectoritem[a];
                        else
-                               name= coloritem[a];
+                               str[0]= coloritem[a];
 
-                       uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, a, name, 0, x, y+(len-a-1)*YIC, w, YIC);
+                       if(type == PROP_BOOLEAN) {
+                               str[1]= '\0';
+                       }
+                       else {
+                               str[1]= ':';
+                               str[2]= '\0';
+                       }
+
+                       uiDefAutoButR(block, &rnaitem->ptr, rnaitem->prop, a, str, 0, x, y+(len-a-1)*YIC, w, YIC);
                }
        }
        else {
index 06fddc48013205839c20b5c5ff1da8dcd012b2a9..f9a7934d5b30fbf91ac9fffe726a316afb527a8a 100644 (file)
@@ -2223,7 +2223,7 @@ void uiPupMenuEnd(bContext *C, uiMenuItem *head)
        menu= ui_popup_block_create(C, NULL, NULL, NULL, ui_block_func_MENU_ITEM, &info);
        menu->popup= 1;
        
-       UI_add_popup_handlers(&window->handlers, menu);
+       UI_add_popup_handlers(C, &window->handlers, menu);
        WM_event_add_mousemove(C);
        
        BLI_freelistN(&head->items);
@@ -2248,7 +2248,7 @@ static uiPopupBlockHandle *ui_pup_menu(bContext *C, int maxrow, uiMenuHandleFunc
        menu= ui_popup_block_create(C, NULL, NULL, NULL, ui_block_func_PUPMENU, &info);
        menu->popup= 1;
 
-       UI_add_popup_handlers(&window->handlers, menu);
+       UI_add_popup_handlers(C, &window->handlers, menu);
        WM_event_add_mousemove(C);
 
        menu->popup_func= func;
@@ -2399,7 +2399,7 @@ void uiPupBlockO(bContext *C, uiBlockCreateFunc func, void *arg, char *opname, i
        handle->opname= opname;
        handle->opcontext= opcontext;
        
-       UI_add_popup_handlers(&window->handlers, handle);
+       UI_add_popup_handlers(C, &window->handlers, handle);
        WM_event_add_mousemove(C);
 }
 
index 3bf71ea733728608b73c7eca0b097de4d0bb3ec3..076f871c4c27ff2324f85308482a1b0edd428136 100644 (file)
@@ -1639,6 +1639,7 @@ static uiBlock *ui_block_create_redo_last(bContext *C, ARegion *ar, void *arg_op
        int height;
        
        block= uiBeginBlock(C, ar, "redo_last_popup", UI_EMBOSS, UI_HELV);
+       uiBlockClearFlag(block, UI_BLOCK_LOOP);
        uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN|UI_BLOCK_RET_1);
        uiBlockSetFunc(block, redo_last_cb, arg_op, NULL);
 
index 82ce0a3d042f6d7e98c2b00dd161d91fc6aae64e..c0bc87ebb3ea280a1c1ee3f4ce4f3972b2e7963f 100644 (file)
@@ -978,7 +978,8 @@ static void createTransPose(bContext *C, TransInfo *t, Object *ob)
        
        if (arm->flag & ARM_RESTPOS) {
                if (ELEM(t->mode, TFM_DUMMY, TFM_BONESIZE)==0) {
-                       BKE_report(CTX_reports(C), RPT_ERROR, "Can't select linked when sync selection is enabled.");
+                       // XXX use transform operator reports
+                       // BKE_report(op->reports, RPT_ERROR, "Can't select linked when sync selection is enabled.");
                        return;
                }
        }
@@ -1016,7 +1017,8 @@ static void createTransPose(bContext *C, TransInfo *t, Object *ob)
        }
        
        if(td != (t->data+t->total)) {
-               BKE_report(CTX_reports(C), RPT_DEBUG, "Bone selection count error.");
+               // XXX use transform operator reports
+               // BKE_report(op->reports, RPT_DEBUG, "Bone selection count error.");
        }
        
        /* initialise initial auto=ik chainlen's? */
index 7dc30695862c416e935c09b38f0f05f291bf8ee3..ef89b2b35ada6cba6144075a6d8744f21999aefd 100644 (file)
@@ -111,9 +111,9 @@ static void wm_method_draw_full(bContext *C, wmWindow *win)
        /* draw overlapping regions */
        for(ar=screen->regionbase.first; ar; ar= ar->next) {
                if(ar->swinid) {
-                       CTX_wm_region_set(C, ar);
+                       CTX_wm_menu_set(C, ar);
                        ED_region_do_draw(C, ar);
-                       CTX_wm_region_set(C, NULL);
+                       CTX_wm_menu_set(C, NULL);
                }
        }
 
@@ -245,9 +245,9 @@ static void wm_method_draw_overlap_all(bContext *C, wmWindow *win)
        /* draw marked overlapping regions */
        for(ar=screen->regionbase.first; ar; ar= ar->next) {
                if(ar->swinid && ar->do_draw) {
-                       CTX_wm_region_set(C, ar);
+                       CTX_wm_menu_set(C, ar);
                        ED_region_do_draw(C, ar);
-                       CTX_wm_region_set(C, NULL);
+                       CTX_wm_menu_set(C, NULL);
                }
        }
 
@@ -558,9 +558,9 @@ static void wm_method_draw_triple(bContext *C, wmWindow *win)
        /* draw overlapping regions */
        for(ar=screen->regionbase.first; ar; ar= ar->next) {
                if(ar->swinid) {
-                       CTX_wm_region_set(C, ar);
+                       CTX_wm_menu_set(C, ar);
                        ED_region_do_draw(C, ar);
-                       CTX_wm_region_set(C, NULL);
+                       CTX_wm_menu_set(C, NULL);
                }
        }
 
index 772b308fb6274b08076247b0c8036f8056e5a946..283f08199969000afa3507d84811e3e46fc800b8 100644 (file)
@@ -549,14 +549,17 @@ void WM_event_remove_handlers(bContext *C, ListBase *handlers)
                else if(handler->ui_remove) {
                        ScrArea *area= CTX_wm_area(C);
                        ARegion *region= CTX_wm_region(C);
+                       ARegion *menu= CTX_wm_menu(C);
                        
                        if(handler->ui_area) CTX_wm_area_set(C, handler->ui_area);
                        if(handler->ui_region) CTX_wm_region_set(C, handler->ui_region);
+                       if(handler->ui_menu) CTX_wm_menu_set(C, handler->ui_menu);
 
                        handler->ui_remove(C, handler->ui_userdata);
 
                        CTX_wm_area_set(C, area);
                        CTX_wm_region_set(C, region);
+                       CTX_wm_menu_set(C, menu);
                }
 
                wm_event_free_handler(handler);
@@ -726,11 +729,13 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *eve
 {
        ScrArea *area= CTX_wm_area(C);
        ARegion *region= CTX_wm_region(C);
+       ARegion *menu= CTX_wm_menu(C);
        int retval;
                        
        /* we set context to where ui handler came from */
        if(handler->ui_area) CTX_wm_area_set(C, handler->ui_area);
        if(handler->ui_region) CTX_wm_region_set(C, handler->ui_region);
+       if(handler->ui_menu) CTX_wm_menu_set(C, handler->ui_menu);
 
        retval= handler->ui_handle(C, event, handler->ui_userdata);
 
@@ -738,11 +743,13 @@ static int wm_handler_ui_call(bContext *C, wmEventHandler *handler, wmEvent *eve
        if((retval != WM_UI_HANDLER_BREAK) || wm_event_always_pass(event)) {
                CTX_wm_area_set(C, area);
                CTX_wm_region_set(C, region);
+               CTX_wm_menu_set(C, menu);
        }
        else {
                /* this special cases is for areas and regions that get removed */
                CTX_wm_area_set(C, NULL);
                CTX_wm_region_set(C, NULL);
+               CTX_wm_menu_set(C, NULL);
        }
 
        if(retval == WM_UI_HANDLER_BREAK)
@@ -1197,6 +1204,7 @@ wmEventHandler *WM_event_add_ui_handler(bContext *C, ListBase *handlers, wmUIHan
        handler->ui_userdata= userdata;
        handler->ui_area= (C)? CTX_wm_area(C): NULL;
        handler->ui_region= (C)? CTX_wm_region(C): NULL;
+       handler->ui_menu= (C)? CTX_wm_menu(C): NULL;
        
        BLI_addhead(handlers, handler);
        
index 930f20dfa6330f41931bbb5fa38af7d1192e4f25..99853c77a554ce2c77a19ee580e66f12c9ce93ce 100644 (file)
@@ -58,6 +58,7 @@ typedef struct wmEventHandler {
        void *ui_userdata;                                      /* user data pointer */
        struct ScrArea *ui_area;                        /* for derived/modal handlers */
        struct ARegion *ui_region;                      /* for derived/modal handlers */
+       struct ARegion *ui_menu;                        /* for derived/modal handlers */
        
        /* fileselect handler re-uses modal operator data */
        struct bScreen *filescreen;                     /* screen it started in, to validate exec */