2 * This program is free software; you can redistribute it and/or
3 * modify it under the terms of the GNU General Public License
4 * as published by the Free Software Foundation; either version 2
5 * of the License, or (at your option) any later version.
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
12 * You should have received a copy of the GNU General Public License
13 * along with this program; if not, write to the Free Software Foundation,
14 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17 * All rights reserved.
23 * Application level startup/shutdown functionality.
30 #include "MEM_guardedalloc.h"
32 #include "BLI_string.h"
33 #include "BLI_listbase.h"
34 #include "BLI_utildefines.h"
35 #include "BLI_callbacks.h"
37 #include "IMB_imbuf.h"
38 #include "IMB_moviecache.h"
40 #include "BKE_addon.h"
41 #include "BKE_blender.h" /* own include */
42 #include "BKE_blender_version.h" /* own include */
43 #include "BKE_blender_user_menu.h"
44 #include "BKE_blendfile.h"
45 #include "BKE_brush.h"
46 #include "BKE_cachefile.h"
47 #include "BKE_global.h"
48 #include "BKE_idprop.h"
49 #include "BKE_image.h"
50 #include "BKE_layer.h"
53 #include "BKE_report.h"
54 #include "BKE_scene.h"
55 #include "BKE_screen.h"
56 #include "BKE_sequencer.h"
57 #include "BKE_studiolight.h"
59 #include "DEG_depsgraph.h"
61 #include "RE_pipeline.h"
62 #include "RE_render_ext.h"
70 char versionstr[48] = "";
72 /* ********** free ********** */
74 /* only to be called on exit blender */
75 void BKE_blender_free(void)
77 /* samples are in a global list..., also sets G_MAIN->sound->sample NULL */
79 BKE_studiolight_free(); /* needs to run before main free as wm is still referenced for icons preview jobs */
80 BKE_main_free(G_MAIN);
83 if (G.log.file != NULL) {
87 BKE_spacetypes_free(); /* after free main, it uses space callbacks */
90 BKE_cachefiles_exit();
92 DEG_free_node_types();
94 BKE_brush_system_exit();
95 RE_texture_rng_exit();
97 BLI_callback_global_finalize();
99 BKE_sequencer_cache_destruct();
100 IMB_moviecache_destruct();
105 void BKE_blender_version_string(char *version_str, size_t maxncpy, short version, short subversion, bool v_prefix, bool include_subversion)
107 const char *prefix = v_prefix ? "v" : "";
109 if (include_subversion && subversion > 0) {
110 BLI_snprintf(version_str, maxncpy, "%s%d.%02d.%d", prefix, version / 100, version % 100, subversion);
113 BLI_snprintf(version_str, maxncpy, "%s%d.%02d", prefix, version / 100, version % 100);
117 void BKE_blender_globals_init(void)
119 memset(&G, 0, sizeof(Global));
123 G_MAIN = BKE_main_new();
127 BKE_blender_version_string(versionstr, sizeof(versionstr), BLENDER_VERSION, BLENDER_SUBVERSION, true, true);
129 #ifndef WITH_PYTHON_SECURITY /* default */
130 G.f |= G_FLAG_SCRIPT_AUTOEXEC;
132 G.f &= ~G_FLAG_SCRIPT_AUTOEXEC;
138 void BKE_blender_globals_clear(void)
140 BKE_main_free(G_MAIN); /* free all lib data */
147 static void keymap_item_free(wmKeyMapItem *kmi)
149 if (kmi->properties) {
150 IDP_FreeProperty(kmi->properties);
151 MEM_freeN(kmi->properties);
157 void BKE_blender_userdef_data_swap(UserDef *userdef_a, UserDef *userdef_b)
159 SWAP(UserDef, *userdef_a, *userdef_b);
162 void BKE_blender_userdef_data_set(UserDef *userdef)
164 BKE_blender_userdef_data_swap(&U, userdef);
165 BKE_blender_userdef_data_free(userdef, true);
168 void BKE_blender_userdef_data_set_and_free(UserDef *userdef)
170 BKE_blender_userdef_data_set(userdef);
174 static void userdef_free_keymaps(UserDef *userdef)
176 for (wmKeyMap *km = userdef->user_keymaps.first, *km_next; km; km = km_next) {
178 for (wmKeyMapDiffItem *kmdi = km->diff_items.first; kmdi; kmdi = kmdi->next) {
179 if (kmdi->add_item) {
180 keymap_item_free(kmdi->add_item);
181 MEM_freeN(kmdi->add_item);
183 if (kmdi->remove_item) {
184 keymap_item_free(kmdi->remove_item);
185 MEM_freeN(kmdi->remove_item);
189 for (wmKeyMapItem *kmi = km->items.first; kmi; kmi = kmi->next) {
190 keymap_item_free(kmi);
193 BLI_freelistN(&km->diff_items);
194 BLI_freelistN(&km->items);
198 BLI_listbase_clear(&userdef->user_keymaps);
201 static void userdef_free_keyconfig_prefs(UserDef *userdef)
203 for (wmKeyConfigPref *kpt = userdef->user_keyconfig_prefs.first, *kpt_next; kpt; kpt = kpt_next) {
204 kpt_next = kpt->next;
205 IDP_FreeProperty(kpt->prop);
206 MEM_freeN(kpt->prop);
209 BLI_listbase_clear(&userdef->user_keyconfig_prefs);
212 static void userdef_free_user_menus(UserDef *userdef)
214 for (bUserMenu *um = userdef->user_menus.first, *um_next; um; um = um_next) {
216 BKE_blender_user_menu_item_free_list(&um->items);
221 static void userdef_free_addons(UserDef *userdef)
223 for (bAddon *addon = userdef->addons.first, *addon_next; addon; addon = addon_next) {
224 addon_next = addon->next;
225 BKE_addon_free(addon);
227 BLI_listbase_clear(&userdef->addons);
231 * When loading a new userdef from file,
232 * or when exiting Blender.
234 void BKE_blender_userdef_data_free(UserDef *userdef, bool clear_fonts)
236 #define U _invalid_access_ /* ensure no accidental global access */
237 #ifdef U /* quiet warning */
240 userdef_free_keymaps(userdef);
241 userdef_free_keyconfig_prefs(userdef);
242 userdef_free_user_menus(userdef);
243 userdef_free_addons(userdef);
246 for (uiFont *font = userdef->uifonts.first; font; font = font->next) {
247 BLF_unload_id(font->blf_id);
252 BLI_freelistN(&userdef->autoexec_paths);
254 BLI_freelistN(&userdef->uistyles);
255 BLI_freelistN(&userdef->uifonts);
256 BLI_freelistN(&userdef->themes);
263 * Write U from userdef.
264 * This function defines which settings a template will override for the user preferences.
266 void BKE_blender_userdef_app_template_data_swap(UserDef *userdef_a, UserDef *userdef_b)
269 * - various minor settings (add as needed).
272 #define DATA_SWAP(id) \
274 UserDef userdef_tmp; \
275 memcpy(&(userdef_tmp.id), &(userdef_a->id), sizeof(userdef_tmp.id)); \
276 memcpy(&(userdef_a->id), &(userdef_b->id), sizeof(userdef_tmp.id)); \
277 memcpy(&(userdef_b->id), &(userdef_tmp.id), sizeof(userdef_tmp.id)); \
280 #define LIST_SWAP(id) { \
281 SWAP(ListBase, userdef_a->id, userdef_b->id); \
284 #define FLAG_SWAP(id, ty, flags) { \
285 CHECK_TYPE(&(userdef_a->id), ty *); \
286 const ty f = flags; \
287 const ty a = userdef_a->id; \
288 const ty b = userdef_b->id; \
289 userdef_a->id = (userdef_a->id & ~f) | (b & f); \
290 userdef_b->id = (userdef_b->id & ~f) | (a & f); \
298 LIST_SWAP(user_keymaps);
300 DATA_SWAP(font_path_ui);
301 DATA_SWAP(font_path_ui_mono);
302 DATA_SWAP(keyconfigstr);
304 DATA_SWAP(gizmo_flag);
307 /* We could add others. */
308 FLAG_SWAP(uiflag, int, USER_SAVE_PROMPT);
316 void BKE_blender_userdef_app_template_data_set(UserDef *userdef)
318 BKE_blender_userdef_app_template_data_swap(&U, userdef);
319 BKE_blender_userdef_data_free(userdef, true);
322 void BKE_blender_userdef_app_template_data_set_and_free(UserDef *userdef)
324 BKE_blender_userdef_app_template_data_set(userdef);
328 /* ***************** testing for break ************* */
330 static void (*blender_test_break_cb)(void) = NULL;
332 void BKE_blender_callback_test_break_set(void (*func)(void))
334 blender_test_break_cb = func;
338 int BKE_blender_test_break(void)
341 if (blender_test_break_cb)
342 blender_test_break_cb();
345 return (G.is_break == true);
349 /** \name Blender's AtExit
351 * \note Don't use MEM_mallocN so functions can be registered at any time.
354 static struct AtExitData {
355 struct AtExitData *next;
357 void (*func)(void *user_data);
361 void BKE_blender_atexit_register(void (*func)(void *user_data), void *user_data)
363 struct AtExitData *ae = malloc(sizeof(*ae));
366 ae->user_data = user_data;
370 void BKE_blender_atexit_unregister(void (*func)(void *user_data), const void *user_data)
372 struct AtExitData *ae = g_atexit;
373 struct AtExitData **ae_p = &g_atexit;
376 if ((ae->func == func) && (ae->user_data == user_data)) {
386 void BKE_blender_atexit(void)
388 struct AtExitData *ae = g_atexit, *ae_next;
392 ae->func(ae->user_data);