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:
-rw-r--r--source/blender/editors/interface/interface_regions.c2
-rw-r--r--source/blender/editors/space_time/time_header.c8
-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
6 files changed, 127 insertions, 38 deletions
diff --git a/source/blender/editors/interface/interface_regions.c b/source/blender/editors/interface/interface_regions.c
index 0c7613bbfcd..bb1105c79af 100644
--- a/source/blender/editors/interface/interface_regions.c
+++ b/source/blender/editors/interface/interface_regions.c
@@ -1654,7 +1654,7 @@ static void operator_callback(bContext *C, void *arg, int retval)
const char *opname= arg;
if(retval > 0)
- WM_operator_call(C, opname);
+ WM_operator_call(C, opname, WM_OP_DEFAULT);
}
void okee_operator(bContext *C, char *opname, char *str, ...)
diff --git a/source/blender/editors/space_time/time_header.c b/source/blender/editors/space_time/time_header.c
index dd222292674..f88b5435902 100644
--- a/source/blender/editors/space_time/time_header.c
+++ b/source/blender/editors/space_time/time_header.c
@@ -282,19 +282,19 @@ static void do_time_framemenu(bContext *C, void *arg, int event)
WM_event_add_notifier(C, WM_NOTE_WINDOW_REDRAW, 0, NULL);
break;
case 3: /* Add Marker */
- WM_operator_call_rwin(C, "ED_MARKER_OT_add");
+ WM_operator_call(C, "ED_MARKER_OT_add", WM_OP_REGION_WIN);
break;
case 4: /* Remove Marker */
- WM_operator_call_rwin(C, "ED_MARKER_OT_delete");
+ WM_operator_call(C, "ED_MARKER_OT_delete", WM_OP_REGION_WIN);
break;
case 5: /* Rename Marker */
//rename_marker();
break;
case 6: /* Grab Marker */
- WM_operator_call_rwin(C, "ED_MARKER_OT_move");
+ WM_operator_call(C, "ED_MARKER_OT_move", WM_OP_REGION_WIN);
break;
case 7: /* duplicate marker */
- WM_operator_call_rwin(C, "ED_MARKER_OT_duplicate");
+ WM_operator_call(C, "ED_MARKER_OT_duplicate", WM_OP_REGION_WIN);
break;
}
}
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;
+}
+