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