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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2008-12-16 10:44:21 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2008-12-16 10:44:21 +0300
commit1c1c89262eea0ab4eb62788fd4daf1023ffbf8e1 (patch)
tree2b0fe1f1a0e45adb2522711c974186efb87efe75 /source/blender/windowmanager
parentd272300da95648ccc5b383ab9debb19707aa48e3 (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.h4
-rw-r--r--source/blender/windowmanager/WM_types.h8
-rw-r--r--source/blender/windowmanager/intern/wm_event_system.c77
-rw-r--r--source/blender/windowmanager/intern/wm_keymap.c66
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;
+}
+