diff options
-rw-r--r-- | source/blender/blenkernel/BKE_context.h | 33 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/blender.c | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/context.c | 87 | ||||
-rw-r--r-- | source/blender/editors/include/UI_interface.h | 3 | ||||
-rw-r--r-- | source/blender/editors/interface/interface.c | 23 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_handlers.c | 49 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_layout.c | 23 | ||||
-rw-r--r-- | source/blender/editors/interface/interface_regions.c | 6 | ||||
-rw-r--r-- | source/blender/editors/screen/screen_ops.c | 1 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_conversions.c | 6 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_draw.c | 12 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 8 | ||||
-rw-r--r-- | source/blender/windowmanager/wm_event_system.h | 1 |
13 files changed, 105 insertions, 149 deletions
diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index dbe5c610688..f08b14c7820 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -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 diff --git a/source/blender/blenkernel/intern/blender.c b/source/blender/blenkernel/intern/blender.c index be64faec3cf..2033250585d 100644 --- a/source/blender/blenkernel/intern/blender.c +++ b/source/blender/blenkernel/intern/blender.c @@ -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 */ diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index df71dd6037a..47622611cb9 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -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; -} - diff --git a/source/blender/editors/include/UI_interface.h b/source/blender/editors/include/UI_interface.h index a93a0f1341d..234226f63cc 100644 --- a/source/blender/editors/include/UI_interface.h +++ b/source/blender/editors/include/UI_interface.h @@ -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 */ diff --git a/source/blender/editors/interface/interface.c b/source/blender/editors/interface/interface.c index 2f78c4e8fff..5bb7ca05fee 100644 --- a/source/blender/editors/interface/interface.c +++ b/source/blender/editors/interface/interface.c @@ -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) { diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c index d7437565c9d..de1d14c14c6 100644 --- a/source/blender/editors/interface/interface_handlers.c +++ b/source/blender/editors/interface/interface_handlers.c @@ -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); } diff --git a/source/blender/editors/interface/interface_layout.c b/source/blender/editors/interface/interface_layout.c index 0abf952a8a4..ea26bafc1f8 100644 --- a/source/blender/editors/interface/interface_layout.c +++ b/source/blender/editors/interface/interface_layout.c @@ -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 { diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c index 06fddc48013..f9a7934d5b3 100644 --- a/source/blender/editors/interface/interface_regions.c +++ b/source/blender/editors/interface/interface_regions.c @@ -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); } diff --git a/source/blender/editors/screen/screen_ops.c b/source/blender/editors/screen/screen_ops.c index 3bf71ea7337..076f871c4c2 100644 --- a/source/blender/editors/screen/screen_ops.c +++ b/source/blender/editors/screen/screen_ops.c @@ -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); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index 82ce0a3d042..c0bc87ebb3e 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -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? */ diff --git a/source/blender/windowmanager/intern/wm_draw.c b/source/blender/windowmanager/intern/wm_draw.c index 7dc30695862..ef89b2b35ad 100644 --- a/source/blender/windowmanager/intern/wm_draw.c +++ b/source/blender/windowmanager/intern/wm_draw.c @@ -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); } } diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index 772b308fb62..283f0819996 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -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); diff --git a/source/blender/windowmanager/wm_event_system.h b/source/blender/windowmanager/wm_event_system.h index 930f20dfa63..99853c77a55 100644 --- a/source/blender/windowmanager/wm_event_system.h +++ b/source/blender/windowmanager/wm_event_system.h @@ -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 */ |