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')
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c98
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c7
2 files changed, 62 insertions, 43 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;
diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c
index 22616a49af1..eac51559269 100644
--- a/source/blender/windowmanager/intern/wm_keymap.c
+++ b/source/blender/windowmanager/intern/wm_keymap.c
@@ -39,6 +39,7 @@
#include "BKE_context.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_utildefines.h"
#include "RNA_access.h"
#include "RNA_types.h"
@@ -519,7 +520,7 @@ char *WM_key_event_operator_string(bContext *C, char *opname, int opcontext, cha
ListBase *handlers= NULL;
/* find right handler list based on specified context */
- if(opcontext == WM_OP_REGION_WIN) {
+ if(ELEM(opcontext, WM_OP_EXEC_REGION_WIN, WM_OP_INVOKE_REGION_WIN)) {
if(CTX_wm_area(C)) {
ARegion *ar= CTX_wm_area(C)->regionbase.first;
for(; ar; ar= ar->next)
@@ -530,11 +531,11 @@ char *WM_key_event_operator_string(bContext *C, char *opname, int opcontext, cha
handlers= &ar->handlers;
}
}
- else if(opcontext == WM_OP_AREA) {
+ else if(ELEM(opcontext, WM_OP_EXEC_AREA, WM_OP_INVOKE_AREA)) {
if(CTX_wm_area(C))
handlers= &CTX_wm_area(C)->handlers;
}
- else if(opcontext == WM_OP_SCREEN) {
+ else if(ELEM(opcontext, WM_OP_EXEC_SCREEN, WM_OP_INVOKE_SCREEN)) {
if(CTX_wm_window(C))
handlers= &CTX_wm_window(C)->handlers;
}