[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