[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