2010-01-31 23:41:46 +00:00
/**
2010-03-21 01:14:04 +00:00
* $ Id $
2010-01-31 23:41:46 +00:00
*
* * * * * * 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 ,
2010-02-12 13:34:04 +00:00
* Inc . , 51 Franklin Street , Fifth Floor , Boston , MA 02110 - 1301 , USA .
2010-01-31 23:41:46 +00:00
*
* Contributor ( s ) : Campbell Barton
*
* * * * * * END GPL LICENSE BLOCK * * * * *
*/
# include "bpy_app.h"
2010-03-14 17:18:36 +00:00
# include "BLI_path_util.h"
2011-01-07 18:36:47 +00:00
# include "BLI_utildefines.h"
2010-03-14 17:18:36 +00:00
2011-01-07 19:18:31 +00:00
2010-01-31 23:41:46 +00:00
# include "BKE_blender.h"
# include "BKE_global.h"
# include "structseq.h"
2010-10-13 14:14:22 +00:00
# include "../generic/py_capi_utils.h"
2010-01-31 23:41:46 +00:00
# ifdef BUILD_DATE
2010-03-14 17:18:36 +00:00
extern char build_date [ ] ;
extern char build_time [ ] ;
extern char build_rev [ ] ;
extern char build_platform [ ] ;
extern char build_type [ ] ;
2010-10-18 12:56:14 +00:00
extern char build_cflags [ ] ;
extern char build_cxxflags [ ] ;
extern char build_linkflags [ ] ;
2010-10-19 05:00:36 +00:00
extern char build_system [ ] ;
2010-01-31 23:41:46 +00:00
# endif
static PyTypeObject BlenderAppType ;
static PyStructSequence_Field app_info_fields [ ] = {
2010-12-03 17:05:21 +00:00
{ ( char * ) " version " , ( char * ) " The Blender version as a tuple of 3 numbers. eg. (2, 50, 11) " } ,
{ ( char * ) " version_string " , ( char * ) " The Blender version formatted as a string " } ,
{ ( char * ) " binary_path " , ( char * ) " The location of blenders executable, useful for utilities that spawn new instances " } ,
{ ( char * ) " background " , ( char * ) " Boolean, True when blender is running without a user interface (started with -b) " } ,
2010-01-31 23:41:46 +00:00
/* buildinfo */
2010-12-03 17:05:21 +00:00
{ ( char * ) " build_date " , ( char * ) " The date this blender instance was built " } ,
{ ( char * ) " build_time " , ( char * ) " The time this blender instance was built " } ,
{ ( char * ) " build_revision " , ( char * ) " The subversion revision this blender instance was built with " } ,
{ ( char * ) " build_platform " , ( char * ) " The platform this blender instance was built for " } ,
{ ( char * ) " build_type " , ( char * ) " The type of build (Release, Debug) " } ,
2010-12-06 12:36:55 +00:00
{ ( char * ) " build_cflags " , ( char * ) " C compiler flags " } ,
{ ( char * ) " build_cxxflags " , ( char * ) " C++ compiler flags " } ,
{ ( char * ) " build_linkflags " , ( char * ) " Binary linking flags " } ,
{ ( char * ) " build_system " , ( char * ) " Build system used " } ,
2011-02-13 10:52:18 +00:00
{ NULL }
2010-01-31 23:41:46 +00:00
} ;
static PyStructSequence_Desc app_info_desc = {
2010-12-03 17:05:21 +00:00
( char * ) " bpy.app " , /* name */
( char * ) " This module contains application values that remain unchanged during runtime. " , /* doc */
2010-01-31 23:41:46 +00:00
app_info_fields , /* fields */
2010-05-18 15:57:51 +00:00
( sizeof ( app_info_fields ) / sizeof ( PyStructSequence_Field ) ) - 1
2010-01-31 23:41:46 +00:00
} ;
static PyObject * make_app_info ( void )
{
extern char bprogname [ ] ; /* argv[0] from creator.c */
PyObject * app_info ;
int pos = 0 ;
app_info = PyStructSequence_New ( & BlenderAppType ) ;
if ( app_info = = NULL ) {
return NULL ;
}
# define SetIntItem(flag) \
PyStructSequence_SET_ITEM ( app_info , pos + + , PyLong_FromLong ( flag ) )
2010-02-12 21:45:47 +00:00
# define SetStrItem(str) \
PyStructSequence_SET_ITEM ( app_info , pos + + , PyUnicode_FromString ( str ) )
2010-01-31 23:41:46 +00:00
# define SetObjItem(obj) \
PyStructSequence_SET_ITEM ( app_info , pos + + , obj )
SetObjItem ( Py_BuildValue ( " (iii) " , BLENDER_VERSION / 100 , BLENDER_VERSION % 100 , BLENDER_SUBVERSION ) ) ;
SetObjItem ( PyUnicode_FromFormat ( " %d.%02d (sub %d) " , BLENDER_VERSION / 100 , BLENDER_VERSION % 100 , BLENDER_SUBVERSION ) ) ;
SetStrItem ( bprogname ) ;
2010-05-18 15:57:51 +00:00
SetObjItem ( PyBool_FromLong ( G . background ) ) ;
2010-01-31 23:41:46 +00:00
/* build info */
2010-02-28 22:48:50 +00:00
# ifdef BUILD_DATE
2010-03-14 17:18:36 +00:00
SetStrItem ( build_date ) ;
SetStrItem ( build_time ) ;
SetStrItem ( build_rev ) ;
SetStrItem ( build_platform ) ;
SetStrItem ( build_type ) ;
2010-10-18 12:56:14 +00:00
SetStrItem ( build_cflags ) ;
SetStrItem ( build_cxxflags ) ;
SetStrItem ( build_linkflags ) ;
2010-10-19 05:00:36 +00:00
SetStrItem ( build_system ) ;
2010-02-28 22:48:50 +00:00
# else
2010-10-13 00:08:24 +00:00
SetStrItem ( " Unknown " ) ;
SetStrItem ( " Unknown " ) ;
2010-10-19 05:00:36 +00:00
SetStrItem ( " Unknown " ) ;
2010-10-13 00:08:24 +00:00
SetStrItem ( " Unknown " ) ;
SetStrItem ( " Unknown " ) ;
SetStrItem ( " Unknown " ) ;
2010-10-18 12:56:14 +00:00
SetStrItem ( " Unknown " ) ;
SetStrItem ( " Unknown " ) ;
SetStrItem ( " Unknown " ) ;
2010-02-28 22:48:50 +00:00
# endif
2010-01-31 23:41:46 +00:00
# undef SetIntItem
# undef SetStrItem
# undef SetObjItem
if ( PyErr_Occurred ( ) ) {
Py_CLEAR ( app_info ) ;
return NULL ;
}
return app_info ;
}
2010-10-12 23:47:43 +00:00
/* a few getsets because it makes sense for them to be in bpy.app even though
* they are not static */
2010-10-13 23:25:08 +00:00
static PyObject * bpy_app_debug_get ( PyObject * UNUSED ( self ) , void * UNUSED ( closure ) )
2010-10-12 23:47:43 +00:00
{
return PyBool_FromLong ( G . f & G_DEBUG ) ;
}
2010-10-13 23:25:08 +00:00
static int bpy_app_debug_set ( PyObject * UNUSED ( self ) , PyObject * value , void * UNUSED ( closure ) )
2010-10-12 23:47:43 +00:00
{
int param = PyObject_IsTrue ( value ) ;
if ( param < 0 ) {
PyErr_SetString ( PyExc_TypeError , " bpy.app.debug can only be True/False " ) ;
return - 1 ;
}
if ( param ) G . f | = G_DEBUG ;
else G . f & = ~ G_DEBUG ;
return 0 ;
}
2010-12-15 06:03:45 +00:00
static PyObject * bpy_app_debug_value_get ( PyObject * UNUSED ( self ) , void * UNUSED ( closure ) )
{
return PyLong_FromSsize_t ( G . rt ) ;
}
static int bpy_app_debug_value_set ( PyObject * UNUSED ( self ) , PyObject * value , void * UNUSED ( closure ) )
{
int param = PyLong_AsSsize_t ( value ) ;
if ( param = = - 1 & & PyErr_Occurred ( ) ) {
PyErr_SetString ( PyExc_TypeError , " bpy.app.debug_value can only be set to a whole number " ) ;
return - 1 ;
}
G . rt = param ;
return 0 ;
}
2010-10-13 23:25:08 +00:00
static PyObject * bpy_app_tempdir_get ( PyObject * UNUSED ( self ) , void * UNUSED ( closure ) )
2010-10-12 23:47:43 +00:00
{
extern char btempdir [ ] ;
2010-10-13 14:14:22 +00:00
return PyC_UnicodeFromByte ( btempdir ) ;
2010-10-12 23:47:43 +00:00
}
2010-11-27 02:39:51 +00:00
static PyObject * bpy_app_driver_dict_get ( PyObject * UNUSED ( self ) , void * UNUSED ( closure ) )
{
if ( bpy_pydriver_Dict = = NULL )
if ( bpy_pydriver_create_dict ( ) ! = 0 ) {
PyErr_SetString ( PyExc_RuntimeError , " bpy.app.driver_namespace failed to create dictionary " ) ;
return NULL ;
}
Py_INCREF ( bpy_pydriver_Dict ) ;
return bpy_pydriver_Dict ;
}
2011-02-13 10:52:18 +00:00
static PyGetSetDef bpy_app_getsets [ ] = {
2010-12-03 17:05:21 +00:00
{ ( char * ) " debug " , bpy_app_debug_get , bpy_app_debug_set , ( char * ) " Boolean, set when blender is running in debug mode (started with -d) " , NULL } ,
2010-12-15 06:03:45 +00:00
{ ( char * ) " debug_value " , bpy_app_debug_value_get , bpy_app_debug_value_set , ( char * ) " Int, number which can be set to non-zero values for testing purposes. " , NULL } ,
2010-12-03 17:05:21 +00:00
{ ( char * ) " tempdir " , bpy_app_tempdir_get , NULL , ( char * ) " String, the temp directory used by blender (read-only) " , NULL } ,
{ ( char * ) " driver_namespace " , bpy_app_driver_dict_get , NULL , ( char * ) " Dictionary for drivers namespace, editable in-place, reset on file load (read-only) " , NULL } ,
2010-11-27 02:39:51 +00:00
{ NULL , NULL , NULL , NULL , NULL }
} ;
2010-10-12 23:47:43 +00:00
static void py_struct_seq_getset_init ( void )
{
/* tricky dynamic members, not to py-spec! */
2010-11-27 02:39:51 +00:00
PyGetSetDef * getset ;
for ( getset = bpy_app_getsets ; getset - > name ; getset + + ) {
PyDict_SetItemString ( BlenderAppType . tp_dict , getset - > name , PyDescr_NewGetSet ( & BlenderAppType , getset ) ) ;
}
2010-10-12 23:47:43 +00:00
}
/* end dynamic bpy.app */
2010-01-31 23:41:46 +00:00
PyObject * BPY_app_struct ( void )
{
PyObject * ret ;
2010-10-12 23:47:43 +00:00
2010-01-31 23:41:46 +00:00
PyStructSequence_InitType ( & BlenderAppType , & app_info_desc ) ;
ret = make_app_info ( ) ;
/* prevent user from creating new instances */
BlenderAppType . tp_init = NULL ;
BlenderAppType . tp_new = NULL ;
2010-10-12 23:47:43 +00:00
/* kindof a hack ontop of PyStructSequence */
py_struct_seq_getset_init ( ) ;
2010-01-31 23:49:04 +00:00
return ret ;
2010-01-31 23:41:46 +00:00
}
2010-10-12 23:47:43 +00:00