Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/blenkernel/BKE_context.h33
-rw-r--r--source/blender/blenkernel/intern/blender.c2
-rw-r--r--source/blender/blenkernel/intern/context.c87
-rw-r--r--source/blender/editors/include/UI_interface.h3
-rw-r--r--source/blender/editors/interface/interface.c23
-rw-r--r--source/blender/editors/interface/interface_handlers.c49
-rw-r--r--source/blender/editors/interface/interface_layout.c23
-rw-r--r--source/blender/editors/interface/interface_regions.c6
-rw-r--r--source/blender/editors/screen/screen_ops.c1
-rw-r--r--source/blender/editors/transform/transform_conversions.c6
-rw-r--r--source/blender/windowmanager/intern/wm_draw.c12
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c8
-rw-r--r--source/blender/windowmanager/wm_event_system.h1
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 */