| 
									
										
										
										
											2011-02-23 10:52:22 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											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 ***** | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-27 20:10:08 +00:00
										 |  |  | /** \file blender/python/intern/bpy_app.c
 | 
					
						
							|  |  |  |  *  \ingroup pythonintern | 
					
						
							| 
									
										
										
										
											2011-11-05 08:21:12 +00:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This file defines a 'PyStructSequence' accessed via 'bpy.app', mostly | 
					
						
							|  |  |  |  * exposing static applications variables such as version and buildinfo | 
					
						
							|  |  |  |  * however some writable variables have been added such as 'debug' and 'tempdir' | 
					
						
							| 
									
										
										
										
											2011-02-27 20:10:08 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-14 04:15:25 +00:00
										 |  |  | #include <Python.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-31 23:41:46 +00:00
										 |  |  | #include "bpy_app.h"
 | 
					
						
							| 
									
										
										
										
											2011-12-28 12:35:58 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #include "bpy_app_ffmpeg.h"
 | 
					
						
							| 
									
										
										
										
											2012-12-18 18:02:20 +00:00
										 |  |  | #include "bpy_app_build_options.h"
 | 
					
						
							| 
									
										
										
										
											2011-12-28 12:35:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-06-24 16:54:30 +00:00
										 |  |  | #include "bpy_app_handlers.h"
 | 
					
						
							| 
									
										
										
										
											2011-02-14 04:15:25 +00:00
										 |  |  | #include "bpy_driver.h"
 | 
					
						
							| 
									
										
										
										
											2010-01-31 23:41:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 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"}, | 
					
						
							| 
									
										
										
										
											2011-04-01 15:13:58 +00:00
										 |  |  | 	{(char *)"version_char", (char *)"The Blender version character (for minor releases)"}, | 
					
						
							|  |  |  | 	{(char *)"version_cycle", (char *)"The release status of this build alpha/beta/rc/release"}, | 
					
						
							| 
									
										
										
										
											2010-12-03 17:05:21 +00:00
										 |  |  | 	{(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-06-24 16:54:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* submodules */ | 
					
						
							| 
									
										
										
										
											2011-12-28 12:35:58 +00:00
										 |  |  | 	{(char *)"ffmpeg", (char *)"FFmpeg library information backend"}, | 
					
						
							| 
									
										
										
										
											2012-12-18 18:02:20 +00:00
										 |  |  | 	{(char *)"build_options", (char *)"A set containing most important enabled optional build features"}, | 
					
						
							| 
									
										
										
										
											2011-06-24 16:54:30 +00:00
										 |  |  | 	{(char *)"handlers", (char *)"Application handler callbacks"}, | 
					
						
							| 
									
										
										
										
											2011-02-13 10:52:18 +00:00
										 |  |  | 	{NULL} | 
					
						
							| 
									
										
										
										
											2010-01-31 23:41:46 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +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 */ | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	(sizeof(app_info_fields) / sizeof(PyStructSequence_Field)) - 1 | 
					
						
							| 
									
										
										
										
											2010-01-31 23:41:46 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static PyObject *make_app_info(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	PyObject *app_info; | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	int pos = 0; | 
					
						
							| 
									
										
										
										
											2010-01-31 23:41:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	app_info = PyStructSequence_New(&BlenderAppType); | 
					
						
							| 
									
										
										
										
											2010-01-31 23:41:46 +00:00
										 |  |  | 	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)) | 
					
						
							| 
									
										
										
										
											2012-03-04 03:14:38 +00:00
										 |  |  | #define SetBytesItem(str) \
 | 
					
						
							|  |  |  | 	PyStructSequence_SET_ITEM(app_info, pos++, PyBytes_FromString(str)) | 
					
						
							| 
									
										
										
										
											2010-01-31 23:41:46 +00:00
										 |  |  | #define SetObjItem(obj) \
 | 
					
						
							|  |  |  | 	PyStructSequence_SET_ITEM(app_info, pos++, obj) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	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)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-01 15:13:58 +00:00
										 |  |  | 	SetStrItem(STRINGIFY(BLENDER_VERSION_CHAR)); | 
					
						
							| 
									
										
										
										
											2011-04-01 14:04:26 +00:00
										 |  |  | 	SetStrItem(STRINGIFY(BLENDER_VERSION_CYCLE)); | 
					
						
							| 
									
										
										
										
											2011-10-21 17:37:38 +00:00
										 |  |  | 	SetStrItem(BLI_program_path()); | 
					
						
							| 
									
										
										
										
											2010-05-18 15:57:51 +00:00
										 |  |  | 	SetObjItem(PyBool_FromLong(G.background)); | 
					
						
							| 
									
										
										
										
											2010-01-31 23:41:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-04 03:14:38 +00:00
										 |  |  | 	/* build info, use bytes since we can't assume _any_ encoding:
 | 
					
						
							|  |  |  | 	 * see patch [#30154] for issue */ | 
					
						
							| 
									
										
										
										
											2010-02-28 22:48:50 +00:00
										 |  |  | #ifdef BUILD_DATE
 | 
					
						
							| 
									
										
										
										
											2012-03-04 03:14:38 +00:00
										 |  |  | 	SetBytesItem(build_date); | 
					
						
							|  |  |  | 	SetBytesItem(build_time); | 
					
						
							|  |  |  | 	SetBytesItem(build_rev); | 
					
						
							|  |  |  | 	SetBytesItem(build_platform); | 
					
						
							|  |  |  | 	SetBytesItem(build_type); | 
					
						
							|  |  |  | 	SetBytesItem(build_cflags); | 
					
						
							|  |  |  | 	SetBytesItem(build_cxxflags); | 
					
						
							|  |  |  | 	SetBytesItem(build_linkflags); | 
					
						
							|  |  |  | 	SetBytesItem(build_system); | 
					
						
							| 
									
										
										
										
											2010-02-28 22:48:50 +00:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2012-03-04 03:14:38 +00:00
										 |  |  | 	SetBytesItem("Unknown"); | 
					
						
							|  |  |  | 	SetBytesItem("Unknown"); | 
					
						
							|  |  |  | 	SetBytesItem("Unknown"); | 
					
						
							|  |  |  | 	SetBytesItem("Unknown"); | 
					
						
							|  |  |  | 	SetBytesItem("Unknown"); | 
					
						
							|  |  |  | 	SetBytesItem("Unknown"); | 
					
						
							|  |  |  | 	SetBytesItem("Unknown"); | 
					
						
							|  |  |  | 	SetBytesItem("Unknown"); | 
					
						
							|  |  |  | 	SetBytesItem("Unknown"); | 
					
						
							| 
									
										
										
										
											2010-02-28 22:48:50 +00:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2010-01-31 23:41:46 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-28 12:35:58 +00:00
										 |  |  | 	SetObjItem(BPY_app_ffmpeg_struct()); | 
					
						
							| 
									
										
										
										
											2012-12-18 18:02:20 +00:00
										 |  |  | 	SetObjItem(BPY_app_build_options_struct()); | 
					
						
							| 
									
										
										
										
											2011-06-24 16:54:30 +00:00
										 |  |  | 	SetObjItem(BPY_app_handlers_struct()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-31 23:41:46 +00:00
										 |  |  | #undef SetIntItem
 | 
					
						
							|  |  |  | #undef SetStrItem
 | 
					
						
							| 
									
										
										
										
											2012-03-04 03:14:38 +00:00
										 |  |  | #undef SetBytesItem
 | 
					
						
							| 
									
										
										
										
											2010-01-31 23:41:46 +00:00
										 |  |  | #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 */ | 
					
						
							| 
									
										
										
										
											2011-11-26 15:18:30 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | PyDoc_STRVAR(bpy_app_debug_doc, | 
					
						
							| 
									
										
										
										
											2012-03-31 00:59:17 +00:00
										 |  |  | "Boolean, for debug info (started with --debug / --debug_* matching this attribute name)" | 
					
						
							| 
									
										
										
										
											2011-11-26 15:18:30 +00:00
										 |  |  | ); | 
					
						
							| 
									
										
										
										
											2012-03-31 00:59:17 +00:00
										 |  |  | static PyObject *bpy_app_debug_get(PyObject *UNUSED(self), void *closure) | 
					
						
							| 
									
										
										
										
											2010-10-12 23:47:43 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-03-31 00:59:17 +00:00
										 |  |  | 	const int flag = GET_INT_FROM_POINTER(closure); | 
					
						
							|  |  |  | 	return PyBool_FromLong(G.debug & flag); | 
					
						
							| 
									
										
										
										
											2010-10-12 23:47:43 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-31 00:59:17 +00:00
										 |  |  | static int bpy_app_debug_set(PyObject *UNUSED(self), PyObject *value, void *closure) | 
					
						
							| 
									
										
										
										
											2010-10-12 23:47:43 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-03-31 00:59:17 +00:00
										 |  |  | 	const int flag = GET_INT_FROM_POINTER(closure); | 
					
						
							|  |  |  | 	const int param = PyObject_IsTrue(value); | 
					
						
							| 
									
										
										
										
											2010-10-12 23:47:43 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-10-13 01:29:08 +00:00
										 |  |  | 	if (param < 0) { | 
					
						
							| 
									
										
										
										
											2010-10-12 23:47:43 +00:00
										 |  |  | 		PyErr_SetString(PyExc_TypeError, "bpy.app.debug can only be True/False"); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-03-31 00:59:17 +00:00
										 |  |  | 	if (param)  G.debug |=  flag; | 
					
						
							|  |  |  | 	else        G.debug &= ~flag; | 
					
						
							| 
									
										
										
										
											2010-10-12 23:47:43 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-26 15:18:30 +00:00
										 |  |  | PyDoc_STRVAR(bpy_app_debug_value_doc, | 
					
						
							|  |  |  | "Int, number which can be set to non-zero values for testing purposes" | 
					
						
							|  |  |  | ); | 
					
						
							| 
									
										
										
										
											2010-12-15 06:03:45 +00:00
										 |  |  | static PyObject *bpy_app_debug_value_get(PyObject *UNUSED(self), void *UNUSED(closure)) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-11-21 02:28:36 +00:00
										 |  |  | 	return PyLong_FromLong(G.debug_value); | 
					
						
							| 
									
										
										
										
											2010-12-15 06:03:45 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int bpy_app_debug_value_set(PyObject *UNUSED(self), PyObject *value, void *UNUSED(closure)) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-11-21 02:28:36 +00:00
										 |  |  | 	int param = PyLong_AsLong(value); | 
					
						
							| 
									
										
										
										
											2010-12-15 06:03:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (param == -1 && PyErr_Occurred()) { | 
					
						
							|  |  |  | 		PyErr_SetString(PyExc_TypeError, "bpy.app.debug_value can only be set to a whole number"); | 
					
						
							|  |  |  | 		return -1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2012-08-08 18:21:54 +00:00
										 |  |  | 	G.debug_value = param; | 
					
						
							| 
									
										
										
										
											2010-12-15 06:03:45 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return 0; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-26 15:18:30 +00:00
										 |  |  | PyDoc_STRVAR(bpy_app_tempdir_doc, | 
					
						
							|  |  |  | "String, the temp directory used by blender (read-only)" | 
					
						
							|  |  |  | ); | 
					
						
							| 
									
										
										
										
											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
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-10-21 17:37:38 +00:00
										 |  |  | 	return PyC_UnicodeFromByte(BLI_temporary_dir()); | 
					
						
							| 
									
										
										
										
											2010-10-12 23:47:43 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-26 15:18:30 +00:00
										 |  |  | PyDoc_STRVAR(bpy_app_driver_dict_doc, | 
					
						
							|  |  |  | "Dictionary for drivers namespace, editable in-place, reset on file load (read-only)" | 
					
						
							|  |  |  | ); | 
					
						
							| 
									
										
										
										
											2010-11-27 02:39:51 +00:00
										 |  |  | static PyObject *bpy_app_driver_dict_get(PyObject *UNUSED(self), void *UNUSED(closure)) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-03-26 20:41:54 +00:00
										 |  |  | 	if (bpy_pydriver_Dict == NULL) { | 
					
						
							| 
									
										
										
										
											2010-11-27 02:39:51 +00:00
										 |  |  | 		if (bpy_pydriver_create_dict() != 0) { | 
					
						
							|  |  |  | 			PyErr_SetString(PyExc_RuntimeError, "bpy.app.driver_namespace failed to create dictionary"); | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							| 
									
										
										
										
											2012-03-26 20:41:54 +00:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2010-11-27 02:39:51 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	Py_INCREF(bpy_pydriver_Dict); | 
					
						
							|  |  |  | 	return bpy_pydriver_Dict; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | static PyGetSetDef bpy_app_getsets[] = { | 
					
						
							| 
									
										
										
										
											2012-03-31 00:59:17 +00:00
										 |  |  | 	{(char *)"debug",        bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG}, | 
					
						
							|  |  |  | 	{(char *)"debug_ffmpeg", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_FFMPEG}, | 
					
						
							|  |  |  | 	{(char *)"debug_python", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_PYTHON}, | 
					
						
							|  |  |  | 	{(char *)"debug_events", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_EVENTS}, | 
					
						
							| 
									
										
										
										
											2012-10-27 15:05:12 +00:00
										 |  |  | 	{(char *)"debug_handlers", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_HANDLERS}, | 
					
						
							| 
									
										
										
										
											2012-03-31 00:59:17 +00:00
										 |  |  | 	{(char *)"debug_wm",     bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_WM}, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-26 15:18:30 +00:00
										 |  |  | 	{(char *)"debug_value", bpy_app_debug_value_get, bpy_app_debug_value_set, (char *)bpy_app_debug_value_doc, NULL}, | 
					
						
							|  |  |  | 	{(char *)"tempdir", bpy_app_tempdir_get, NULL, (char *)bpy_app_tempdir_doc, NULL}, | 
					
						
							|  |  |  | 	{(char *)"driver_namespace", bpy_app_driver_dict_get, NULL, (char *)bpy_app_driver_dict_doc, 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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	for (getset = bpy_app_getsets; getset->name; getset++) { | 
					
						
							| 
									
										
										
										
											2010-11-27 02:39:51 +00:00
										 |  |  | 		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); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	ret = make_app_info(); | 
					
						
							| 
									
										
										
										
											2010-01-31 23:41:46 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* prevent user from creating new instances */ | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | 	BlenderAppType.tp_init = NULL; | 
					
						
							|  |  |  | 	BlenderAppType.tp_new = NULL; | 
					
						
							|  |  |  | 	BlenderAppType.tp_hash = (hashfunc)_Py_HashPointer; /* without this we can't do set(sys.modules) [#29635] */ | 
					
						
							| 
									
										
										
										
											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
										 |  |  | } |