[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [17885] branches/blender2.5/blender/source /blender:
Brecht Van Lommel
brecht at blender.org
Tue Dec 16 08:44:22 CET 2008
Revision: 17885
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=17885
Author: blendix
Date: 2008-12-16 08:44:21 +0100 (Tue, 16 Dec 2008)
Log Message:
-----------
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.
Modified Paths:
--------------
branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
branches/blender2.5/blender/source/blender/editors/space_time/time_header.c
branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
branches/blender2.5/blender/source/blender/windowmanager/WM_types.h
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c
Modified: branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c 2008-12-16 07:32:12 UTC (rev 17884)
+++ branches/blender2.5/blender/source/blender/editors/interface/interface_regions.c 2008-12-16 07:44:21 UTC (rev 17885)
@@ -1654,7 +1654,7 @@
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, ...)
Modified: branches/blender2.5/blender/source/blender/editors/space_time/time_header.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_time/time_header.c 2008-12-16 07:32:12 UTC (rev 17884)
+++ branches/blender2.5/blender/source/blender/editors/space_time/time_header.c 2008-12-16 07:44:21 UTC (rev 17885)
@@ -282,19 +282,19 @@
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;
}
}
Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_api.h 2008-12-16 07:32:12 UTC (rev 17884)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_api.h 2008-12-16 07:44:21 UTC (rev 17885)
@@ -72,6 +72,7 @@
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 @@
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);
Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_types.h 2008-12-16 07:32:12 UTC (rev 17884)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_types.h 2008-12-16 07:44:21 UTC (rev 17885)
@@ -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 */
Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c 2008-12-16 07:32:12 UTC (rev 17884)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c 2008-12-16 07:44:21 UTC (rev 17885)
@@ -309,44 +309,59 @@
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;
Modified: branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c 2008-12-16 07:32:12 UTC (rev 17884)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_keymap.c 2008-12-16 07:44:21 UTC (rev 17885)
@@ -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 @@
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;
+}
+
More information about the Bf-blender-cvs
mailing list