Fix static override (very stupid mistakes in code!)
[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_blender.h"  /* own include */
49 #include "BKE_blender_version.h"  /* own include */
50 #include "BKE_blendfile.h"
51 #include "BKE_brush.h"
52 #include "BKE_cachefile.h"
53 #include "BKE_context.h"
54 #include "BKE_global.h"
55 #include "BKE_idprop.h"
56 #include "BKE_image.h"
57 #include "BKE_layer.h"
58 #include "BKE_library.h"
59 #include "BKE_node.h"
60 #include "BKE_report.h"
61 #include "BKE_scene.h"
62 #include "BKE_screen.h"
63 #include "BKE_sequencer.h"
64
65 #include "DEG_depsgraph.h"
66
67 #include "RE_pipeline.h"
68 #include "RE_render_ext.h"
69
70 #include "BLF_api.h"
71
72
73 Global G;
74 UserDef U;
75
76 char versionstr[48] = "";
77
78 /* ********** free ********** */
79
80 /* only to be called on exit blender */
81 void BKE_blender_free(void)
82 {
83         /* samples are in a global list..., also sets G.main->sound->sample NULL */
84         BKE_main_free(G.main);
85         G.main = NULL;
86
87         BKE_spacetypes_free();      /* after free main, it uses space callbacks */
88         
89         IMB_exit();
90         BKE_cachefiles_exit();
91         BKE_images_exit();
92         DEG_free_node_types();
93
94         BKE_brush_system_exit();
95         RE_texture_rng_exit();  
96
97         BLI_callback_global_finalize();
98
99         BKE_sequencer_cache_destruct();
100         IMB_moviecache_destruct();
101
102         BKE_layer_exit();
103         
104         free_nodesystem();
105 }
106
107 void BKE_blender_version_string(char *version_str, size_t maxncpy, short version, short subversion, bool v_prefix, bool include_subversion)
108 {
109         const char *prefix = v_prefix ? "v" : "";
110
111         if (include_subversion && subversion > 0) {
112                 BLI_snprintf(version_str, maxncpy, "%s%d.%02d.%d", prefix, version / 100, version % 100, subversion);
113         }
114         else {
115                 BLI_snprintf(version_str, maxncpy, "%s%d.%02d", prefix, version / 100, version % 100);
116         }
117 }
118
119 void BKE_blender_globals_init(void)
120 {
121         memset(&G, 0, sizeof(Global));
122         
123         U.savetime = 1;
124
125         G.main = BKE_main_new();
126
127         strcpy(G.ima, "//");
128
129         BKE_blender_version_string(versionstr, sizeof(versionstr), BLENDER_VERSION, BLENDER_SUBVERSION, true, true);
130
131 #ifndef WITH_PYTHON_SECURITY /* default */
132         G.f |= G_SCRIPT_AUTOEXEC;
133 #else
134         G.f &= ~G_SCRIPT_AUTOEXEC;
135 #endif
136 }
137
138 void BKE_blender_globals_clear(void)
139 {
140         BKE_main_free(G.main);          /* free all lib data */
141
142         G.main = NULL;
143 }
144
145 /***/
146
147 static void keymap_item_free(wmKeyMapItem *kmi)
148 {
149         if (kmi->properties) {
150                 IDP_FreeProperty(kmi->properties);
151                 MEM_freeN(kmi->properties);
152         }
153         if (kmi->ptr)
154                 MEM_freeN(kmi->ptr);
155 }
156
157 void BKE_blender_userdef_data_swap(UserDef *userdef_a, UserDef *userdef_b)
158 {
159         SWAP(UserDef, *userdef_a, *userdef_b);
160 }
161
162 void BKE_blender_userdef_data_set(UserDef *userdef)
163 {
164         BKE_blender_userdef_data_swap(&U, userdef);
165         BKE_blender_userdef_data_free(userdef, true);
166 }
167
168 void BKE_blender_userdef_data_set_and_free(UserDef *userdef)
169 {
170         BKE_blender_userdef_data_set(userdef);
171         MEM_freeN(userdef);
172 }
173
174 static void userdef_free_keymaps(UserDef *userdef)
175 {
176         for (wmKeyMap *km = userdef->user_keymaps.first, *km_next; km; km = km_next) {
177                 km_next = 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);
182                         }
183                         if (kmdi->remove_item) {
184                                 keymap_item_free(kmdi->remove_item);
185                                 MEM_freeN(kmdi->remove_item);
186                         }
187                 }
188
189                 for (wmKeyMapItem *kmi = km->items.first; kmi; kmi = kmi->next) {
190                         keymap_item_free(kmi);
191                 }
192
193                 BLI_freelistN(&km->diff_items);
194                 BLI_freelistN(&km->items);
195
196                 MEM_freeN(km);
197         }
198         BLI_listbase_clear(&userdef->user_keymaps);
199 }
200
201 static void userdef_free_addons(UserDef *userdef)
202 {
203         for (bAddon *addon = userdef->addons.first, *addon_next; addon; addon = addon_next) {
204                 addon_next = addon->next;
205                 if (addon->prop) {
206                         IDP_FreeProperty(addon->prop);
207                         MEM_freeN(addon->prop);
208                 }
209                 MEM_freeN(addon);
210         }
211         BLI_listbase_clear(&userdef->addons);
212 }
213
214 /**
215  * When loading a new userdef from file,
216  * or when exiting Blender.
217  */
218 void BKE_blender_userdef_data_free(UserDef *userdef, bool clear_fonts)
219 {
220 #define U _invalid_access_ /* ensure no accidental global access */
221 #ifdef U  /* quiet warning */
222 #endif
223
224         userdef_free_keymaps(userdef);
225         userdef_free_addons(userdef);
226
227         if (clear_fonts) {
228                 for (uiFont *font = userdef->uifonts.first; font; font = font->next) {
229                         BLF_unload_id(font->blf_id);
230                 }
231                 BLF_default_set(-1);
232         }
233
234         BLI_freelistN(&userdef->autoexec_paths);
235
236         BLI_freelistN(&userdef->uistyles);
237         BLI_freelistN(&userdef->uifonts);
238         BLI_freelistN(&userdef->themes);
239
240 #undef U
241 }
242
243 /**
244  * Write U from userdef.
245  * This function defines which settings a template will override for the user preferences.
246  */
247 void BKE_blender_userdef_app_template_data_swap(UserDef *userdef_a, UserDef *userdef_b)
248 {
249         /* TODO:
250          * - various minor settings (add as needed).
251          */
252
253 #define DATA_SWAP(id) \
254         { \
255                 UserDef userdef_tmp; \
256                 memcpy(&(userdef_tmp.id), &(userdef_a->id), sizeof(userdef_tmp.id)); \
257                 memcpy(&(userdef_a->id), &(userdef_b->id), sizeof(userdef_tmp.id)); \
258                 memcpy(&(userdef_b->id), &(userdef_tmp.id), sizeof(userdef_tmp.id)); \
259         }
260
261 #define LIST_SWAP(id) { \
262         SWAP(ListBase, userdef_a->id, userdef_b->id); \
263 } ((void)0)
264
265         LIST_SWAP(uistyles);
266         LIST_SWAP(uifonts);
267         LIST_SWAP(themes);
268         LIST_SWAP(addons);
269         LIST_SWAP(user_keymaps);
270
271         DATA_SWAP(light);
272
273         DATA_SWAP(font_path_ui);
274         DATA_SWAP(font_path_ui_mono);
275         DATA_SWAP(keyconfigstr);
276
277         DATA_SWAP(manipulator_flag);
278
279 #undef SWAP_TYPELESS
280 #undef LIST_SWAP
281 #undef DATA_SWAP
282 }
283
284 void BKE_blender_userdef_app_template_data_set(UserDef *userdef)
285 {
286         BKE_blender_userdef_app_template_data_swap(&U, userdef);
287         BKE_blender_userdef_data_free(userdef, true);
288 }
289
290 void BKE_blender_userdef_app_template_data_set_and_free(UserDef *userdef)
291 {
292         BKE_blender_userdef_app_template_data_set(userdef);
293         MEM_freeN(userdef);
294 }
295
296 /* *****************  testing for break ************* */
297
298 static void (*blender_test_break_cb)(void) = NULL;
299
300 void BKE_blender_callback_test_break_set(void (*func)(void))
301 {
302         blender_test_break_cb = func;
303 }
304
305
306 int BKE_blender_test_break(void)
307 {
308         if (!G.background) {
309                 if (blender_test_break_cb)
310                         blender_test_break_cb();
311         }
312         
313         return (G.is_break == true);
314 }
315
316
317 /** \name Blender's AtExit
318  *
319  * \note Don't use MEM_mallocN so functions can be registered at any time.
320  * \{ */
321
322 static struct AtExitData {
323         struct AtExitData *next;
324
325         void (*func)(void *user_data);
326         void *user_data;
327 } *g_atexit = NULL;
328
329 void BKE_blender_atexit_register(void (*func)(void *user_data), void *user_data)
330 {
331         struct AtExitData *ae = malloc(sizeof(*ae));
332         ae->next = g_atexit;
333         ae->func = func;
334         ae->user_data = user_data;
335         g_atexit = ae;
336 }
337
338 void BKE_blender_atexit_unregister(void (*func)(void *user_data), const void *user_data)
339 {
340         struct AtExitData *ae = g_atexit;
341         struct AtExitData **ae_p = &g_atexit;
342
343         while (ae) {
344                 if ((ae->func == func) && (ae->user_data == user_data)) {
345                         *ae_p = ae->next;
346                         free(ae);
347                         return;
348                 }
349                 ae_p = &ae;
350                 ae = ae->next;
351         }
352 }
353
354 void BKE_blender_atexit(void)
355 {
356         struct AtExitData *ae = g_atexit, *ae_next;
357         while (ae) {
358                 ae_next = ae->next;
359
360                 ae->func(ae->user_data);
361
362                 free(ae);
363                 ae = ae_next;
364         }
365         g_atexit = NULL;
366 }
367
368 /** \} */