diff options
author | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2008-12-16 10:44:21 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@pandora.be> | 2008-12-16 10:44:21 +0300 |
commit | 1c1c89262eea0ab4eb62788fd4daf1023ffbf8e1 (patch) | |
tree | 2b0fe1f1a0e45adb2522711c974186efb87efe75 /source/blender/windowmanager | |
parent | d272300da95648ccc5b383ab9debb19707aa48e3 (diff) |
WM: changed WM_operator_call to take an argument, which specifies in
which context to run the operator: WM_OP_DEFAULT, WM_OP_REGION_WIN,
WM_OP_AREA or WM_OP_SCREEN. This also replaces WM_operator_call_rwin
since it is more general.
This is useful for buttons and popup menus to run operators, and also
used by a new function to lookup the keymap item for that operator in
the right context.
Diffstat (limited to 'source/blender/windowmanager')
-rw-r--r-- | source/blender/windowmanager/WM_api.h | 4 | ||||
-rw-r--r-- | source/blender/windowmanager/WM_types.h | 8 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_event_system.c | 77 | ||||
-rw-r--r-- | source/blender/windowmanager/intern/wm_keymap.c | 66 |
4 files changed, 122 insertions, 33 deletions
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h index 2d60f82ea7c..a2b5049b8b5 100644 --- a/source/blender/windowmanager/WM_api.h +++ b/source/blender/windowmanager/WM_api.h @@ -72,6 +72,7 @@ ListBase *WM_keymap_listbase (wmWindowManager *wm, const char *nameid, int spaceid, int regionid); char *WM_key_event_string(short type); +char *WM_key_event_operator_string(bContext *C, char *opname, int opcontext, char *str, int len); /* handlers */ @@ -111,8 +112,7 @@ int WM_operator_winactive (struct bContext *C); wmOperatorType *WM_operatortype_find(const char *idname); void WM_operatortype_append (void (*opfunc)(wmOperatorType*)); -int WM_operator_call (struct bContext *C, const char *opstring); -int WM_operator_call_rwin (struct bContext *C, const char *opstring); +int WM_operator_call (struct bContext *C, const char *opstring, int context); /* default operator callbacks for border/lasso */ int WM_border_select_invoke (struct bContext *C, wmOperator *op, struct wmEvent *event); diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 7307cb4bf23..3afb3369466 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -38,6 +38,14 @@ /* flag */ #define OPTYPE_REGISTER 1 +/* context to call operator in for WM_operator_call */ +enum { + WM_OP_DEFAULT, + WM_OP_REGION_WIN, + WM_OP_AREA, + WM_OP_SCREEN +}; + /* ************** wmEvent ************************ */ /* each event should have full modifier state */ diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c index a5cbc835168..a03425f1d11 100644 --- a/source/blender/windowmanager/intern/wm_event_system.c +++ b/source/blender/windowmanager/intern/wm_event_system.c @@ -309,44 +309,59 @@ static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, I return retval; } -/* forces event to go to the region window, for header menus */ -int WM_operator_call_rwin(bContext *C, const char *opstring) +/* invokes operator in context */ +int WM_operator_call(bContext *C, const char *opstring, int context) { wmOperatorType *ot= WM_operatortype_find(opstring); - + int retval; + /* dummie test */ if(ot && C && C->window) { - ARegion *ar= C->region; - int retval; - - if(C->area) { - ARegion *ar1= C->area->regionbase.first; - for(; ar1; ar1= ar1->next) - if(ar1->regiontype==RGN_TYPE_WINDOW) - break; - if(ar1) - C->region= ar1; + if(context == WM_OP_REGION_WIN) { + /* forces event to go to the region window, for header menus */ + ARegion *ar= C->region; + + if(C->area) { + ARegion *ar1= C->area->regionbase.first; + for(; ar1; ar1= ar1->next) + if(ar1->regiontype==RGN_TYPE_WINDOW) + break; + if(ar1) + C->region= ar1; + } + + retval= wm_operator_invoke(C, ot, C->window->eventstate, NULL); + + /* set region back */ + C->region= ar; + + return retval; } - - retval= wm_operator_invoke(C, ot, C->window->eventstate, NULL); - - /* set region back */ - C->region= ar; - - return retval; - } - - return 0; -} + else if(context == WM_OP_AREA) { + /* remove region from context */ + ARegion *ar= C->region; -/* invokes operator in context */ -int WM_operator_call(bContext *C, const char *opstring) -{ - wmOperatorType *ot= WM_operatortype_find(opstring); + C->region= NULL; + retval= wm_operator_invoke(C, ot, C->window->eventstate, NULL); + C->region= ar; - /* dummie test */ - if(ot && C && C->window) { - return wm_operator_invoke(C, ot, C->window->eventstate, NULL); + return retval; + } + else if(context == WM_OP_SCREEN) { + /* remove region + area from context */ + ARegion *ar= C->region; + ScrArea *area= C->area; + + C->region= NULL; + C->area= NULL; + retval= wm_operator_invoke(C, ot, C->window->eventstate, NULL); + C->region= ar; + C->area= area; + + return retval; + } + else + return wm_operator_invoke(C, ot, C->window->eventstate, NULL); } return 0; diff --git a/source/blender/windowmanager/intern/wm_keymap.c b/source/blender/windowmanager/intern/wm_keymap.c index 4d99425b35b..8e08c9d0dbf 100644 --- a/source/blender/windowmanager/intern/wm_keymap.c +++ b/source/blender/windowmanager/intern/wm_keymap.c @@ -28,6 +28,7 @@ #include <string.h> +#include "DNA_screen_types.h" #include "DNA_windowmanager_types.h" #include "MEM_guardedalloc.h" @@ -482,3 +483,68 @@ char *WM_key_event_string(short type) return ""; } +static char *wm_keymap_item_to_string(wmKeymapItem *kmi, char *str, int len) +{ + char buf[100]; + + buf[0]= 0; + + if(kmi->shift) + strcat(buf, "Shift "); + + if(kmi->ctrl) + strcat(buf, "Ctrl "); + + if(kmi->oskey) + strcat(buf, "OS "); + + strcat(buf, WM_key_event_string(kmi->type)); + BLI_strncpy(str, buf, len); + + return str; +} + +char *WM_key_event_operator_string(bContext *C, char *opname, int opcontext, char *str, int len) +{ + wmEventHandler *handler; + wmKeymapItem *kmi; + ListBase *handlers= NULL; + + /* find right handler list based on specified context */ + if(opcontext == WM_OP_REGION_WIN) { + if(C->area) { + ARegion *ar= C->area->regionbase.first; + for(; ar; ar= ar->next) + if(ar->regiontype==RGN_TYPE_WINDOW) + break; + + if(ar) + handlers= &ar->handlers; + } + } + else if(opcontext == WM_OP_AREA) { + if(C->area) + handlers= &C->area->handlers; + } + else if(opcontext == WM_OP_SCREEN) { + if(C->window) + handlers= &C->window->handlers; + } + else { + if(C->region) + handlers= &C->region->handlers; + } + + if(!handlers) + return NULL; + + /* find keymap item in handlers */ + for(handler=handlers->first; handler; handler=handler->next) + if(handler->keymap) + for(kmi=handler->keymap->first; kmi; kmi=kmi->next) + if(strcmp(kmi->idname, opname) == 0 && WM_key_event_string(kmi->type)[0]) + return wm_keymap_item_to_string(kmi, str, len); + + return NULL; +} + |