[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37795] trunk/blender/source: own patch [ #27752] Python Callback (Scriptlink functionality)
Campbell Barton
ideasman42 at gmail.com
Fri Jun 24 18:54:31 CEST 2011
Revision: 37795
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37795
Author: campbellbarton
Date: 2011-06-24 16:54:30 +0000 (Fri, 24 Jun 2011)
Log Message:
-----------
own patch [#27752] Python Callback (Scriptlink functionality)
Python:
* adds bpy.app.handlers which contains lists, each for an event type:
render_pre, render_post, load_pre, load_post, save_pre, save_post
* each list item needs to be a callable object which takes 1 argument (the ID).
* callbacks are cleared on file load.
Example:
def MyFunc(scene): print("Callback:", data)
bpy.app.handlers.render_post.append(MyFunc)
C:
* This patch adds a generic C callback api which is currently only used by python.
* Unlike python callbacks these are not cleared on file load.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/blender.c
trunk/blender/source/blender/blenlib/BLI_callbacks.h
trunk/blender/source/blender/blenlib/CMakeLists.txt
trunk/blender/source/blender/python/BPY_extern.h
trunk/blender/source/blender/python/intern/CMakeLists.txt
trunk/blender/source/blender/python/intern/bpy_app.c
trunk/blender/source/blender/render/intern/source/pipeline.c
trunk/blender/source/blender/windowmanager/intern/wm_files.c
trunk/blender/source/blender/windowmanager/intern/wm_init_exit.c
trunk/blender/source/creator/creator.c
Added Paths:
-----------
trunk/blender/source/blender/blenlib/intern/callbacks.c
trunk/blender/source/blender/python/intern/bpy_app_handlers.c
trunk/blender/source/blender/python/intern/bpy_app_handlers.h
Modified: trunk/blender/source/blender/blenkernel/intern/blender.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/blender.c 2011-06-24 15:10:34 UTC (rev 37794)
+++ trunk/blender/source/blender/blenkernel/intern/blender.c 2011-06-24 16:54:30 UTC (rev 37795)
@@ -64,6 +64,7 @@
#include "BLI_dynstr.h"
#include "BLI_path_util.h"
#include "BLI_utildefines.h"
+#include "BLI_callbacks.h"
#include "IMB_imbuf.h"
@@ -110,6 +111,9 @@
BKE_spacetypes_free(); /* after free main, it uses space callbacks */
IMB_exit();
+
+ BLI_cb_finalize();
+
seq_stripelem_cache_destruct();
free_nodesystem();
Modified: trunk/blender/source/blender/blenlib/BLI_callbacks.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_callbacks.h 2011-06-24 15:10:34 UTC (rev 37794)
+++ trunk/blender/source/blender/blenlib/BLI_callbacks.h 2011-06-24 16:54:30 UTC (rev 37795)
@@ -1,8 +1,6 @@
/*
* $Id:
*
- * These callbacks are needed in the lib
- *
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
@@ -29,7 +27,7 @@
* ***** END GPL LICENSE BLOCK *****
*/
-/** \file blender/blenlib/intern/BLI_callbacks.h
+/** \file blender/blenlib/BLI_callbacks.h
* \ingroup bli
*/
@@ -37,8 +35,38 @@
#ifndef BLI_CALLBACKS_H
#define BLI_CALLBACKS_H
-// This is blenlib internal only
-void callLocalErrorCallBack(const char* msg);
+struct bContext;
+struct Main;
+struct ID;
+typedef enum {
+ BLI_CB_EVT_RENDER_PRE,
+ BLI_CB_EVT_RENDER_POST,
+ BLI_CB_EVT_LOAD_PRE,
+ BLI_CB_EVT_LOAD_POST,
+ BLI_CB_EVT_SAVE_PRE,
+ BLI_CB_EVT_SAVE_POST,
+ BLI_CB_EVT_TOT
+} eCbEvent;
+
+
+typedef struct {
+ struct bCallbackFuncStore *next, *prev;
+ void (* func)(struct Main *, struct ID *, void *arg);
+ void *arg;
+ short alloc;
+} bCallbackFuncStore;
+
+
+void BLI_exec_cb(struct Main *main, struct ID *self, eCbEvent evt);
+void BLI_add_cb(bCallbackFuncStore *funcstore, eCbEvent evt);
+
#endif
+
+void BLI_cb_init(void);
+void BLI_cb_finalize(void);
+
+
+/* This is blenlib internal only, unrelated to above */
+void callLocalErrorCallBack(const char* msg);
Modified: trunk/blender/source/blender/blenlib/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/blenlib/CMakeLists.txt 2011-06-24 15:10:34 UTC (rev 37794)
+++ trunk/blender/source/blender/blenlib/CMakeLists.txt 2011-06-24 16:54:30 UTC (rev 37795)
@@ -52,6 +52,7 @@
intern/DLRB_tree.c
intern/boxpack2d.c
intern/bpath.c
+ intern/callbacks.c
intern/cpu.c
intern/dynlib.c
intern/edgehash.c
Added: trunk/blender/source/blender/blenlib/intern/callbacks.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/callbacks.c (rev 0)
+++ trunk/blender/source/blender/blenlib/intern/callbacks.c 2011-06-24 16:54:30 UTC (rev 37795)
@@ -0,0 +1,70 @@
+/*
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Blender Foundation (2011)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "BLI_utildefines.h"
+#include "BLI_listbase.h"
+#include "BLI_callbacks.h"
+
+#include "MEM_guardedalloc.h"
+
+static ListBase callback_slots[BLI_CB_EVT_TOT]= {{0}};
+
+void BLI_exec_cb(struct Main *main, struct ID *self, eCbEvent evt)
+{
+ ListBase *lb= &callback_slots[evt];
+ bCallbackFuncStore *funcstore;
+
+ for(funcstore= (bCallbackFuncStore *)lb->first; funcstore; funcstore= (bCallbackFuncStore *)funcstore->next) {
+ funcstore->func(main, self, funcstore->arg);
+ }
+}
+
+void BLI_add_cb(bCallbackFuncStore *funcstore, eCbEvent evt)
+{
+ ListBase *lb= &callback_slots[evt];
+ BLI_addtail(lb, funcstore);
+}
+
+void BLI_cb_init(void)
+{
+ /* do nothing */
+}
+
+/* call on application exit */
+void BLI_cb_finalize(void)
+{
+ eCbEvent evt;
+ for(evt= 0; evt < BLI_CB_EVT_TOT; evt++) {
+ ListBase *lb= &callback_slots[evt];
+ bCallbackFuncStore *funcstore;
+ bCallbackFuncStore *funcstore_next;
+ for(funcstore= (bCallbackFuncStore *)lb->first; funcstore; funcstore= funcstore_next) {
+ funcstore_next= (bCallbackFuncStore *)funcstore->next;
+ BLI_remlink(lb, funcstore);
+ if(funcstore->alloc) {
+ MEM_freeN(funcstore);
+ }
+ }
+ }
+}
Modified: trunk/blender/source/blender/python/BPY_extern.h
===================================================================
--- trunk/blender/source/blender/python/BPY_extern.h 2011-06-24 15:10:34 UTC (rev 37794)
+++ trunk/blender/source/blender/python/BPY_extern.h 2011-06-24 16:54:30 UTC (rev 37795)
@@ -83,6 +83,8 @@
void BPY_modules_update(struct bContext *C); // XXX - annoying, need this for pointers that get out of date
void BPY_modules_load_user(struct bContext *C);
+void BPY_app_handlers_reset(void);
+
void BPY_driver_reset(void);
float BPY_driver_exec(struct ChannelDriver *driver);
Modified: trunk/blender/source/blender/python/intern/CMakeLists.txt
===================================================================
--- trunk/blender/source/blender/python/intern/CMakeLists.txt 2011-06-24 15:10:34 UTC (rev 37794)
+++ trunk/blender/source/blender/python/intern/CMakeLists.txt 2011-06-24 16:54:30 UTC (rev 37795)
@@ -42,6 +42,7 @@
set(SRC
bpy.c
bpy_app.c
+ bpy_app_handlers.c
bpy_driver.c
bpy_interface.c
bpy_intern_string.c
@@ -59,6 +60,7 @@
bpy.h
bpy_app.h
+ bpy_app_handlers.h
bpy_driver.h
bpy_intern_string.h
bpy_operator.h
Modified: trunk/blender/source/blender/python/intern/bpy_app.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_app.c 2011-06-24 15:10:34 UTC (rev 37794)
+++ trunk/blender/source/blender/python/intern/bpy_app.c 2011-06-24 16:54:30 UTC (rev 37795)
@@ -30,6 +30,7 @@
#include <Python.h>
#include "bpy_app.h"
+#include "bpy_app_handlers.h"
#include "bpy_driver.h"
#include "BLI_path_util.h"
@@ -74,6 +75,9 @@
{(char *)"build_cxxflags", (char *)"C++ compiler flags"},
{(char *)"build_linkflags", (char *)"Binary linking flags"},
{(char *)"build_system", (char *)"Build system used"},
+
+ /* submodules */
+ {(char *)"handlers", (char *)"Application handler callbacks"},
{NULL}
};
@@ -140,6 +144,8 @@
SetStrItem("Unknown");
#endif
+ SetObjItem(BPY_app_handlers_struct());
+
#undef SetIntItem
#undef SetStrItem
#undef SetObjItem
Added: trunk/blender/source/blender/python/intern/bpy_app_handlers.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_app_handlers.c (rev 0)
+++ trunk/blender/source/blender/python/intern/bpy_app_handlers.c 2011-06-24 16:54:30 UTC (rev 37795)
@@ -0,0 +1,170 @@
+/*
+ * $Id:
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * Contributor(s): Campbell Barton
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/python/intern/bpy_app_handlers.c
+ * \ingroup pythonintern
+ */
+
+#include <Python.h>
+#include "BLI_utildefines.h"
+#include "BLI_callbacks.h"
+
+#include "RNA_types.h"
+#include "RNA_access.h"
+#include "bpy_rna.h"
+#include "bpy_app_handlers.h"
+
+void bpy_app_generic_callback(struct Main *main, struct ID *id, void *arg);
+
+static PyTypeObject BlenderAppCbType;
+
+static PyStructSequence_Field app_cb_info_fields[]= {
+ {(char *)"render_pre", NULL},
+ {(char *)"render_post", NULL},
+ {(char *)"load_pre", NULL},
+ {(char *)"load_post", NULL},
+ {(char *)"save_pre", NULL},
+ {(char *)"save_post", NULL},
+ {NULL}
+};
+
+static PyStructSequence_Desc app_cb_info_desc= {
+ (char *)"bpy.app.handlers", /* name */
+ (char *)"This module contains callbacks", /* doc */
+ app_cb_info_fields, /* fields */
+ (sizeof(app_cb_info_fields)/sizeof(PyStructSequence_Field)) - 1
+};
+
+/*
+#if (BLI_CB_EVT_TOT != ((sizeof(app_cb_info_fields)/sizeof(PyStructSequence_Field))))
+# error "Callbacks are out of sync"
+#endif
+*/
+
+static PyObject *py_cb_array[BLI_CB_EVT_TOT]= {0};
+
+static PyObject *make_app_cb_info(void)
+{
+ PyObject *app_cb_info;
+ int pos= 0;
+
+ app_cb_info= PyStructSequence_New(&BlenderAppCbType);
+ if (app_cb_info == NULL) {
+ return NULL;
+ }
+
+ for(pos= 0; pos < BLI_CB_EVT_TOT; pos++) {
+ if(app_cb_info_fields[pos].name == NULL) {
+ Py_FatalError("invalid callback slots 1");
+ }
+ PyStructSequence_SET_ITEM(app_cb_info, pos, (py_cb_array[pos]= PyList_New(0)));
+ }
+ if(app_cb_info_fields[pos].name != NULL) {
+ Py_FatalError("invalid callback slots 2");
+ }
+
+ return app_cb_info;
+}
+
+PyObject *BPY_app_handlers_struct(void)
+{
+ PyObject *ret;
+
+ PyStructSequence_InitType(&BlenderAppCbType, &app_cb_info_desc);
+
+ ret= make_app_cb_info();
+
+ /* prevent user from creating new instances */
+ BlenderAppCbType.tp_init= NULL;
+ BlenderAppCbType.tp_new= NULL;
+
+ /* assign the C callbacks */
+ if(ret) {
+ static bCallbackFuncStore funcstore_array[BLI_CB_EVT_TOT]= {{0}};
+ bCallbackFuncStore *funcstore;
+ int pos= 0;
+
+ for(pos= 0; pos < BLI_CB_EVT_TOT; pos++) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list