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:
Diffstat (limited to 'source/blender/windowmanager/intern/wm_event_system.c')
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c98
1 files changed, 58 insertions, 40 deletions
diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index b9bc38c5927..c10b2b2e28c 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -319,10 +319,12 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, I
op->ptr= MEM_callocN(sizeof(PointerRNA), "wmOperatorPtrRNA");
RNA_pointer_create(&RNA_WindowManager, &wm->id, ot->srna, &op->properties, op->ptr);
- if(op->type->invoke)
+ if(op->type->invoke && event)
retval= (*op->type->invoke)(C, op, event);
else if(op->type->exec)
retval= op->type->exec(C, op);
+ else
+ printf("invalid operator call %s\n", ot->idname); /* debug, important to leave a while, should never happen */
/* only for testing, can remove any time */
WM_operator_print(op);
@@ -343,56 +345,72 @@ int WM_operator_name_call(bContext *C, const char *opstring, int context, IDProp
{
wmOperatorType *ot= WM_operatortype_find(opstring);
wmWindow *window= CTX_wm_window(C);
+ wmEvent *event= window->eventstate;
+
int retval;
/* dummie test */
if(ot && C && window) {
- if(context == WM_OP_REGION_WIN) {
- /* forces event to go to the region window, for header menus */
- ARegion *ar= CTX_wm_region(C);
- ScrArea *area= CTX_wm_area(C);
+ switch(context) {
- if(area) {
- ARegion *ar1= area->regionbase.first;
- for(; ar1; ar1= ar1->next)
- if(ar1->regiontype==RGN_TYPE_WINDOW)
- break;
- if(ar1)
- CTX_wm_region_set(C, ar1);
+ case WM_OP_EXEC_REGION_WIN:
+ event= NULL; /* pass on without break */
+ case WM_OP_INVOKE_REGION_WIN:
+ {
+ /* forces operator to go to the region window, for header menus */
+ ARegion *ar= CTX_wm_region(C);
+ ScrArea *area= CTX_wm_area(C);
+
+ if(area) {
+ ARegion *ar1= area->regionbase.first;
+ for(; ar1; ar1= ar1->next)
+ if(ar1->regiontype==RGN_TYPE_WINDOW)
+ break;
+ if(ar1)
+ CTX_wm_region_set(C, ar1);
+ }
+
+ retval= wm_operator_invoke(C, ot, event, properties);
+
+ /* set region back */
+ CTX_wm_region_set(C, ar);
+
+ return retval;
}
-
- retval= wm_operator_invoke(C, ot, window->eventstate, properties);
-
- /* set region back */
- CTX_wm_region_set(C, ar);
-
- return retval;
- }
- else if(context == WM_OP_AREA) {
- /* remove region from context */
- ARegion *ar= CTX_wm_region(C);
+ case WM_OP_EXEC_AREA:
+ event= NULL; /* pass on without break */
+ case WM_OP_INVOKE_AREA:
+ {
+ /* remove region from context */
+ ARegion *ar= CTX_wm_region(C);
- CTX_wm_region_set(C, NULL);
- retval= wm_operator_invoke(C, ot, window->eventstate, properties);
- CTX_wm_region_set(C, ar);
+ CTX_wm_region_set(C, NULL);
+ retval= wm_operator_invoke(C, ot, event, properties);
+ CTX_wm_region_set(C, ar);
- return retval;
- }
- else if(context == WM_OP_SCREEN) {
- /* remove region + area from context */
- ARegion *ar= CTX_wm_region(C);
- ScrArea *area= CTX_wm_area(C);
+ return retval;
+ }
+ case WM_OP_EXEC_SCREEN:
+ event= NULL; /* pass on without break */
+ case WM_OP_INVOKE_SCREEN:
+ {
+ /* remove region + area from context */
+ ARegion *ar= CTX_wm_region(C);
+ ScrArea *area= CTX_wm_area(C);
- CTX_wm_region_set(C, NULL);
- CTX_wm_area_set(C, NULL);
- retval= wm_operator_invoke(C, ot, window->eventstate, properties);
- CTX_wm_region_set(C, ar);
- CTX_wm_area_set(C, area);
+ CTX_wm_region_set(C, NULL);
+ CTX_wm_area_set(C, NULL);
+ retval= wm_operator_invoke(C, ot, window->eventstate, properties);
+ CTX_wm_region_set(C, ar);
+ CTX_wm_area_set(C, area);
- return retval;
+ return retval;
+ }
+ case WM_OP_EXEC_DEFAULT:
+ event= NULL; /* pass on without break */
+ case WM_OP_INVOKE_DEFAULT:
+ return wm_operator_invoke(C, ot, event, properties);
}
- else
- return wm_operator_invoke(C, ot, window->eventstate, properties);
}
return 0;