Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2008-03-07 00:25:15 +0300
committerCampbell Barton <ideasman42@gmail.com>2008-03-07 00:25:15 +0300
commit08f306c81cb8015db59fe63ad1ef2c977751652e (patch)
tree94f656dbf98fba2bf3d47547d34c06131d0a88cf /source
parent3796abf092c9de4d43131dbce05102b126e14896 (diff)
Made python scripts save and load in the blend file so you can have the same scripts running when you open a blend file.
Also scripts will re-run on undo rather then closing. This is done by saving and loading the name of the script or textblock of the 'Script' datablock, connected to the ScriptSpace. This way when there is a name but the script dosnt run. Blender runs the script or text block if available.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/bad_level_call_stubs/stubs.c2
-rw-r--r--source/blender/blenkernel/intern/library.c2
-rw-r--r--source/blender/blenkernel/intern/script.c2
-rw-r--r--source/blender/blenlib/BLI_blenlib.h2
-rw-r--r--source/blender/blenlib/intern/util.c6
-rw-r--r--source/blender/blenloader/intern/readfile.c33
-rw-r--r--source/blender/blenloader/intern/writefile.c13
-rw-r--r--source/blender/include/BPI_script.h71
-rw-r--r--source/blender/makesdna/DNA_space_types.h18
-rw-r--r--source/blender/python/BPY_extern.h4
-rw-r--r--source/blender/python/BPY_interface.c330
-rw-r--r--source/blender/python/api2_2x/Blender.c2
-rw-r--r--source/blender/python/api2_2x/Draw.c4
-rw-r--r--source/blender/python/api2_2x/Window.c1
-rw-r--r--source/blender/src/drawscript.c31
-rw-r--r--source/blender/src/editimasel.c2
-rw-r--r--source/blender/src/filesel.c1
-rw-r--r--source/blender/src/header_script.c1
-rw-r--r--source/blender/src/headerbuttons.c2
-rw-r--r--source/blender/src/space.c1
20 files changed, 305 insertions, 223 deletions
diff --git a/source/blender/blenkernel/bad_level_call_stubs/stubs.c b/source/blender/blenkernel/bad_level_call_stubs/stubs.c
index 5e827ca766b..1da46149eac 100644
--- a/source/blender/blenkernel/bad_level_call_stubs/stubs.c
+++ b/source/blender/blenkernel/bad_level_call_stubs/stubs.c
@@ -36,7 +36,7 @@
#include "BKE_bad_level_calls.h"
#include "BLI_blenlib.h"
-#include "BPI_script.h"
+#include "DNA_space_types.h"
#include "DNA_texture_types.h"
#include "DNA_material_types.h"
#include "DNA_node_types.h"
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index e81d3bac655..4cd7e1c6d38 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -114,7 +114,7 @@
#include "BKE_brush.h"
#include "BKE_idprop.h"
-#include "BPI_script.h"
+#include "DNA_space_types.h"
#define MAX_IDPUP 60 /* was 24 */
diff --git a/source/blender/blenkernel/intern/script.c b/source/blender/blenkernel/intern/script.c
index b99c2c51441..099fedf460a 100644
--- a/source/blender/blenkernel/intern/script.c
+++ b/source/blender/blenkernel/intern/script.c
@@ -35,7 +35,7 @@
*/
#include "BKE_script.h"
-#include "BPI_script.h"
+#include "DNA_space_types.h"
#include "MEM_guardedalloc.h"
#include "BKE_bad_level_calls.h" /* for BPY_clear_script */
diff --git a/source/blender/blenlib/BLI_blenlib.h b/source/blender/blenlib/BLI_blenlib.h
index 551b6732333..e8c73398635 100644
--- a/source/blender/blenlib/BLI_blenlib.h
+++ b/source/blender/blenlib/BLI_blenlib.h
@@ -98,7 +98,7 @@ char *BLI_gethome(void);
void BLI_make_file_string(const char *relabase, char *string, const char *dir, const char *file);
void BLI_make_exist(char *dir);
void BLI_make_existing_file(char *name);
-void BLI_split_dirfile(const char *string, char *dir, char *file);
+void BLI_split_dirfile(char *string, char *dir, char *file);
void BLI_join_dirfile(char *string, const char *dir, const char *file);
int BLI_testextensie(const char *str, const char *ext);
void addlisttolist(ListBase *list1, ListBase *list2);
diff --git a/source/blender/blenlib/intern/util.c b/source/blender/blenlib/intern/util.c
index 4610c887476..51691499ba8 100644
--- a/source/blender/blenlib/intern/util.c
+++ b/source/blender/blenlib/intern/util.c
@@ -1102,7 +1102,7 @@ int BLI_convertstringcode(char *path, const char *basepath, int framenum)
return wasrelative;
}
-/* copy di to fi without directory only */
+/* copy di to fi, filename only */
void BLI_splitdirstring(char *di, char *fi)
{
char *lslash= BLI_last_slash(di);
@@ -1348,8 +1348,8 @@ int BLI_testextensie(const char *str, const char *ext)
}
-
-void BLI_split_dirfile(const char *string, char *dir, char *file)
+/* warning, can modify 'string' */
+void BLI_split_dirfile(char *string, char *dir, char *file)
{
int a;
#ifdef WIN32
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index ecc11d080b5..a48ca83c381 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -1422,6 +1422,17 @@ static void direct_link_brush(FileData *fd, Brush *brush)
brush->mtex[a]= newdataadr(fd, brush->mtex[a]);
}
+static void direct_link_script(FileData *fd, Script *script)
+{
+ script->id.us = 1;
+ script->py_draw =
+ script->py_event =
+ script->py_button =
+ script->py_browsercallback =
+ script->py_globaldict =
+ script->flags = NULL;
+}
+
/* ************ READ CurveMapping *************** */
/* cuma itself has been read! */
@@ -3726,9 +3737,13 @@ static void lib_link_screen(FileData *fd, Main *main)
}
else if(sl->spacetype==SPACE_SCRIPT) {
- SpaceScript *sc= (SpaceScript *)sl;
- sc->script = NULL;
+ SpaceScript *scpt= (SpaceScript *)sl;
+ /*sc->script = NULL; - 2.45 set to null, better re-run the script */
+ if (scpt->script) {
+ scpt->script = newlibadr(fd, sc->id.lib, scpt->script);
+ SCRIPT_SET_NULL(scpt->script);
+ }
}
else if(sl->spacetype==SPACE_OOPS) {
SpaceOops *so= (SpaceOops *)sl;
@@ -3899,9 +3914,14 @@ void lib_link_screen_restore(Main *newmain, Scene *curscene)
if(st->text==NULL) st->text= newmain->text.first;
}
else if(sl->spacetype==SPACE_SCRIPT) {
- SpaceScript *sc= (SpaceScript *)sl;
-
- sc->script = NULL;
+ SpaceScript *scpt= (SpaceScript *)sl;
+
+ scpt->script= restore_pointer_by_name(newmain, (ID *)scpt->script, 1);
+
+ /*sc->script = NULL; - 2.45 set to null, better re-run the script */
+ if (scpt->script) {
+ SCRIPT_SET_NULL(scpt->script);
+ }
}
else if(sl->spacetype==SPACE_OOPS) {
SpaceOops *so= (SpaceOops *)sl;
@@ -4359,6 +4379,9 @@ static BHead *read_libblock(FileData *fd, Main *main, BHead *bhead, int flag, ID
case ID_PA:
direct_link_particlesettings(fd, (ParticleSettings*)id);
break;
+ case ID_SCRIPT:
+ direct_link_script(fd, (Script*)id);
+ break;
}
/*link direct data of ID properties*/
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 6fcb5312da8..a4c91d77f5e 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -1955,6 +1955,18 @@ static void write_brushes(WriteData *wd, ListBase *idbase)
}
}
+static void write_scripts(WriteData *wd, ListBase *idbase)
+{
+ Script *script;
+
+ for(script=idbase->first; script; script= script->id.next) {
+ if(script->id.us>0 || wd->current) {
+ writestruct(wd, ID_SCRIPT, "Script", 1, script);
+ if (script->id.properties) IDP_WriteProperty(script->id.properties, wd);
+ }
+ }
+}
+
static void write_global(WriteData *wd)
{
FileGlobal fg;
@@ -2020,6 +2032,7 @@ static int write_file_handle(int handle, MemFile *compare, MemFile *current, int
write_particlesettings(wd, &G.main->particle);
write_nodetrees(wd, &G.main->nodetree);
write_brushes (wd, &G.main->brush);
+ write_scripts (wd, &G.main->script);
if(current==NULL)
write_libraries(wd, G.main->next); /* no library save in undo */
diff --git a/source/blender/include/BPI_script.h b/source/blender/include/BPI_script.h
deleted file mode 100644
index 80ac8b46900..00000000000
--- a/source/blender/include/BPI_script.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/**
- * include/BPI_script.h (jan-2004 ianwill)
- *
- * $Id$
- *
- * Header for BPython's script structure. BPI: Blender Python external include
- * file.
- *
- * ***** BEGIN GPL/BL DUAL 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. The Blender
- * Foundation also sells licenses for use in proprietary software under
- * the Blender License. See http://www.blender.org/BL/ for information
- * about this.
- *
- * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
- *
- * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
- * All rights reserved.
- *
- * This is a new part of Blender.
- *
- * Contributor(s): Willian P. Germano.
- *
- * ***** END GPL/BL DUAL LICENSE BLOCK *****
- */
-
-#ifndef BPI_SCRIPT_H
-#define BPI_SCRIPT_H
-
-//#include "DNA_listBase.h"
-#include "DNA_ID.h"
-
-typedef struct Script {
- ID id;
-
- void *py_draw;
- void *py_event;
- void *py_button;
- void *py_browsercallback;
- void *py_globaldict;
-
- int flags, lastspace;
-
-} Script;
-
-/* Note: a script that registers callbacks in the script->py_* pointers
- * above (or calls the file or image selectors) needs to keep its global
- * dictionary until Draw.Exit() is called and the callbacks removed.
- * Unsetting SCRIPT_RUNNING means the interpreter reached the end of the
- * script and returned control to Blender, but we can't get rid of its
- * namespace (global dictionary) while SCRIPT_GUI or SCRIPT_FILESEL is set,
- * because of the callbacks. The flags and the script name are saved in
- * each running script's global dictionary, under '__script__'. */
-
-/* Flags */
-#define SCRIPT_RUNNING 0x01
-#define SCRIPT_GUI 0x02
-#define SCRIPT_FILESEL 0x04
-
-#endif /* BPI_SCRIPT_H */
diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h
index 9efeffbe691..213ccee7e29 100644
--- a/source/blender/makesdna/DNA_space_types.h
+++ b/source/blender/makesdna/DNA_space_types.h
@@ -291,6 +291,24 @@ typedef struct SpaceText {
} SpaceText;
+typedef struct Script {
+ ID id;
+
+ void *py_draw;
+ void *py_event;
+ void *py_button;
+ void *py_browsercallback;
+ void *py_globaldict;
+
+ int flags, lastspace;
+ char scriptname[256]; /* store the script file here so we can re-run it on loading blender, if "Enable Scripts" is on */
+ char scriptarg[256];
+} Script;
+#define SCRIPT_SET_NULL(_script) _script->py_draw = _script->py_event = _script->py_button = _script->py_browsercallback = _script->py_globaldict = _script->flags = 0;
+#define SCRIPT_RUNNING 0x01
+#define SCRIPT_GUI 0x02
+#define SCRIPT_FILESEL 0x04
+
typedef struct SpaceScript {
SpaceLink *next, *prev;
int spacetype;
diff --git a/source/blender/python/BPY_extern.h b/source/blender/python/BPY_extern.h
index c3aef82751d..d7bd4f22fc6 100644
--- a/source/blender/python/BPY_extern.h
+++ b/source/blender/python/BPY_extern.h
@@ -44,13 +44,13 @@ struct ScriptLink; /* DNA_scriptlink_types.h */
struct ListBase; /* DNA_listBase.h */
struct SpaceText; /* DNA_space_types.h */
struct SpaceScript; /* DNA_space_types.h */
-struct Script; /* BPI_script.h */
struct ScrArea; /* DNA_screen_types.h */
struct bScreen; /* DNA_screen_types.h */
struct bConstraint; /* DNA_constraint_types.h */
struct bPythonConstraint; /* DNA_constraint_types.h */
struct bConstraintOb; /* DNA_constraint_types.h */
struct bConstraintTarget; /* DNA_constraint_types.h*/
+struct Script; /* DNA_screen_types.h */
#ifdef __cplusplus
extern "C" {
#endif
@@ -94,6 +94,7 @@ extern "C" {
int BPY_txt_do_python_Text( struct Text *text );
int BPY_menu_do_python( short menutype, int event );
void BPY_run_python_script( char *filename );
+ int BPY_run_script(struct Script *script);
void BPY_free_compiled_text( struct Text *text );
void BPY_clear_bad_scriptlinks( struct Text *byebye );
@@ -126,6 +127,7 @@ extern "C" {
unsigned short event, short val, char ascii );
void BPY_clear_script( struct Script *script );
void BPY_free_finished_script( struct Script *script );
+ void BPY_scripts_clear_pyobjects( void );
/* void BPY_Err_Handle(struct Text *text); */
/* void BPY_clear_bad_scriptlink(struct ID *id, struct Text *byebye); */
diff --git a/source/blender/python/BPY_interface.c b/source/blender/python/BPY_interface.c
index 2336c343f68..d4d91e1a19a 100644
--- a/source/blender/python/BPY_interface.c
+++ b/source/blender/python/BPY_interface.c
@@ -57,7 +57,7 @@
#include "MEM_guardedalloc.h"
#include "BPY_extern.h"
#include "BPY_menus.h"
-#include "BPI_script.h"
+#include "DNA_space_types.h"
#include "BKE_global.h"
#include "BKE_main.h"
#include "BKE_armature.h"
@@ -661,7 +661,7 @@ int BPY_txt_do_python_Text( struct Text *text )
script->py_event = NULL;
script->py_button = NULL;
script->py_browsercallback = NULL;
-
+ strncpy(script->scriptname, text->id.name+2, sizeof(script->scriptname));
gilstate = PyGILState_Ensure();
py_dict = CreateGlobalDictionary( );
@@ -768,6 +768,178 @@ void BPY_run_python_script( char *fn )
}
}
+int BPY_run_script(Script *script)
+{
+ PyObject *py_dict, *py_res, *pyarg;
+ Text *text = NULL;
+ BPy_constant *info;
+ int len;
+ char *buffer, *s;
+
+ FILE *fp = NULL;
+
+ PyGILState_STATE gilstate = PyGILState_Ensure();
+
+ if (!BLI_exists(script->scriptname)) {
+ /* The file dosnt exist, maybe this blend file was made on some other persons computer? */
+ char fname[FILE_MAX];
+ char fpath[FILE_MAX];
+ char ftmp[FILE_MAX];
+
+ strcpy(ftmp, script->scriptname);
+ BLI_split_dirfile(ftmp, fpath, fname);
+ BLI_make_file_string("/", fpath, bpy_gethome(1), fname);
+
+ if (BLI_exists(fpath)) {
+ strncpy(script->scriptname, fpath, sizeof(script->scriptname));
+ } else if (U.pythondir[0]) {
+ BLI_make_file_string("/", fpath, U.pythondir, fname);
+ if (BLI_exists(fpath)) {
+ strncpy(script->scriptname, fpath, sizeof(script->scriptname));
+ }
+ }
+
+ /* cant find the file?, fallback to text block */
+ if (!BLI_exists(script->scriptname)) {
+ for (text=G.main->text.first; text; text=text->id.next) {
+ if (strcmp(script->scriptname, text->id.name+2)==0) {
+ break;
+ }
+ }
+ }
+ }
+ if (text) {
+ Py_INCREF( Py_None );
+ pyarg = Py_None;
+ } else {
+ fp = fopen( script->scriptname, "rb" );
+ if( !fp ) {
+ printf( "Error loading script: couldn't open file %s\n", script->scriptname );
+ if( G.main->script.first )
+ free_libblock( &G.main->script, script );
+ PyGILState_Release(gilstate);
+ return 0;
+ }
+
+ if( script->scriptarg[0] == '\0' ) { /* no submenus */
+ Py_INCREF( Py_None );
+ pyarg = Py_None;
+ } else {
+ pyarg = PyString_FromString( script->scriptarg );
+ }
+ }
+
+ script->id.us = 1;
+ script->flags = SCRIPT_RUNNING;
+ script->py_draw = NULL;
+ script->py_event = NULL;
+ script->py_button = NULL;
+ script->py_browsercallback = NULL;
+
+ py_dict = CreateGlobalDictionary( );
+
+ script->py_globaldict = py_dict;
+
+ if( !setup_armature_weakrefs()){
+ printf("Oops - weakref dict\n");
+ if( G.main->script.first )
+ free_libblock( &G.main->script, script );
+ ReleaseGlobalDictionary( py_dict );
+ MEM_freeN( buffer );
+ PyGILState_Release(gilstate);
+ return 0;
+ }
+
+ info = ( BPy_constant * ) PyConstant_New( );
+ if( info ) {
+ PyConstant_Insert( info, "name",
+ PyString_FromString( script->id.name + 2 ) );
+ PyConstant_Insert( info, "arg", pyarg );
+ EXPP_dict_set_item_str( py_dict, "__script__",
+ ( PyObject * ) info );
+ }
+
+ if (text) {
+ py_res = RunPython( text, py_dict );
+ } else {
+ /* Previously we used PyRun_File to run directly the code on a FILE
+ * object, but as written in the Python/C API Ref Manual, chapter 2,
+ * 'FILE structs for different C libraries can be different and
+ * incompatible'.
+ * So now we load the script file data to a buffer */
+
+ fseek( fp, 0L, SEEK_END );
+ len = ftell( fp );
+ fseek( fp, 0L, SEEK_SET );
+
+ buffer = MEM_mallocN( len + 2, "pyfilebuf" ); /* len+2 to add '\n\0' */
+ len = fread( buffer, 1, len, fp );
+
+ buffer[len] = '\n'; /* fix syntax error in files w/o eol */
+ buffer[len + 1] = '\0';
+
+ /* fast clean-up of dos cr/lf line endings: change '\r' to space */
+
+ /* we also have to check for line splitters: '\\' */
+ /* to avoid possible syntax errors on dos files on win */
+ /**/
+ /* but first make sure we won't disturb memory below &buffer[0]: */
+ if( *buffer == '\r' )
+ *buffer = ' ';
+
+ /* now handle the whole buffer */
+ for( s = buffer + 1; *s != '\0'; s++ ) {
+ if( *s == '\r' ) {
+ if( *( s - 1 ) == '\\' ) { /* special case: long lines split with '\': */
+ *( s - 1 ) = ' '; /* we write ' \', because '\ ' is a syntax error */
+ *s = '\\';
+ } else
+ *s = ' '; /* not a split line, just replace '\r' with ' ' */
+ }
+ }
+
+ fclose( fp );
+
+
+ py_res = PyRun_String( buffer, Py_file_input, py_dict, py_dict );
+ MEM_freeN( buffer );
+ }
+
+ if( !py_res ) { /* Failed execution of the script */
+
+ BPY_Err_Handle( script->id.name + 2 );
+ ReleaseGlobalDictionary( py_dict );
+ script->py_globaldict = NULL;
+ if( G.main->script.first )
+ free_libblock( &G.main->script, script );
+ error( "Python script error: check console" );
+
+ PyGILState_Release(gilstate);
+ return 0;
+ } else {
+ Py_DECREF( py_res );
+ script->flags &= ~SCRIPT_RUNNING;
+
+ if( !script->flags ) {
+ ReleaseGlobalDictionary( py_dict );
+ script->py_globaldict = NULL;
+ free_libblock( &G.main->script, script );
+
+ /* special case: called from the menu in the Scripts window
+ * we have to change sc->script pointer, since it'll be freed here.*/
+ if( curarea->spacetype == SPACE_SCRIPT ) {
+ SpaceScript *sc = curarea->spacedata.first;
+ sc->script = G.main->script.first; /* can be null, which is ok ... */
+ /* ... meaning no other script is running right now. */
+ }
+
+ }
+ }
+
+ PyGILState_Release(gilstate);
+ return 1;
+}
+
/****************************************************************************
* Description: This function executes the script chosen from a menu.
* Notes: It is called by the ui code in src/header_???.c when a user
@@ -777,17 +949,14 @@ void BPY_run_python_script( char *fn )
*****************************************************************************/
int BPY_menu_do_python( short menutype, int event )
{
- PyObject *py_dict, *py_res, *pyarg = NULL;
- BPy_constant *info;
+ char *argstr = NULL;
BPyMenu *pym;
BPySubMenu *pysm;
- FILE *fp = NULL;
- char *buffer, *s;
- char filestr[FILE_MAXDIR + FILE_MAXFILE];
char scriptname[21];
Script *script = NULL;
- int len;
+ int ret, len;
PyGILState_STATE gilstate;
+ char filestr[FILE_MAX];
pym = BPyMenu_GetEntry( menutype, ( short ) event );
@@ -817,7 +986,7 @@ int BPY_menu_do_python( short menutype, int event )
if( arg >= 0 ) {
while( arg-- )
pysm = pysm->next;
- pyarg = PyString_FromString( pysm->arg );
+ argstr = pysm->arg;
} else {
PyGILState_Release(gilstate);
return 0;
@@ -825,11 +994,6 @@ int BPY_menu_do_python( short menutype, int event )
}
}
- if( !pyarg ) { /* no submenus */
- Py_INCREF( Py_None );
- pyarg = Py_None;
- }
-
if( pym->dir ) { /* script is in U.pythondir */
char upythondir[FILE_MAXDIR];
@@ -850,14 +1014,6 @@ int BPY_menu_do_python( short menutype, int event )
BLI_make_file_string( "/", filestr, scriptsdir, pym->filename );
}
- fp = fopen( filestr, "rb" );
- if( !fp ) {
- printf( "Error loading script: couldn't open file %s\n",
- filestr );
- PyGILState_Release(gilstate);
- return 0;
- }
-
BLI_strncpy(scriptname, pym->name, 21);
len = strlen(scriptname) - 1;
/* by convention, scripts that open the file browser or have submenus
@@ -872,7 +1028,6 @@ int BPY_menu_do_python( short menutype, int event )
if( !script ) {
printf( "couldn't allocate memory for Script struct!" );
- fclose( fp );
PyGILState_Release(gilstate);
return 0;
}
@@ -917,111 +1072,12 @@ int BPY_menu_do_python( short menutype, int event )
}
break;
}
-
- script->id.us = 1;
- script->flags = SCRIPT_RUNNING;
- script->py_draw = NULL;
- script->py_event = NULL;
- script->py_button = NULL;
- script->py_browsercallback = NULL;
-
- py_dict = CreateGlobalDictionary( );
-
- script->py_globaldict = py_dict;
-
- info = ( BPy_constant * ) PyConstant_New( );
- if( info ) {
- PyConstant_Insert( info, "name",
- PyString_FromString( script->id.name + 2 ) );
- PyConstant_Insert( info, "arg", pyarg );
- EXPP_dict_set_item_str( py_dict, "__script__",
- ( PyObject * ) info );
- }
-
- /* Previously we used PyRun_File to run directly the code on a FILE
- * object, but as written in the Python/C API Ref Manual, chapter 2,
- * 'FILE structs for different C libraries can be different and
- * incompatible'.
- * So now we load the script file data to a buffer */
-
- fseek( fp, 0L, SEEK_END );
- len = ftell( fp );
- fseek( fp, 0L, SEEK_SET );
-
- buffer = MEM_mallocN( len + 2, "pyfilebuf" ); /* len+2 to add '\n\0' */
- len = fread( buffer, 1, len, fp );
-
- buffer[len] = '\n'; /* fix syntax error in files w/o eol */
- buffer[len + 1] = '\0';
-
- /* fast clean-up of dos cr/lf line endings: change '\r' to space */
-
- /* we also have to check for line splitters: '\\' */
- /* to avoid possible syntax errors on dos files on win */
- /**/
- /* but first make sure we won't disturb memory below &buffer[0]: */
- if( *buffer == '\r' )
- *buffer = ' ';
-
- /* now handle the whole buffer */
- for( s = buffer + 1; *s != '\0'; s++ ) {
- if( *s == '\r' ) {
- if( *( s - 1 ) == '\\' ) { /* special case: long lines split with '\': */
- *( s - 1 ) = ' '; /* we write ' \', because '\ ' is a syntax error */
- *s = '\\';
- } else
- *s = ' '; /* not a split line, just replace '\r' with ' ' */
- }
- }
-
- fclose( fp );
-
-
- if( !setup_armature_weakrefs()){
- printf("Oops - weakref dict\n");
- MEM_freeN( buffer );
- PyGILState_Release(gilstate);
- return 0;
- }
-
- /* run the string buffer */
-
- py_res = PyRun_String( buffer, Py_file_input, py_dict, py_dict );
-
- MEM_freeN( buffer );
-
- if( !py_res ) { /* Failed execution of the script */
-
- BPY_Err_Handle( script->id.name + 2 );
- ReleaseGlobalDictionary( py_dict );
- script->py_globaldict = NULL;
- if( G.main->script.first )
- free_libblock( &G.main->script, script );
- error( "Python script error: check console" );
-
- PyGILState_Release(gilstate);
- return 0;
- } else {
- Py_DECREF( py_res );
- script->flags &= ~SCRIPT_RUNNING;
-
- if( !script->flags ) {
- ReleaseGlobalDictionary( py_dict );
- script->py_globaldict = NULL;
- free_libblock( &G.main->script, script );
-
- /* special case: called from the menu in the Scripts window
- * we have to change sc->script pointer, since it'll be freed here.*/
- if( curarea->spacetype == SPACE_SCRIPT ) {
- SpaceScript *sc = curarea->spacedata.first;
- sc->script = G.main->script.first; /* can be null, which is ok ... */
- /* ... meaning no other script is running right now. */
- }
-
- }
- }
-
- PyGILState_Release(gilstate);
+
+ strncpy(script->scriptname, filestr, sizeof(script->scriptname));
+ if (argstr!=NULL && argstr[0] != '\0')
+ strncpy(script->scriptarg, argstr, sizeof(script->scriptarg));
+
+ ret = BPY_run_script(script);
return 1; /* normal return */
}
@@ -1115,7 +1171,9 @@ void BPY_clear_script( Script * script )
script->py_event = NULL;
script->py_button = NULL;
script->py_browsercallback = NULL;
-
+ script->scriptname[0] = '\0';
+ script->scriptarg[0] = '\0';
+
dict = script->py_globaldict;
if( dict ) {
@@ -2889,3 +2947,17 @@ void init_ourReload( void )
d = PyModule_GetDict( m );
EXPP_dict_set_item_str( d, "reload", reload );
}
+
+
+void BPY_scripts_clear_pyobjects( void )
+{
+ Script *script;
+ for (script=G.main->script.first; script; script=script->id.next) {
+ Py_XDECREF((PyObject *)script->py_draw);
+ Py_XDECREF((PyObject *)script->py_event);
+ Py_XDECREF((PyObject *)script->py_button);
+ Py_XDECREF((PyObject *)script->py_browsercallback);
+ Py_XDECREF((PyObject *)script->py_globaldict);
+ SCRIPT_SET_NULL(script);
+ }
+} \ No newline at end of file
diff --git a/source/blender/python/api2_2x/Blender.c b/source/blender/python/api2_2x/Blender.c
index a93316d308f..d520dded486 100644
--- a/source/blender/python/api2_2x/Blender.c
+++ b/source/blender/python/api2_2x/Blender.c
@@ -54,7 +54,7 @@ struct ID; /*keep me up here */
#include "BKE_library.h"
#include "BKE_main.h"
#include "BIF_space.h"
-#include "BPI_script.h"
+#include "DNA_space_types.h" /* script struct */
#include "BSE_headerbuttons.h"
#include "DNA_screen_types.h" /* for SPACE_VIEW3D */
#include "DNA_userdef_types.h"
diff --git a/source/blender/python/api2_2x/Draw.c b/source/blender/python/api2_2x/Draw.c
index 284a6d92ba2..a4bbeba65ac 100644
--- a/source/blender/python/api2_2x/Draw.c
+++ b/source/blender/python/api2_2x/Draw.c
@@ -52,7 +52,7 @@
#include "BIF_space.h"
#include "BIF_interface.h"
#include "BIF_toolbox.h"
-#include "BPI_script.h" /* script struct */
+#include "DNA_space_types.h" /* script struct */
#include "Image.h" /* for accessing Blender.Image objects */
#include "IMB_imbuf_types.h" /* for the IB_rect define */
#include "interface.h"
@@ -912,6 +912,8 @@ static PyObject *Method_Exit( PyObject * self )
/* remove our lock to the current namespace */
script->flags &= ~SCRIPT_GUI;
+ script->scriptname[0] = '\0';
+ script->scriptarg[0] = '\0';
Py_RETURN_NONE;
}
diff --git a/source/blender/python/api2_2x/Window.c b/source/blender/python/api2_2x/Window.c
index 7d346ed9cd9..21caab3e697 100644
--- a/source/blender/python/api2_2x/Window.c
+++ b/source/blender/python/api2_2x/Window.c
@@ -38,7 +38,6 @@
#include "BKE_main.h"
#include "BKE_object.h" /* for during_script() and during_scriptlink() */
#include "BKE_scene.h" /* scene_find_camera() */
-#include "BPI_script.h"
#include "BIF_mywindow.h"
#include "BIF_imasel.h"
#include "BSE_headerbuttons.h"
diff --git a/source/blender/src/drawscript.c b/source/blender/src/drawscript.c
index b009c3b8388..70ae4b1c94d 100644
--- a/source/blender/src/drawscript.c
+++ b/source/blender/src/drawscript.c
@@ -58,7 +58,6 @@
#include "BKE_global.h"
#include "BKE_main.h"
-#include "BPI_script.h"
#include "BPY_extern.h"
#include "BIF_gl.h"
@@ -95,6 +94,20 @@ void drawscriptspace(ScrArea *sa, void *spacedata)
script = sc->script;
+ /* Is this script loaded from a file and it needs running??? */
+ if ( (G.f & G_DOSCRIPTLINKS) &&
+ script->scriptname[0] != '\0' &&
+ (script->flags == NULL &&
+ script->py_event == NULL &&
+ script->py_button == NULL &&
+ script->py_draw == NULL )
+ ) {
+ if (!BPY_run_script(script)) {
+ /* if this fails, script will be free'd */
+ script = NULL;
+ }
+ }
+
if (script->py_draw) {
BPY_spacescript_do_pywin_draw(sc);
}
@@ -114,6 +127,22 @@ void winqreadscriptspace(struct ScrArea *sa, void *spacedata, struct BWinEvent *
Script *script = sc->script;
if (script) {
+ /* Is this script loaded from a file and it needs running??? */
+ if ( (G.f & G_DOSCRIPTLINKS) &&
+ script->scriptname[0] != '\0' &&
+ (script->flags == NULL &&
+ script->py_event == NULL &&
+ script->py_button == NULL &&
+ script->py_draw == NULL )
+ ) {
+ if (!BPY_run_script(script)) {
+ /* if this fails, script will be free'd */
+ script = NULL;
+ }
+ }
+ }
+
+ if (script) {
if (script->py_event || script->py_button)
BPY_spacescript_do_pywin_event(sc, event, val, ascii);
diff --git a/source/blender/src/editimasel.c b/source/blender/src/editimasel.c
index f3e2dcccc81..e93687fef93 100644
--- a/source/blender/src/editimasel.c
+++ b/source/blender/src/editimasel.c
@@ -89,8 +89,6 @@
#include "BLO_readfile.h"
-#include "BPI_script.h"
-
#include "BSE_drawipo.h"
#include "BSE_drawimasel.h"
#include "BSE_edit.h"
diff --git a/source/blender/src/filesel.c b/source/blender/src/filesel.c
index 1262683b90a..ffd6574d781 100644
--- a/source/blender/src/filesel.c
+++ b/source/blender/src/filesel.c
@@ -102,7 +102,6 @@
#include "BDR_editcurve.h"
#include "BDR_editobject.h"
-#include "BPI_script.h"
#include "BSE_filesel.h"
#include "BSE_view.h"
diff --git a/source/blender/src/header_script.c b/source/blender/src/header_script.c
index de76a30ecdd..ba43ae2e7e5 100644
--- a/source/blender/src/header_script.c
+++ b/source/blender/src/header_script.c
@@ -60,7 +60,6 @@
#include "BKE_sca.h"
#include "BSE_filesel.h"
-#include "BPI_script.h"
#include "BPY_extern.h"
#include "BPY_menus.h"
diff --git a/source/blender/src/headerbuttons.c b/source/blender/src/headerbuttons.c
index e3c594f4ea3..d2d3a3352b7 100644
--- a/source/blender/src/headerbuttons.c
+++ b/source/blender/src/headerbuttons.c
@@ -148,8 +148,6 @@
#include "BIF_writeimage.h"
#include "BIF_butspace.h"
-#include "BPI_script.h"
-
#include "BSE_edit.h"
#include "BSE_filesel.h"
#include "BSE_headerbuttons.h"
diff --git a/source/blender/src/space.c b/source/blender/src/space.c
index 6b5c0e57da5..af6cfa8de9f 100644
--- a/source/blender/src/space.c
+++ b/source/blender/src/space.c
@@ -1031,6 +1031,7 @@ void BIF_undo(void)
else {
/* now also in faceselect mode */
if(U.uiflag & USER_GLOBALUNDO) {
+ BPY_scripts_clear_pyobjects();
BKE_undo_step(1);
sound_initialize_sounds();
}