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