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:
authorTon Roosendaal <ton@blender.org>2008-12-26 15:21:06 +0300
committerTon Roosendaal <ton@blender.org>2008-12-26 15:21:06 +0300
commitd6704568f87c71940feb2b7b28950b48a7d5fcf1 (patch)
treefae9968bcf5f41b60820bc3977dab27e174bbf35 /source/blender/windowmanager/intern
parent1d176259cbc8d6eb2658a9dd0b337f9768fc02c4 (diff)
2.5
Operator calls: extended WM_operator_name_call() with options whether to call the exec() (operate immediate) or invoke() (check user input) entry. This will allow python to use it more efficiently, but also solves the dreaded pulldown case that showed another menu for confirmation. New names to learn: :) WM_OP_EXEC_DEFAULT WM_OP_INVOKE_DEFAULT on todo still: allow hotkey definitions to do same.
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;
}