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