Cleanup: remove redundant doxygen \file argument
[blender.git] / source / blender / blenkernel / intern / blender.c
1 /*
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.
6  *
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.
11  *
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.
15  *
16  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
17  * All rights reserved.
18  */
19
20 /** \file \ingroup bke
21  *
22  * Application level startup/shutdown functionality.
23  */
24
25 #include <stdlib.h>
26 #include <stdio.h>
27 #include <string.h>
28
29 #include "MEM_guardedalloc.h"
30
31 #include "BLI_string.h"
32 #include "BLI_listbase.h"
33 #include "BLI_utildefines.h"
34 #include "BLI_callbacks.h"
35
36 #include "IMB_imbuf.h"
37 #include "IMB_moviecache.h"
38
39 #include "BKE_addon.h"
40 #include "BKE_blender.h"  /* own include */
41 #include "BKE_blender_version.h"  /* own include */
42 #include "BKE_blender_user_menu.h"
43 #include "BKE_blendfile.h"
44 #include "BKE_brush.h"
45 #include "BKE_cachefile.h"
46 #include "BKE_global.h"
47 #include "BKE_idprop.h"
48 #include "BKE_image.h"
49 #include "BKE_layer.h"
50 #include "BKE_main.h"
51 #include "BKE_node.h"
52 #include "BKE_report.h"
53 #include "BKE_scene.h"
54 #include "BKE_screen.h"
55 #include "BKE_sequencer.h"
56 #include "BKE_studiolight.h"
57
58 #include "DEG_depsgraph.h"
59
60 #include "RE_pipeline.h"
61 #include "RE_render_ext.h"
62
63 #include "BLF_api.h"
64
65
66 Global G;
67 UserDef U;
68
69 char versionstr[48] = "";
70
71 /* ********** free ********** */
72
73 /* only to be called on exit blender */
74 void BKE_blender_free(void)
75 {
76         /* samples are in a global list..., also sets G_MAIN->sound->sample NULL */
77
78         BKE_studiolight_free(); /* needs to run before main free as wm is still referenced for icons preview jobs */
79         BKE_main_free(G_MAIN);
80         G_MAIN = NULL;
81
82         if (G.log.file != NULL) {
83                 fclose(G.log.file);
84         }
85
86         BKE_spacetypes_free();      /* after free main, it uses space callbacks */
87
88         IMB_exit();
89         BKE_cachefiles_exit();
90         BKE_images_exit();
91         DEG_free_node_types();
92
93         BKE_brush_system_exit();
94         RE_texture_rng_exit();
95
96         BLI_callback_global_finalize();
97
98         BKE_sequencer_cache_destruct();
99         IMB_moviecache_destruct();
100
101         free_nodesystem();
102 }
103
104 void BKE_blender_version_string(char *version_str, size_t maxncpy, short version, short subversion, bool v_prefix, bool include_subversion)
105 {
106         const char *prefix = v_prefix ? "v" : "";
107
108         if (include_subversion && subversion > 0) {
109                 BLI_snprintf(version_str, maxncpy, "%s%d.%02d.%d", prefix, version / 100, version % 100, subversion);
110         }
111         else {
112                 BLI_snprintf(version_str, maxncpy, "%s%d.%02d", prefix, version / 100, version % 100);
113         }
114 }
115
116 void BKE_blender_globals_init(void)
117 {
118         memset(&G, 0, sizeof(Global));
119
120         U.savetime = 1;
121
122         G_MAIN = BKE_main_new();
123
124         strcpy(G.ima, "//");
125
126         BKE_blender_version_string(versionstr, sizeof(versionstr), BLENDER_VERSION, BLENDER_SUBVERSION, true, true);
127
128 #ifndef WITH_PYTHON_SECURITY /* default */
129         G.f |= G_FLAG_SCRIPT_AUTOEXEC;
130 #else
131         G.f &= ~G_FLAG_SCRIPT_AUTOEXEC;
132 #endif
133
134         G.log.level = 1;
135 }
136
137 void BKE_blender_globals_clear(void)
138 {
139         BKE_main_free(G_MAIN);          /* free all lib data */
140
141         G_MAIN = NULL;
142 }
143
144 /***/
145
146 static void keymap_item_free(wmKeyMapItem *kmi)
147 {
148         if (kmi->properties) {
149                 IDP_FreeProperty(kmi->properties);
150                 MEM_freeN(kmi->properties);
151         }
152         if (kmi->ptr)
153                 MEM_freeN(kmi->ptr);
154 }
155
156 void BKE_blender_userdef_data_swap(UserDef *userdef_a, UserDef *userdef_b)
157 {
158         SWAP(UserDef, *userdef_a, *userdef_b);
159 }
160
161 void BKE_blender_userdef_data_set(UserDef *userdef)
162 {
163         BKE_blender_userdef_data_swap(&U, userdef);
164         BKE_blender_userdef_data_free(userdef, true);
165 }
166
167 void BKE_blender_userdef_data_set_and_free(UserDef *userdef)
168 {
169         BKE_blender_userdef_data_set(userdef);
170         MEM_freeN(userdef);
171 }
172
173 static void userdef_free_keymaps(UserDef *userdef)
174 {
175         for (wmKeyMap *km = userdef->user_keymaps.first, *km_next; km; km = km_next) {
176                 km_next = km->next;
177                 for (wmKeyMapDiffItem *kmdi = km->diff_items.first; kmdi; kmdi = kmdi->next) {
178                         if (kmdi->add_item) {
179                                 keymap_item_free(kmdi->add_item);
180                                 MEM_freeN(kmdi->add_item);
181                         }
182                         if (kmdi->remove_item) {
183                                 keymap_item_free(kmdi->remove_item);
184                                 MEM_freeN(kmdi->remove_item);
185                         }
186                 }
187
188                 for (wmKeyMapItem *kmi = km->items.first; kmi; kmi = kmi->next) {
189                         keymap_item_free(kmi);
190                 }
191
192                 BLI_freelistN(&km->diff_items);
193                 BLI_freelistN(&km->items);
194
195                 MEM_freeN(km);
196         }
197         BLI_listbase_clear(&userdef->user_keymaps);
198 }
199
200 static void userdef_free_keyconfig_prefs(UserDef *userdef)
201 {
202         for (wmKeyConfigPref *kpt = userdef->user_keyconfig_prefs.first, *kpt_next; kpt; kpt = kpt_next) {
203                 kpt_next = kpt->next;
204                 IDP_FreeProperty(kpt->prop);
205                 MEM_freeN(kpt->prop);
206                 MEM_freeN(kpt);
207         }
208         BLI_listbase_clear(&userdef->user_keyconfig_prefs);
209 }
210
211 static void userdef_free_user_menus(UserDef *userdef)
212 {
213         for (bUserMenu *um = userdef->user_menus.first, *um_next; um; um = um_next) {
214                 um_next = um->next;
215                 BKE_blender_user_menu_item_free_list(&um->items);
216                 MEM_freeN(um);
217         }
218 }
219
220 static void userdef_free_addons(UserDef *userdef)
221 {
222         for (bAddon *addon = userdef->addons.first, *addon_next; addon; addon = addon_next) {
223                 addon_next = addon->next;
224                 BKE_addon_free(addon);
225         }
226         BLI_listbase_clear(&userdef->addons);
227 }
228
229 /**
230  * When loading a new userdef from file,
231  * or when exiting Blender.
232  */
233 void BKE_blender_userdef_data_free(UserDef *userdef, bool clear_fonts)
234 {
235 #define U _invalid_access_ /* ensure no accidental global access */
236 #ifdef U  /* quiet warning */
237 #endif
238
239         userdef_free_keymaps(userdef);
240         userdef_free_keyconfig_prefs(userdef);
241         userdef_free_user_menus(userdef);
242         userdef_free_addons(userdef);
243
244         if (clear_fonts) {
245                 for (uiFont *font = userdef->uifonts.first; font; font = font->next) {
246                         BLF_unload_id(font->blf_id);
247                 }
248                 BLF_default_set(-1);
249         }
250
251         BLI_freelistN(&userdef->autoexec_paths);
252
253         BLI_freelistN(&userdef->uistyles);
254         BLI_freelistN(&userdef->uifonts);
255         BLI_freelistN(&userdef->themes);
256
257
258 #undef U
259 }
260
261 /**
262  * Write U from userdef.
263  * This function defines which settings a template will override for the user preferences.
264  */
265 void BKE_blender_userdef_app_template_data_swap(UserDef *userdef_a, UserDef *userdef_b)
266 {
267         /* TODO:
268          * - various minor settings (add as needed).
269          */
270
271 #define DATA_SWAP(id) \
272         { \
273                 UserDef userdef_tmp; \
274                 memcpy(&(userdef_tmp.id), &(userdef_a->id), sizeof(userdef_tmp.id)); \
275                 memcpy(&(userdef_a->id), &(userdef_b->id), sizeof(userdef_tmp.id)); \
276                 memcpy(&(userdef_b->id), &(userdef_tmp.id), sizeof(userdef_tmp.id)); \
277         }
278
279 #define LIST_SWAP(id) { \
280         SWAP(ListBase, userdef_a->id, userdef_b->id); \
281 } ((void)0)
282
283 #define FLAG_SWAP(id, ty, flags) { \
284         CHECK_TYPE(&(userdef_a->id), ty *); \
285         const ty f = flags; \
286         const ty a = userdef_a->id; \
287         const ty b = userdef_b->id; \
288         userdef_a->id = (userdef_a->id & ~f) | (b & f); \
289         userdef_b->id = (userdef_b->id & ~f) | (a & f); \
290 } ((void)0)
291
292
293         LIST_SWAP(uistyles);
294         LIST_SWAP(uifonts);
295         LIST_SWAP(themes);
296         LIST_SWAP(addons);
297         LIST_SWAP(user_keymaps);
298
299         DATA_SWAP(font_path_ui);
300         DATA_SWAP(font_path_ui_mono);
301         DATA_SWAP(keyconfigstr);
302
303         DATA_SWAP(gizmo_flag);
304         DATA_SWAP(app_flag);
305
306         /* We could add others. */
307         FLAG_SWAP(uiflag, int, USER_QUIT_PROMPT);
308
309 #undef SWAP_TYPELESS
310 #undef DATA_SWAP
311 #undef LIST_SWAP
312 #undef FLAG_SWAP
313 }
314
315 void BKE_blender_userdef_app_template_data_set(UserDef *userdef)
316 {
317         BKE_blender_userdef_app_template_data_swap(&U, userdef);
318         BKE_blender_userdef_data_free(userdef, true);
319 }
320
321 void BKE_blender_userdef_app_template_data_set_and_free(UserDef *userdef)
322 {
323         BKE_blender_userdef_app_template_data_set(userdef);
324         MEM_freeN(userdef);
325 }
326
327 /* *****************  testing for break ************* */
328
329 static void (*blender_test_break_cb)(void) = NULL;
330
331 void BKE_blender_callback_test_break_set(void (*func)(void))
332 {
333         blender_test_break_cb = func;
334 }
335
336
337 int BKE_blender_test_break(void)
338 {
339         if (!G.background) {
340                 if (blender_test_break_cb)
341                         blender_test_break_cb();
342         }
343
344         return (G.is_break == true);
345 }
346
347
348 /** \name Blender's AtExit
349  *
350  * \note Don't use MEM_mallocN so functions can be registered at any time.
351  * \{ */
352
353 static struct AtExitData {
354         struct AtExitData *next;
355
356         void (*func)(void *user_data);
357         void *user_data;
358 } *g_atexit = NULL;
359
360 void BKE_blender_atexit_register(void (*func)(void *user_data), void *user_data)
361 {
362         struct AtExitData *ae = malloc(sizeof(*ae));
363         ae->next = g_atexit;
364         ae->func = func;
365         ae->user_data = user_data;
366         g_atexit = ae;
367 }
368
369 void BKE_blender_atexit_unregister(void (*func)(void *user_data), const void *user_data)
370 {
371         struct AtExitData *ae = g_atexit;
372         struct AtExitData **ae_p = &g_atexit;
373
374         while (ae) {
375                 if ((ae->func == func) && (ae->user_data == user_data)) {
376                         *ae_p = ae->next;
377                         free(ae);
378                         return;
379                 }
380                 ae_p = &ae;
381                 ae = ae->next;
382         }
383 }
384
385 void BKE_blender_atexit(void)
386 {
387         struct AtExitData *ae = g_atexit, *ae_next;
388         while (ae) {
389                 ae_next = ae->next;
390
391                 ae->func(ae->user_data);
392
393                 free(ae);
394                 ae = ae_next;
395         }
396         g_atexit = NULL;
397 }
398
399 /** \} */