| 
									
										
										
										
											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"
 | 
					
						
							| 
									
										
										
										
											2013-12-08 15:03:17 +06:00
										 |  |  | #include "bpy_app_ocio.h"
 | 
					
						
							|  |  |  | #include "bpy_app_oiio.h"
 | 
					
						
							| 
									
										
										
										
											2012-12-18 18:02:20 +00:00
										 |  |  | #include "bpy_app_build_options.h"
 | 
					
						
							| 
									
										
										
										
											2011-12-28 12:35:58 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-21 15:10:22 +00:00
										 |  |  | #include "bpy_app_translations.h"
 | 
					
						
							| 
									
										
											  
											
												Python i18n API. Many thanks to Campbell and Brecht for the reviews and suggestions!
This commit adds:
* A new bpy.app.translations module giving some info about locales/translation stuff (current active locale, all locales currently known by blender, all translation contexts currently defined, etc.).
* The ability for addons to feature translations, using the (un)register functions of above module.
* Also cleans up "translate py string when storing into RNA prop" by removing "PROP_TRANSLATE" string's subtype, and adding a PROP_STRING_PY_TRANSLATE flag instead (this way it is no more exposed to python...).
Addon translations work with py dictionaries: each addon features a dict {lang: {(context, message): translation, ...}, ...}, which is registered when the addon is enabled (and unregistered when disabled). 
Then, when a key (context, message) is not found in regular mo catalog, a cache dict for current locale is built from all registered addon translations, and key is searched in it.
Note: currently addons writers have to do all the work by hand, will add something (probably extend "edit translation" addon) to automate messages extraction from addons soon(ish)! To get a look to expected behavior from addons, have a look at render_copy_settings/__init__.py and render_copy_settings/translations.py (rather stupid example currently, but...). Once we have a complete process, I'll also update relevant wiki pages.
											
										 
											2013-01-20 17:29:07 +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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-01-07 18:36:47 +00:00
										 |  |  | #include "BLI_utildefines.h"
 | 
					
						
							| 
									
										
										
										
											2013-03-04 18:36:37 +00:00
										 |  |  | #include "BLI_path_util.h"
 | 
					
						
							| 
									
										
										
										
											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[]; | 
					
						
							| 
									
										
										
										
											2013-11-15 17:11:59 +06:00
										 |  |  | extern unsigned long build_commit_timestamp; | 
					
						
							|  |  |  | extern char build_commit_date[]; | 
					
						
							|  |  |  | extern char build_commit_time[]; | 
					
						
							| 
									
										
										
										
											2013-11-04 13:21:39 +00:00
										 |  |  | extern char build_hash[]; | 
					
						
							|  |  |  | extern char build_branch[]; | 
					
						
							| 
									
										
										
										
											2010-03-14 17:18:36 +00:00
										 |  |  | 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"}, | 
					
						
							| 
									
										
										
										
											2013-11-15 17:11:59 +06:00
										 |  |  | 	{(char *)"build_commit_timestamp", (char *)"The unix timestamp of commit this blender instance was built"}, | 
					
						
							|  |  |  | 	{(char *)"build_commit_date", (char *)"The date of commit this blender instance was built"}, | 
					
						
							|  |  |  | 	{(char *)"build_commit_time", (char *)"The time of commit this blender instance was built"}, | 
					
						
							| 
									
										
										
										
											2013-11-04 13:21:39 +00:00
										 |  |  | 	{(char *)"build_hash", (char *)"The commit hash this blender instance was built with"}, | 
					
						
							|  |  |  | 	{(char *)"build_branch", (char *)"The branch this blender instance was built from"}, | 
					
						
							| 
									
										
										
										
											2010-12-03 17:05:21 +00:00
										 |  |  | 	{(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"}, | 
					
						
							| 
									
										
										
										
											2013-12-08 15:03:17 +06:00
										 |  |  | 	{(char *)"ocio", (char *)"OpenColorIO library information backend"}, | 
					
						
							|  |  |  | 	{(char *)"oiio", (char *)"OpenImageIO 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"}, | 
					
						
							| 
									
										
											  
											
												Python i18n API. Many thanks to Campbell and Brecht for the reviews and suggestions!
This commit adds:
* A new bpy.app.translations module giving some info about locales/translation stuff (current active locale, all locales currently known by blender, all translation contexts currently defined, etc.).
* The ability for addons to feature translations, using the (un)register functions of above module.
* Also cleans up "translate py string when storing into RNA prop" by removing "PROP_TRANSLATE" string's subtype, and adding a PROP_STRING_PY_TRANSLATE flag instead (this way it is no more exposed to python...).
Addon translations work with py dictionaries: each addon features a dict {lang: {(context, message): translation, ...}, ...}, which is registered when the addon is enabled (and unregistered when disabled). 
Then, when a key (context, message) is not found in regular mo catalog, a cache dict for current locale is built from all registered addon translations, and key is searched in it.
Note: currently addons writers have to do all the work by hand, will add something (probably extend "edit translation" addon) to automate messages extraction from addons soon(ish)! To get a look to expected behavior from addons, have a look at render_copy_settings/__init__.py and render_copy_settings/translations.py (rather stupid example currently, but...). Once we have a complete process, I'll also update relevant wiki pages.
											
										 
											2013-01-20 17:29:07 +00:00
										 |  |  | 	{(char *)"translations", (char *)"Application and addons internationalization API"}, | 
					
						
							|  |  |  | 	{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); | 
					
						
							| 
									
										
										
										
											2013-11-15 17:11:59 +06:00
										 |  |  | 	SetIntItem(build_commit_timestamp); | 
					
						
							|  |  |  | 	SetBytesItem(build_commit_date); | 
					
						
							|  |  |  | 	SetBytesItem(build_commit_time); | 
					
						
							| 
									
										
										
										
											2013-11-04 13:21:39 +00:00
										 |  |  | 	SetBytesItem(build_hash); | 
					
						
							|  |  |  | 	SetBytesItem(build_branch); | 
					
						
							| 
									
										
										
										
											2012-03-04 03:14:38 +00:00
										 |  |  | 	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"); | 
					
						
							| 
									
										
										
										
											2013-11-15 17:11:59 +06:00
										 |  |  | 	SetIntItem(0); | 
					
						
							|  |  |  | 	SetBytesItem("Unknown"); | 
					
						
							| 
									
										
										
										
											2012-03-04 03:14:38 +00:00
										 |  |  | 	SetBytesItem("Unknown"); | 
					
						
							|  |  |  | 	SetBytesItem("Unknown"); | 
					
						
							|  |  |  | 	SetBytesItem("Unknown"); | 
					
						
							| 
									
										
										
										
											2013-11-04 13:21:39 +00:00
										 |  |  | 	SetBytesItem("Unknown"); | 
					
						
							|  |  |  | 	SetBytesItem("Unknown"); | 
					
						
							| 
									
										
										
										
											2012-03-04 03:14:38 +00:00
										 |  |  | 	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()); | 
					
						
							| 
									
										
										
										
											2013-12-08 15:03:17 +06:00
										 |  |  | 	SetObjItem(BPY_app_ocio_struct()); | 
					
						
							|  |  |  | 	SetObjItem(BPY_app_oiio_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()); | 
					
						
							| 
									
										
											  
											
												Python i18n API. Many thanks to Campbell and Brecht for the reviews and suggestions!
This commit adds:
* A new bpy.app.translations module giving some info about locales/translation stuff (current active locale, all locales currently known by blender, all translation contexts currently defined, etc.).
* The ability for addons to feature translations, using the (un)register functions of above module.
* Also cleans up "translate py string when storing into RNA prop" by removing "PROP_TRANSLATE" string's subtype, and adding a PROP_STRING_PY_TRANSLATE flag instead (this way it is no more exposed to python...).
Addon translations work with py dictionaries: each addon features a dict {lang: {(context, message): translation, ...}, ...}, which is registered when the addon is enabled (and unregistered when disabled). 
Then, when a key (context, message) is not found in regular mo catalog, a cache dict for current locale is built from all registered addon translations, and key is searched in it.
Note: currently addons writers have to do all the work by hand, will add something (probably extend "edit translation" addon) to automate messages extraction from addons soon(ish)! To get a look to expected behavior from addons, have a look at render_copy_settings/__init__.py and render_copy_settings/translations.py (rather stupid example currently, but...). Once we have a complete process, I'll also update relevant wiki pages.
											
										 
											2013-01-20 17:29:07 +00:00
										 |  |  | 	SetObjItem(BPY_app_translations_struct()); | 
					
						
							| 
									
										
										
										
											2011-06-24 16:54:30 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-10 15:22:19 +00:00
										 |  |  | 	if (param == -1) { | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-10 00:42:16 +00:00
										 |  |  | static PyObject *bpy_app_global_flag_get(PyObject *UNUSED(self), void *closure) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	const int flag = GET_INT_FROM_POINTER(closure); | 
					
						
							|  |  |  | 	return PyBool_FromLong(G.f & flag); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-10 00:42:16 +00:00
										 |  |  | static PyObject *bpy_app_autoexec_fail_message_get(PyObject *UNUSED(self), void *UNUSED(closure)) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return PyC_UnicodeFromByte(G.autoexec_fail); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-27 02:39:51 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-26 12:26:11 +00:00
										 |  |  | static PyGetSetDef bpy_app_getsets[] = { | 
					
						
							| 
									
										
										
										
											2013-01-03 23:27:20 +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_freestyle", bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_FREESTYLE}, | 
					
						
							|  |  |  | 	{(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}, | 
					
						
							|  |  |  | 	{(char *)"debug_handlers",  bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_HANDLERS}, | 
					
						
							|  |  |  | 	{(char *)"debug_wm",        bpy_app_debug_get, bpy_app_debug_set, (char *)bpy_app_debug_doc, (void *)G_DEBUG_WM}, | 
					
						
							| 
									
										
										
										
											2012-03-31 00:59:17 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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}, | 
					
						
							| 
									
										
										
										
											2013-06-10 00:42:16 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* security */ | 
					
						
							|  |  |  | 	{(char *)"autoexec_fail", bpy_app_global_flag_get, NULL, NULL, (void *)G_SCRIPT_AUTOEXEC_FAIL}, | 
					
						
							|  |  |  | 	{(char *)"autoexec_fail_quiet", bpy_app_global_flag_get, NULL, NULL, (void *)G_SCRIPT_AUTOEXEC_FAIL_QUIET}, | 
					
						
							|  |  |  | 	{(char *)"autoexec_fail_message", bpy_app_autoexec_fail_message_get, NULL, NULL, 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
										 |  |  | } |