2 * ***** BEGIN GPL LICENSE BLOCK *****
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either version 2
7 * of the License, or (at your option) any later version.
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
18 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
19 * All rights reserved.
21 * The Original Code is: all of this file.
23 * Contributor(s): none yet.
25 * ***** END GPL LICENSE BLOCK *****
28 /** \file blender/blenkernel/intern/blender.c
31 * Application level startup/shutdown functionality.
38 #include "MEM_guardedalloc.h"
40 #include "BLI_string.h"
41 #include "BLI_listbase.h"
42 #include "BLI_utildefines.h"
43 #include "BLI_callbacks.h"
45 #include "IMB_imbuf.h"
46 #include "IMB_moviecache.h"
48 #include "BKE_addon.h"
49 #include "BKE_blender.h" /* own include */
50 #include "BKE_blender_version.h" /* own include */
51 #include "BKE_blendfile.h"
52 #include "BKE_brush.h"
53 #include "BKE_cachefile.h"
54 #include "BKE_context.h"
55 #include "BKE_depsgraph.h"
56 #include "BKE_global.h"
57 #include "BKE_idprop.h"
58 #include "BKE_image.h"
59 #include "BKE_library.h"
61 #include "BKE_report.h"
62 #include "BKE_scene.h"
63 #include "BKE_screen.h"
64 #include "BKE_sequencer.h"
66 #include "RE_pipeline.h"
67 #include "RE_render_ext.h"
75 char versionstr[48] = "";
77 /* ********** free ********** */
79 /* only to be called on exit blender */
80 void BKE_blender_free(void)
82 /* samples are in a global list..., also sets G_MAIN->sound->sample NULL */
83 BKE_main_free(G_MAIN);
86 if (G.log.file != NULL) {
90 BKE_spacetypes_free(); /* after free main, it uses space callbacks */
93 BKE_cachefiles_exit();
97 BKE_brush_system_exit();
98 RE_texture_rng_exit();
100 BLI_callback_global_finalize();
102 BKE_sequencer_cache_destruct();
103 IMB_moviecache_destruct();
108 void BKE_blender_version_string(char *version_str, size_t maxncpy, short version, short subversion, bool v_prefix, bool include_subversion)
110 const char *prefix = v_prefix ? "v" : "";
112 if (include_subversion && subversion > 0) {
113 BLI_snprintf(version_str, maxncpy, "%s%d.%02d.%d", prefix, version / 100, version % 100, subversion);
116 BLI_snprintf(version_str, maxncpy, "%s%d.%02d", prefix, version / 100, version % 100);
120 void BKE_blender_globals_init(void)
122 memset(&G, 0, sizeof(Global));
126 G_MAIN = BKE_main_new();
130 BKE_blender_version_string(versionstr, sizeof(versionstr), BLENDER_VERSION, BLENDER_SUBVERSION, true, true);
132 #ifndef WITH_PYTHON_SECURITY /* default */
133 G.f |= G_SCRIPT_AUTOEXEC;
135 G.f &= ~G_SCRIPT_AUTOEXEC;
141 void BKE_blender_globals_clear(void)
143 BKE_main_free(G_MAIN); /* free all lib data */
150 static void keymap_item_free(wmKeyMapItem *kmi)
152 if (kmi->properties) {
153 IDP_FreeProperty(kmi->properties);
154 MEM_freeN(kmi->properties);
160 void BKE_blender_userdef_data_swap(UserDef *userdef_a, UserDef *userdef_b)
162 SWAP(UserDef, *userdef_a, *userdef_b);
165 void BKE_blender_userdef_data_set(UserDef *userdef)
167 BKE_blender_userdef_data_swap(&U, userdef);
168 BKE_blender_userdef_data_free(userdef, true);
171 void BKE_blender_userdef_data_set_and_free(UserDef *userdef)
173 BKE_blender_userdef_data_set(userdef);
177 static void userdef_free_keymaps(UserDef *userdef)
179 for (wmKeyMap *km = userdef->user_keymaps.first, *km_next; km; km = km_next) {
181 for (wmKeyMapDiffItem *kmdi = km->diff_items.first; kmdi; kmdi = kmdi->next) {
182 if (kmdi->add_item) {
183 keymap_item_free(kmdi->add_item);
184 MEM_freeN(kmdi->add_item);
186 if (kmdi->remove_item) {
187 keymap_item_free(kmdi->remove_item);
188 MEM_freeN(kmdi->remove_item);
192 for (wmKeyMapItem *kmi = km->items.first; kmi; kmi = kmi->next) {
193 keymap_item_free(kmi);
196 BLI_freelistN(&km->diff_items);
197 BLI_freelistN(&km->items);
201 BLI_listbase_clear(&userdef->user_keymaps);
204 static void userdef_free_addons(UserDef *userdef)
206 for (bAddon *addon = userdef->addons.first, *addon_next; addon; addon = addon_next) {
207 addon_next = addon->next;
208 BKE_addon_free(addon);
210 BLI_listbase_clear(&userdef->addons);
214 * When loading a new userdef from file,
215 * or when exiting Blender.
217 void BKE_blender_userdef_data_free(UserDef *userdef, bool clear_fonts)
219 #define U _invalid_access_ /* ensure no accidental global access */
220 #ifdef U /* quiet warning */
223 userdef_free_keymaps(userdef);
224 userdef_free_addons(userdef);
227 for (uiFont *font = userdef->uifonts.first; font; font = font->next) {
228 BLF_unload_id(font->blf_id);
233 BLI_freelistN(&userdef->autoexec_paths);
235 BLI_freelistN(&userdef->uistyles);
236 BLI_freelistN(&userdef->uifonts);
237 BLI_freelistN(&userdef->themes);
243 * Write U from userdef.
244 * This function defines which settings a template will override for the user preferences.
246 void BKE_blender_userdef_app_template_data_swap(UserDef *userdef_a, UserDef *userdef_b)
249 * - various minor settings (add as needed).
252 #define DATA_SWAP(id) \
254 UserDef userdef_tmp; \
255 memcpy(&(userdef_tmp.id), &(userdef_a->id), sizeof(userdef_tmp.id)); \
256 memcpy(&(userdef_a->id), &(userdef_b->id), sizeof(userdef_tmp.id)); \
257 memcpy(&(userdef_b->id), &(userdef_tmp.id), sizeof(userdef_tmp.id)); \
260 #define LIST_SWAP(id) { \
261 SWAP(ListBase, userdef_a->id, userdef_b->id); \
264 #define FLAG_SWAP(id, ty, flags) { \
265 CHECK_TYPE(&(userdef_a->id), ty *); \
266 const ty f = flags; \
267 const ty a = userdef_a->id; \
268 const ty b = userdef_b->id; \
269 userdef_a->id = (userdef_a->id & ~f) | (b & f); \
270 userdef_b->id = (userdef_b->id & ~f) | (a & f); \
278 LIST_SWAP(user_keymaps);
282 DATA_SWAP(font_path_ui);
283 DATA_SWAP(font_path_ui_mono);
284 DATA_SWAP(keyconfigstr);
288 /* We could add others. */
289 FLAG_SWAP(uiflag, int, USER_QUIT_PROMPT);
296 void BKE_blender_userdef_app_template_data_set(UserDef *userdef)
298 BKE_blender_userdef_app_template_data_swap(&U, userdef);
299 BKE_blender_userdef_data_free(userdef, true);
302 void BKE_blender_userdef_app_template_data_set_and_free(UserDef *userdef)
304 BKE_blender_userdef_app_template_data_set(userdef);
308 /* ***************** testing for break ************* */
310 static void (*blender_test_break_cb)(void) = NULL;
312 void BKE_blender_callback_test_break_set(void (*func)(void))
314 blender_test_break_cb = func;
318 int BKE_blender_test_break(void)
321 if (blender_test_break_cb)
322 blender_test_break_cb();
325 return (G.is_break == true);
329 /** \name Blender's AtExit
331 * \note Don't use MEM_mallocN so functions can be registered at any time.
334 static struct AtExitData {
335 struct AtExitData *next;
337 void (*func)(void *user_data);
341 void BKE_blender_atexit_register(void (*func)(void *user_data), void *user_data)
343 struct AtExitData *ae = malloc(sizeof(*ae));
346 ae->user_data = user_data;
350 void BKE_blender_atexit_unregister(void (*func)(void *user_data), const void *user_data)
352 struct AtExitData *ae = g_atexit;
353 struct AtExitData **ae_p = &g_atexit;
356 if ((ae->func == func) && (ae->user_data == user_data)) {
366 void BKE_blender_atexit(void)
368 struct AtExitData *ae = g_atexit, *ae_next;
372 ae->func(ae->user_data);