Blender V4.5
bpy_app.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
12
13#include <Python.h>
14
15#include "bpy_app.hh"
16
17#include "bpy_app_alembic.hh"
19#include "bpy_app_ffmpeg.hh"
20#include "bpy_app_ocio.hh"
21#include "bpy_app_oiio.hh"
22#include "bpy_app_opensubdiv.hh"
23#include "bpy_app_openvdb.hh"
24#include "bpy_app_sdl.hh"
25#include "bpy_app_usd.hh"
26
28
29#include "bpy_app_handlers.hh"
30#include "bpy_driver.hh"
31
32#include "BPY_extern_python.hh" /* For #BPY_python_app_help_text_fn. */
33
34/* modules */
35#include "bpy_app_icons.hh"
36#include "bpy_app_timers.hh"
37
38#include "BLI_utildefines.h"
39
40#include "BKE_appdir.hh"
41#include "BKE_blender_version.h"
42#include "BKE_global.hh"
43#include "BKE_main.hh"
44
45#include "GPU_shader.hh"
46
47#include "UI_interface_icons.hh"
48
49#include "MEM_guardedalloc.h"
50
51#include "RNA_enum_types.hh" /* For `rna_enum_wm_job_type_items`. */
52
53/* for notifiers */
54#include "WM_api.hh"
55#include "WM_types.hh"
56
59#include "../generic/python_compat.hh" /* IWYU pragma: keep. */
60
61#ifdef BUILD_DATE
62extern "C" char build_date[];
63extern "C" char build_time[];
65extern "C" char build_commit_date[];
66extern "C" char build_commit_time[];
67extern "C" char build_hash[];
68extern "C" char build_branch[];
69extern "C" char build_platform[];
70extern "C" char build_type[];
71extern "C" char build_cflags[];
72extern "C" char build_cxxflags[];
73extern "C" char build_linkflags[];
74extern "C" char build_system[];
75#endif
76
77static PyTypeObject BlenderAppType;
78
79static PyStructSequence_Field app_info_fields[] = {
80 {"version",
81 "The Blender version as a tuple of 3 numbers (major, minor, micro). eg. (4, 3, 1)"},
82 {"version_file",
83 "The Blender File version, as a tuple of 3 numbers (major, minor, file sub-version), that "
84 "will be used to save a .blend file. The last item in this tuple indicates the file "
85 "sub-version, which is different from the release micro version (the last item of the "
86 "`bpy.app.version` tuple). The file sub-version can be incremented multiple times while a "
87 "Blender version is under development. This value is, and should be, used for handling "
88 "compatibility changes between Blender versions"},
89 {"version_string", "The Blender version formatted as a string"},
90 {"version_cycle", "The release status of this build alpha/beta/rc/release"},
91 {"background",
92 "Boolean, True when blender is running without a user interface (started with -b)"},
93 {"module", "Boolean, True when running Blender as a python module"},
94 {"factory_startup", "Boolean, True when blender is running with --factory-startup)"},
95 {"portable", "Boolean, True unless blender was built to reference absolute paths (on UNIX)."},
96
97 /* buildinfo */
98 {"build_date", "The date this blender instance was built"},
99 {"build_time", "The time this blender instance was built"},
100 {"build_commit_timestamp", "The unix timestamp of commit this blender instance was built"},
101 {"build_commit_date", "The date of commit this blender instance was built"},
102 {"build_commit_time", "The time of commit this blender instance was built"},
103 {"build_hash", "The commit hash this blender instance was built with"},
104 {"build_branch", "The branch this blender instance was built from"},
105 {"build_platform", "The platform this blender instance was built for"},
106 {"build_type", "The type of build (Release, Debug)"},
107 {"build_cflags", "C compiler flags"},
108 {"build_cxxflags", "C++ compiler flags"},
109 {"build_linkflags", "Binary linking flags"},
110 {"build_system", "Build system used"},
111
112 /* submodules */
113 {"alembic", "Alembic library information backend"},
114 {"usd", "USD library information backend"},
115 {"ffmpeg", "FFmpeg library information backend"},
116 {"ocio", "OpenColorIO library information backend"},
117 {"oiio", "OpenImageIO library information backend"},
118 {"opensubdiv", "OpenSubdiv library information backend"},
119 {"openvdb", "OpenVDB library information backend"},
120 {"sdl", "SDL library information backend"},
121 {"build_options", "A set containing most important enabled optional build features"},
122 {"handlers", "Application handler callbacks"},
123 {"translations", "Application and addons internationalization API"},
124
125 /* Modules (not struct sequence). */
126 {"icons", "Manage custom icons"},
127 {"timers", "Manage timers"},
128 {nullptr},
129};
130
132 /* Wrap. */
133 bpy_app_doc,
134 "This module contains application values that remain unchanged during runtime.");
135
136static PyStructSequence_Desc app_info_desc = {
137 /*name*/ "bpy.app",
138 /*doc*/ bpy_app_doc,
139 /*fields*/ app_info_fields,
140 /*n_in_sequence*/ ARRAY_SIZE(app_info_fields) - 1,
141};
142
143static PyObject *make_app_info()
144{
145 PyObject *app_info;
146 int pos = 0;
147
148 app_info = PyStructSequence_New(&BlenderAppType);
149 if (app_info == nullptr) {
150 return nullptr;
151 }
152#define SetIntItem(flag) PyStructSequence_SET_ITEM(app_info, pos++, PyLong_FromLong(flag))
153#define SetStrItem(str) PyStructSequence_SET_ITEM(app_info, pos++, PyUnicode_FromString(str))
154#define SetBytesItem(str) PyStructSequence_SET_ITEM(app_info, pos++, PyBytes_FromString(str))
155#define SetObjItem(obj) PyStructSequence_SET_ITEM(app_info, pos++, obj)
156
162
164 SetObjItem(PyBool_FromLong(G.background));
165#ifdef WITH_PYTHON_MODULE
166 SetObjItem(Py_NewRef(Py_True));
167#else
168 SetObjItem(Py_NewRef(Py_False));
169#endif
170 SetObjItem(PyBool_FromLong(G.factory_startup));
171
172#ifdef WITH_INSTALL_PORTABLE
173 SetObjItem(Py_NewRef(Py_True));
174#else
175 SetObjItem(Py_NewRef(Py_False));
176#endif
177
178/* build info, use bytes since we can't assume _any_ encoding:
179 * see patch #30154 for issue */
180#ifdef BUILD_DATE
194#else
195 SetBytesItem("Unknown");
196 SetBytesItem("Unknown");
197 SetIntItem(0);
198 SetBytesItem("Unknown");
199 SetBytesItem("Unknown");
200 SetBytesItem("Unknown");
201 SetBytesItem("Unknown");
202 SetBytesItem("Unknown");
203 SetBytesItem("Unknown");
204 SetBytesItem("Unknown");
205 SetBytesItem("Unknown");
206 SetBytesItem("Unknown");
207 SetBytesItem("Unknown");
208#endif
209
221
222 /* modules */
225
226#undef SetIntItem
227#undef SetStrItem
228#undef SetBytesItem
229#undef SetObjItem
230
231 if (PyErr_Occurred()) {
232 Py_DECREF(app_info);
233 return nullptr;
234 }
235 return app_info;
236}
237
238/* a few getsets because it makes sense for them to be in bpy.app even though
239 * they are not static */
240
242 /* Wrap. */
243 bpy_app_debug_doc,
244 "Boolean, for debug info "
245 "(started with ``--debug`` / ``--debug-*`` matching this attribute name)");
246static PyObject *bpy_app_debug_get(PyObject * /*self*/, void *closure)
247{
248 const int flag = POINTER_AS_INT(closure);
249 return PyBool_FromLong(G.debug & flag);
250}
251
252static int bpy_app_debug_set(PyObject * /*self*/, PyObject *value, void *closure)
253{
254 const int flag = POINTER_AS_INT(closure);
255 const int param = PyObject_IsTrue(value);
256
257 if (param == -1) {
258 PyErr_SetString(PyExc_TypeError, "bpy.app.debug can only be True/False");
259 return -1;
260 }
261
262 if (param) {
263 G.debug |= flag;
264 }
265 else {
266 G.debug &= ~flag;
267 }
268
269 return 0;
270}
271
273 /* Wrap. */
274 bpy_app_internet_offline_doc,
275 "Boolean, true when internet access is allowed by Blender & 3rd party scripts (read-only)");
277 /* Wrap. */
278 bpy_app_internet_offline_override_doc,
279 "Boolean, true when internet access preference is overridden by the command line (read-only)");
280
282 /* Wrap. */
283 bpy_app_global_flag_doc,
284 "Boolean, for application behavior "
285 "(started with ``--enable-*`` matching this attribute name)");
286static PyObject *bpy_app_global_flag_get(PyObject * /*self*/, void *closure)
287{
288 const int flag = POINTER_AS_INT(closure);
289 return PyBool_FromLong(G.f & flag);
290}
291
292static int bpy_app_global_flag_set(PyObject * /*self*/, PyObject *value, void *closure)
293{
294 const int flag = POINTER_AS_INT(closure);
295 const int param = PyObject_IsTrue(value);
296
297 if (param == -1) {
298 PyErr_SetString(PyExc_TypeError, "bpy.app.use_* can only be True/False");
299 return -1;
300 }
301
302 if (param) {
303 G.f |= flag;
304 }
305 else {
306 G.f &= ~flag;
307 }
308
309 return 0;
310}
311
312static int bpy_app_global_flag_set__only_disable(PyObject * /*self*/,
313 PyObject *value,
314 void *closure)
315{
316 const int param = PyObject_IsTrue(value);
317 if (param == 1) {
318 PyErr_SetString(PyExc_ValueError, "This bpy.app.use_* option can only be disabled");
319 return -1;
320 }
321 return bpy_app_global_flag_set(nullptr, value, closure);
322}
323
325 /* Wrap. */
326 bpy_app_debug_value_doc,
327 "Short, number which can be set to non-zero values for testing purposes");
328static PyObject *bpy_app_debug_value_get(PyObject * /*self*/, void * /*closure*/)
329{
330 return PyLong_FromLong(G.debug_value);
331}
332
333static int bpy_app_debug_value_set(PyObject * /*self*/, PyObject *value, void * /*closure*/)
334{
335 const short param = PyC_Long_AsI16(value);
336
337 if (param == -1 && PyErr_Occurred()) {
338 PyC_Err_SetString_Prefix(PyExc_TypeError,
339 "bpy.app.debug_value can only be set to a whole number");
340 return -1;
341 }
342
343 G.debug_value = param;
344
346
347 return 0;
348}
349
351 /* Wrap. */
352 bpy_app_tempdir_doc,
353 "String, the temp directory used by blender (read-only)");
354static PyObject *bpy_app_tempdir_get(PyObject * /*self*/, void * /*closure*/)
355{
357}
358
360 /* Wrap. */
361 bpy_app_driver_dict_doc,
362 "Dictionary for drivers namespace, editable in-place, reset on file load (read-only)");
363static PyObject *bpy_app_driver_dict_get(PyObject * /*self*/, void * /*closure*/)
364{
365 if (bpy_pydriver_Dict == nullptr) {
366 if (bpy_pydriver_create_dict() != 0) {
367 PyErr_SetString(PyExc_RuntimeError, "bpy.app.driver_namespace failed to create dictionary");
368 return nullptr;
369 }
370 }
371
372 return Py_NewRef(bpy_pydriver_Dict);
373}
374
376 /* Wrap. */
377 bpy_app_preview_render_size_doc,
378 "Reference size for icon/preview renders (read-only)");
379static PyObject *bpy_app_preview_render_size_get(PyObject * /*self*/, void *closure)
380{
381 return PyLong_FromLong(
383}
384
385static PyObject *bpy_app_autoexec_fail_message_get(PyObject * /*self*/, void * /*closure*/)
386{
387 return PyC_UnicodeFromBytes(G.autoexec_fail);
388}
389
391 /* Wrap. */
392 bpy_app_python_args_doc,
393 "Leading arguments to use when calling Python directly (via ``sys.executable``). "
394 "These arguments match settings Blender uses to "
395 "ensure Python runs with a compatible environment (read-only).");
396static PyObject *bpy_app_python_args_get(PyObject * /*self*/, void * /*closure*/)
397{
398 const char *args[1];
399 int args_num = 0;
401 /* Isolated Python environment. */
402 args[args_num++] = "-I";
403 }
404 return PyC_Tuple_PackArray_String(args, args_num);
405}
406
408 /* Wrap. */
409 bpy_app_binary_path_doc,
410 "The location of Blender's executable, useful for utilities that open new instances. "
411 "Read-only unless Blender is built as a Python module - in this case the value is "
412 "an empty string which script authors may point to a Blender binary.");
413static PyObject *bpy_app_binary_path_get(PyObject * /*self*/, void * /*closure*/)
414{
416}
417
418static int bpy_app_binary_path_set(PyObject * /*self*/, PyObject *value, void * /*closure*/)
419{
420#ifndef WITH_PYTHON_MODULE
421 PyErr_SetString(PyExc_AttributeError,
422 "bpy.app.binary_path is only writable when built as a Python module");
423 return -1;
424#endif
425 PyObject *value_coerce = nullptr;
426 const char *filepath = PyC_UnicodeAsBytes(value, &value_coerce);
427 if (filepath == nullptr) {
428 PyErr_Format(PyExc_ValueError, "expected a string or bytes, got %s", Py_TYPE(value)->tp_name);
429 return -1;
430 }
432 Py_XDECREF(value_coerce);
433 return 0;
434}
435
436static PyGetSetDef bpy_app_getsets[] = {
437 {"debug", bpy_app_debug_get, bpy_app_debug_set, bpy_app_debug_doc, (void *)G_DEBUG},
438 {"debug_ffmpeg",
441 bpy_app_debug_doc,
442 (void *)G_DEBUG_FFMPEG},
443 {"debug_freestyle",
446 bpy_app_debug_doc,
447 (void *)G_DEBUG_FREESTYLE},
448 {"debug_python",
451 bpy_app_debug_doc,
452 (void *)G_DEBUG_PYTHON},
453 {"debug_events",
456 bpy_app_debug_doc,
457 (void *)G_DEBUG_EVENTS},
458 {"debug_handlers",
461 bpy_app_debug_doc,
462 (void *)G_DEBUG_HANDLERS},
463 {"debug_wm", bpy_app_debug_get, bpy_app_debug_set, bpy_app_debug_doc, (void *)G_DEBUG_WM},
464 {"debug_depsgraph",
467 bpy_app_debug_doc,
468 (void *)G_DEBUG_DEPSGRAPH},
469 {"debug_depsgraph_build",
472 bpy_app_debug_doc,
474 {"debug_depsgraph_eval",
477 bpy_app_debug_doc,
478 (void *)G_DEBUG_DEPSGRAPH_EVAL},
479 {"debug_depsgraph_tag",
482 bpy_app_debug_doc,
483 (void *)G_DEBUG_DEPSGRAPH_TAG},
484 {"debug_depsgraph_time",
487 bpy_app_debug_doc,
488 (void *)G_DEBUG_DEPSGRAPH_TIME},
489 {"debug_depsgraph_pretty",
492 bpy_app_debug_doc,
494 {"debug_simdata",
497 bpy_app_debug_doc,
498 (void *)G_DEBUG_SIMDATA},
499 {"debug_io", bpy_app_debug_get, bpy_app_debug_set, bpy_app_debug_doc, (void *)G_DEBUG_IO},
500
501 {"use_event_simulate",
504 bpy_app_global_flag_doc,
505 (void *)G_FLAG_EVENT_SIMULATE},
506
507 {"use_userpref_skip_save_on_exit",
510 bpy_app_global_flag_doc,
512
513 {"debug_value",
516 bpy_app_debug_value_doc,
517 nullptr},
518 {"tempdir", bpy_app_tempdir_get, nullptr, bpy_app_tempdir_doc, nullptr},
519 {"driver_namespace", bpy_app_driver_dict_get, nullptr, bpy_app_driver_dict_doc, nullptr},
520
521 {"render_icon_size",
523 nullptr,
524 bpy_app_preview_render_size_doc,
525 (void *)ICON_SIZE_ICON},
526 {"render_preview_size",
528 nullptr,
529 bpy_app_preview_render_size_doc,
530 (void *)ICON_SIZE_PREVIEW},
531
532 {"online_access",
534 nullptr,
535 bpy_app_internet_offline_doc,
536 (void *)G_FLAG_INTERNET_ALLOW},
537 {"online_access_override",
539 nullptr,
540 bpy_app_internet_offline_override_doc,
542
543 /* security */
544 {"autoexec_fail",
546 nullptr,
547 nullptr,
549 {"autoexec_fail_quiet",
551 nullptr,
552 nullptr,
554 {"autoexec_fail_message", bpy_app_autoexec_fail_message_get, nullptr, nullptr, nullptr},
555
556 {"python_args", bpy_app_python_args_get, nullptr, bpy_app_python_args_doc, nullptr},
557
558 /* Support script authors setting the Blender binary path to use, otherwise this value
559 * is not known when built as a Python module. */
560 {"binary_path",
563 bpy_app_binary_path_doc,
564 nullptr},
565
566 {nullptr, nullptr, nullptr, nullptr, nullptr},
567};
568
570 /* Wrap. */
571 bpy_app_is_job_running_doc,
572 ".. staticmethod:: is_job_running(job_type)\n"
573 "\n"
574 " Check whether a job of the given type is running.\n"
575 "\n"
576 " :arg job_type: job type in :ref:`rna_enum_wm_job_type_items`.\n"
577 " :type job_type: str\n"
578 " :return: Whether a job of the given type is currently running.\n"
579 " :rtype: bool.\n");
580static PyObject *bpy_app_is_job_running(PyObject * /*self*/, PyObject *args, PyObject *kwds)
581{
582 BPy_EnumProperty_Parse job_type_enum{};
583 job_type_enum.items = rna_enum_wm_job_type_items;
584 job_type_enum.value = 0;
585
586 static const char *_keywords[] = {"job_type", nullptr};
587 static _PyArg_Parser _parser = {
589 "O&" /* `job_type` */
590 ":is_job_running",
591 _keywords,
592 nullptr,
593 };
594 if (!_PyArg_ParseTupleAndKeywordsFast(
595 args, kwds, &_parser, pyrna_enum_value_parse_string, &job_type_enum))
596 {
597 return nullptr;
598 }
599 wmWindowManager *wm = static_cast<wmWindowManager *>(G_MAIN->wm.first);
600 if (job_type_enum.value == WM_JOB_TYPE_SHADER_COMPILATION) {
601 /* Shader compilation no longer uses the WM_job API, so we handle this as a special case
602 * to avoid breaking the Python API. */
603 return PyBool_FromLong(GPU_shader_batch_is_compiling());
604 }
605 return PyBool_FromLong(WM_jobs_has_running_type(wm, job_type_enum.value));
606}
607
608char *(*BPY_python_app_help_text_fn)(bool all) = nullptr;
609
611 /* Wrap. */
612 bpy_app_help_text_doc,
613 ".. staticmethod:: help_text(all=False)\n"
614 "\n"
615 " Return the help text as a string.\n"
616 "\n"
617 " :arg all: Return all arguments, "
618 "even those which aren't available for the current platform.\n"
619 " :type all: bool\n");
620static PyObject *bpy_app_help_text(PyObject * /*self*/, PyObject *args, PyObject *kwds)
621{
622 bool all = false;
623 static const char *_keywords[] = {"all", nullptr};
624 static _PyArg_Parser _parser = {
626 "|$" /* Optional keyword only arguments. */
627 "O&" /* `all` */
628 ":help_text",
629 _keywords,
630 nullptr,
631 };
632 if (!_PyArg_ParseTupleAndKeywordsFast(args, kwds, &_parser, PyC_ParseBool, &all)) {
633 return nullptr;
634 }
635
636 char *buf = BPY_python_app_help_text_fn(all);
637 PyObject *result = PyUnicode_FromString(buf);
638 MEM_freeN(buf);
639 return result;
640}
641
642#ifdef __GNUC__
643# ifdef __clang__
644# pragma clang diagnostic push
645# pragma clang diagnostic ignored "-Wcast-function-type"
646# else
647# pragma GCC diagnostic push
648# pragma GCC diagnostic ignored "-Wcast-function-type"
649# endif
650#endif
651
652static PyMethodDef bpy_app_methods[] = {
653 {"is_job_running",
654 (PyCFunction)bpy_app_is_job_running,
655 METH_VARARGS | METH_KEYWORDS | METH_STATIC,
656 bpy_app_is_job_running_doc},
657 {"help_text",
658 (PyCFunction)bpy_app_help_text,
659 METH_VARARGS | METH_KEYWORDS | METH_STATIC,
660 bpy_app_help_text_doc},
661 {nullptr, nullptr, 0, nullptr},
662};
663
664#ifdef __GNUC__
665# ifdef __clang__
666# pragma clang diagnostic pop
667# else
668# pragma GCC diagnostic pop
669# endif
670#endif
671
673{
674 /* tricky dynamic members, not to py-spec! */
675 for (PyGetSetDef *getset = bpy_app_getsets; getset->name; getset++) {
676 PyObject *item = PyDescr_NewGetSet(&BlenderAppType, getset);
677 PyDict_SetItem(BlenderAppType.tp_dict, PyDescr_NAME(item), item);
678 Py_DECREF(item);
679 }
680}
681
683{
684 for (PyMethodDef *method = bpy_app_methods; method->ml_name; method++) {
685 BLI_assert_msg(method->ml_flags & METH_STATIC, "Only static methods make sense for 'bpy.app'");
686 PyObject *item = PyCFunction_New(method, nullptr);
687 PyDict_SetItemString(BlenderAppType.tp_dict, method->ml_name, item);
688 Py_DECREF(item);
689 }
690}
691
692/* end dynamic bpy.app */
693
694PyObject *BPY_app_struct()
695{
696 PyObject *ret;
697
698 PyStructSequence_InitType(&BlenderAppType, &app_info_desc);
699
700 ret = make_app_info();
701
702 /* prevent user from creating new instances */
703 BlenderAppType.tp_init = nullptr;
704 BlenderAppType.tp_new = nullptr;
705 /* Without this we can't do `set(sys.modules)` #29635. */
706 BlenderAppType.tp_hash = (hashfunc)Py_HashPointer;
707
708 /* Kind of a hack on top of #PyStructSequence. */
711
712 return ret;
713}
const char * BKE_appdir_program_path() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
Definition appdir.cc:952
void BKE_appdir_program_path_init(const char *argv0) ATTR_NONNULL(1)
Definition appdir.cc:929
#define BLENDER_VERSION_PATCH
const char * BKE_blender_version_string(void)
Definition blender.cc:143
#define BLENDER_VERSION_CYCLE
#define BLENDER_FILE_SUBVERSION
#define BLENDER_VERSION
#define BLENDER_FILE_VERSION
@ G_FLAG_EVENT_SIMULATE
@ G_FLAG_SCRIPT_AUTOEXEC_FAIL_QUIET
@ G_FLAG_USERPREF_NO_SAVE_ON_EXIT
@ G_FLAG_SCRIPT_AUTOEXEC_FAIL
@ G_FLAG_INTERNET_ALLOW
#define G_MAIN
#define G_FLAG_INTERNET_OVERRIDE_PREF_ANY
@ G_DEBUG
@ G_DEBUG_HANDLERS
@ G_DEBUG_FREESTYLE
@ G_DEBUG_IO
@ G_DEBUG_SIMDATA
@ G_DEBUG_FFMPEG
@ G_DEBUG_DEPSGRAPH_PRETTY
@ G_DEBUG_DEPSGRAPH_TIME
@ G_DEBUG_DEPSGRAPH
@ G_DEBUG_DEPSGRAPH_EVAL
@ G_DEBUG_DEPSGRAPH_TAG
@ G_DEBUG_WM
@ G_DEBUG_EVENTS
@ G_DEBUG_PYTHON
@ G_DEBUG_DEPSGRAPH_BUILD
#define BLI_assert_msg(a, msg)
Definition BLI_assert.h:53
unsigned long ulong
#define ARRAY_SIZE(arr)
#define STRINGIFY(x)
#define POINTER_AS_INT(i)
bool BPY_python_use_system_env_get()
eIconSizes
@ ICON_SIZE_PREVIEW
@ ICON_SIZE_ICON
bool GPU_shader_batch_is_compiling()
Read Guarded memory(de)allocation.
int UI_icon_preview_to_render_size(enum eIconSizes size)
@ WM_JOB_TYPE_SHADER_COMPILATION
Definition WM_api.hh:1750
#define NC_WINDOW
Definition WM_types.hh:372
static int bpy_app_binary_path_set(PyObject *, PyObject *value, void *)
Definition bpy_app.cc:418
static PyObject * bpy_app_debug_value_get(PyObject *, void *)
Definition bpy_app.cc:328
char build_type[]
Definition bpy_app.cc:70
static void py_struct_seq_getset_init()
Definition bpy_app.cc:672
char build_cflags[]
Definition bpy_app.cc:71
static PyObject * bpy_app_autoexec_fail_message_get(PyObject *, void *)
Definition bpy_app.cc:385
char build_hash[]
Definition bpy_app.cc:67
static PyStructSequence_Field app_info_fields[]
Definition bpy_app.cc:79
static PyObject * bpy_app_tempdir_get(PyObject *, void *)
Definition bpy_app.cc:354
static int bpy_app_debug_value_set(PyObject *, PyObject *value, void *)
Definition bpy_app.cc:333
static PyObject * make_app_info()
Definition bpy_app.cc:143
char build_commit_date[]
Definition bpy_app.cc:65
static PyObject * bpy_app_preview_render_size_get(PyObject *, void *closure)
Definition bpy_app.cc:379
static int bpy_app_global_flag_set(PyObject *, PyObject *value, void *closure)
Definition bpy_app.cc:292
PyObject * BPY_app_struct()
Definition bpy_app.cc:694
#define SetBytesItem(str)
static PyGetSetDef bpy_app_getsets[]
Definition bpy_app.cc:436
static PyObject * bpy_app_global_flag_get(PyObject *, void *closure)
Definition bpy_app.cc:286
static int bpy_app_global_flag_set__only_disable(PyObject *, PyObject *value, void *closure)
Definition bpy_app.cc:312
ulong build_commit_timestamp
Definition bpy_app.cc:64
static int bpy_app_debug_set(PyObject *, PyObject *value, void *closure)
Definition bpy_app.cc:252
char build_commit_time[]
Definition bpy_app.cc:66
char build_linkflags[]
Definition bpy_app.cc:73
static PyObject * bpy_app_python_args_get(PyObject *, void *)
Definition bpy_app.cc:396
char build_system[]
Definition bpy_app.cc:74
char build_branch[]
Definition bpy_app.cc:68
#define SetIntItem(flag)
char build_date[]
Definition bpy_app.cc:62
PyDoc_STRVAR(bpy_app_doc, "This module contains application values that remain unchanged during runtime.")
char build_cxxflags[]
Definition bpy_app.cc:72
static PyObject * bpy_app_binary_path_get(PyObject *, void *)
Definition bpy_app.cc:413
#define SetStrItem(str)
char *(* BPY_python_app_help_text_fn)(bool all)
Definition bpy_app.cc:608
static void py_struct_seq_method_init()
Definition bpy_app.cc:682
static PyMethodDef bpy_app_methods[]
Definition bpy_app.cc:652
static PyStructSequence_Desc app_info_desc
Definition bpy_app.cc:136
static PyObject * bpy_app_driver_dict_get(PyObject *, void *)
Definition bpy_app.cc:363
static PyObject * bpy_app_debug_get(PyObject *, void *closure)
Definition bpy_app.cc:246
char build_time[]
Definition bpy_app.cc:63
static PyTypeObject BlenderAppType
Definition bpy_app.cc:77
char build_platform[]
Definition bpy_app.cc:69
static PyObject * bpy_app_help_text(PyObject *, PyObject *args, PyObject *kwds)
Definition bpy_app.cc:620
#define SetObjItem(obj)
static PyObject * bpy_app_is_job_running(PyObject *, PyObject *args, PyObject *kwds)
Definition bpy_app.cc:580
PyObject * BPY_app_alembic_struct()
PyObject * BPY_app_build_options_struct()
PyObject * BPY_app_ffmpeg_struct()
PyObject * BPY_app_handlers_struct()
PyObject * BPY_app_icons_module()
PyObject * BPY_app_ocio_struct()
PyObject * BPY_app_oiio_struct()
PyObject * BPY_app_opensubdiv_struct()
PyObject * BPY_app_openvdb_struct()
PyObject * BPY_app_sdl_struct()
PyObject * BPY_app_timers_module()
PyObject * BPY_app_translations_struct()
PyObject * BPY_app_usd_struct()
PyObject * bpy_pydriver_Dict
Definition bpy_driver.cc:52
int bpy_pydriver_create_dict()
Definition bpy_driver.cc:58
uint pos
bool all(VecOp< bool, D >) RET
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
#define G(x, y, z)
int pyrna_enum_value_parse_string(PyObject *o, void *p)
int16_t PyC_Long_AsI16(PyObject *value)
PyObject * PyC_Err_SetString_Prefix(PyObject *exception_type_prefix, const char *str)
PyObject * PyC_UnicodeFromBytes(const char *str)
PyObject * PyC_Tuple_PackArray_String(const char **array, uint len)
int PyC_ParseBool(PyObject *o, void *p)
const char * PyC_UnicodeAsBytes(PyObject *py_str, PyObject **r_coerce)
PyObject * PyC_Tuple_Pack_I32(const blender::Span< int > values)
header-only compatibility defines.
#define Py_HashPointer
#define PY_ARG_PARSER_HEAD_COMPAT()
return ret
const EnumPropertyItem rna_enum_wm_job_type_items[]
Definition rna_wm.cc:206
const EnumPropertyItem * items
void * BKE_tempdir_session
Definition stubs.c:38
void WM_main_add_notifier(uint type, void *reference)
bool WM_jobs_has_running_type(const wmWindowManager *wm, int job_type)
Definition wm_jobs.cc:757
uint8_t flag
Definition wm_window.cc:139