[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18778] branches/blender2.5/blender/source /blender: 2.5

Ton Roosendaal ton at blender.org
Sun Feb 1 13:00:25 CET 2009


Revision: 18778
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18778
Author:   ton
Date:     2009-02-01 13:00:00 +0100 (Sun, 01 Feb 2009)

Log Message:
-----------
2.5

Moved 'redo last operator' stuff to WM level, with a 

  WM_operator_repeat()

Code in screen_ops was not checking all operator stuff
correctly, so repeat menu (F3 now) crashed in cases.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
    branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
    branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c
    branches/blender2.5/blender/source/blender/windowmanager/wm_event_system.h

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2009-02-01 04:22:18 UTC (rev 18777)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_ops.c	2009-02-01 12:00:00 UTC (rev 18778)
@@ -1321,15 +1321,8 @@
 {
 	wmOperator *lastop= CTX_wm_manager(C)->operators.last;
 	
-	if(lastop) {
-		if(lastop->type->poll==NULL || lastop->type->poll(C)) {
-			if(lastop->type->exec) {
-				printf("repeat %s\n", lastop->type->idname);
-				lastop->type->exec(C, lastop);
-				return OPERATOR_FINISHED;
-			}
-		}
-	}
+	if(lastop)
+		WM_operator_repeat(C, lastop);
 	
 	return OPERATOR_CANCELLED;
 }
@@ -1380,10 +1373,7 @@
 		BLI_remlink(&wm->operators, op);
 		BLI_addtail(&wm->operators, op);
 		
-		if(op->type->poll==NULL || op->type->poll(C)) {
-			printf("repeat %s\n", op->type->idname);
-			op->type->exec(C, op);
-		}
+		WM_operator_repeat(C, op);
 	}
 					 
 	return OPERATOR_FINISHED;

Modified: branches/blender2.5/blender/source/blender/windowmanager/WM_api.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2009-02-01 04:22:18 UTC (rev 18777)
+++ branches/blender2.5/blender/source/blender/windowmanager/WM_api.h	2009-02-01 12:00:00 UTC (rev 18778)
@@ -133,6 +133,7 @@
 int			WM_operatortype_remove(const char *idname);
 
 int			WM_operator_call		(struct bContext *C, struct wmOperator *op);
+int			WM_operator_repeat		(struct bContext *C, struct wmOperator *op);
 int         WM_operator_name_call	(struct bContext *C, const char *opstring, int context, struct PointerRNA *properties);
 int			WM_operator_call_py(struct bContext *C, struct wmOperatorType *ot, struct PointerRNA *properties, struct ReportList *reports);
 

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	2009-02-01 04:22:18 UTC (rev 18777)
+++ branches/blender2.5/blender/source/blender/windowmanager/intern/wm_event_system.c	2009-02-01 12:00:00 UTC (rev 18778)
@@ -196,21 +196,20 @@
 
 /* ********************* operators ******************* */
 
-static void WM_operator_print(wmOperator *op)
+/* if repeat is true, it doesn't register again, nor does it free */
+static int wm_operator_exec(bContext *C, wmOperator *op, int repeat)
 {
-	char *buf = WM_operator_pystring(op);
-	printf("%s\n", buf);
-	MEM_freeN(buf);
-}
-
-/* for running operators with frozen context (modal handlers, menus) */
-int WM_operator_call(bContext *C, wmOperator *op)
-{
 	int retval= OPERATOR_CANCELLED;
 	
+	if(op==NULL || op->type==NULL)
+		return retval;
+	
+	if(op->type->poll && op->type->poll(C)==0)
+		return retval;
+	
 	if(op->type->exec)
 		retval= op->type->exec(C, op);
-
+	
 	if(!(retval & OPERATOR_RUNNING_MODAL))
 		if(op->reports->list.first)
 			uiPupMenuReports(C, op->reports);
@@ -219,18 +218,32 @@
 		if(op->type->flag & OPTYPE_UNDO)
 			ED_undo_push_op(C, op);
 		
-		if(op->type->flag & OPTYPE_REGISTER)
-			wm_operator_register(CTX_wm_manager(C), op);
-		else
-			WM_operator_free(op);
+		if(repeat==0) {
+			if(op->type->flag & OPTYPE_REGISTER)
+				wm_operator_register(CTX_wm_manager(C), op);
+			else
+				WM_operator_free(op);
+		}
 	}
-	else
+	else if(repeat==0)
 		WM_operator_free(op);
-
+	
 	return retval;
+	
 }
 
+/* for running operators with frozen context (modal handlers, menus) */
+int WM_operator_call(bContext *C, wmOperator *op)
+{
+	return wm_operator_exec(C, op, 0);
+}
 
+/* do this operator again, put here so it can share above code */
+int WM_operator_repeat(bContext *C, wmOperator *op)
+{
+	return wm_operator_exec(C, op, 1);
+}
+
 static wmOperator *wm_operator_create(wmWindowManager *wm, wmOperatorType *ot, PointerRNA *properties, ReportList *reports)
 {
 	wmOperator *op= MEM_callocN(sizeof(wmOperator), ot->idname);	/* XXX operatortype names are static still. for debug */
@@ -262,6 +275,13 @@
 	return op;
 }
 
+static void wm_operator_print(wmOperator *op)
+{
+	char *buf = WM_operator_pystring(op);
+	printf("%s\n", buf);
+	MEM_freeN(buf);
+}
+
 static int wm_operator_invoke(bContext *C, wmOperatorType *ot, wmEvent *event, PointerRNA *properties)
 {
 	wmWindowManager *wm= CTX_wm_manager(C);
@@ -284,9 +304,9 @@
 			if(op->reports->list.first) /* only show the report if the report list was not given in the function */
 				uiPupMenuReports(C, op->reports);
 		
-		if (retval & OPERATOR_FINISHED) /* todo - this may conflict with the other WM_operator_print, if theres ever 2 prints for 1 action will may need to add modal check here */
+		if (retval & OPERATOR_FINISHED) /* todo - this may conflict with the other wm_operator_print, if theres ever 2 prints for 1 action will may need to add modal check here */
 			if(G.f & G_DEBUG)
-				WM_operator_print(op);
+				wm_operator_print(op);
 		}
 
 		if(retval & OPERATOR_FINISHED) {
@@ -581,7 +601,7 @@
 
 			if (retval & OPERATOR_FINISHED) {
 				if(G.f & G_DEBUG)
-					WM_operator_print(op); /* todo - this print may double up, might want to check more flags then the FINISHED */
+					wm_operator_print(op); /* todo - this print may double up, might want to check more flags then the FINISHED */
 			}			
 
 			if(retval & OPERATOR_FINISHED) {

Modified: branches/blender2.5/blender/source/blender/windowmanager/wm_event_system.h
===================================================================
--- branches/blender2.5/blender/source/blender/windowmanager/wm_event_system.h	2009-02-01 04:22:18 UTC (rev 18777)
+++ branches/blender2.5/blender/source/blender/windowmanager/wm_event_system.h	2009-02-01 12:00:00 UTC (rev 18778)
@@ -76,13 +76,13 @@
 
 
 /* wm_event_system.c */
-void		wm_event_add(wmWindow *win, wmEvent *event_to_add);
+void		wm_event_add			(wmWindow *win, wmEvent *event_to_add);
 void		wm_event_free_all		(wmWindow *win);
 
 			/* goes over entire hierarchy:  events -> window -> screen -> area -> region */
 void		wm_event_do_handlers	(bContext *C);
 
-void		wm_event_add_ghostevent(wmWindow *win, int type, void *customdata);
+void		wm_event_add_ghostevent	(wmWindow *win, int type, void *customdata);
 
 void		wm_event_do_notifiers	(bContext *C);
 





More information about the Bf-blender-cvs mailing list