blender.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363
  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. /** \file blender/blenkernel/intern/blender.c
  28. * \ingroup bke
  29. *
  30. * Application level startup/shutdown functionality.
  31. */
  32. #include <stdlib.h>
  33. #include <stdio.h>
  34. #include <string.h>
  35. #include "MEM_guardedalloc.h"
  36. #include "BLI_string.h"
  37. #include "BLI_listbase.h"
  38. #include "BLI_utildefines.h"
  39. #include "BLI_callbacks.h"
  40. #include "IMB_imbuf.h"
  41. #include "IMB_moviecache.h"
  42. #include "BKE_blender.h" /* own include */
  43. #include "BKE_blender_version.h" /* own include */
  44. #include "BKE_blendfile.h"
  45. #include "BKE_brush.h"
  46. #include "BKE_cachefile.h"
  47. #include "BKE_context.h"
  48. #include "BKE_depsgraph.h"
  49. #include "BKE_global.h"
  50. #include "BKE_idprop.h"
  51. #include "BKE_image.h"
  52. #include "BKE_library.h"
  53. #include "BKE_node.h"
  54. #include "BKE_report.h"
  55. #include "BKE_scene.h"
  56. #include "BKE_screen.h"
  57. #include "BKE_sequencer.h"
  58. #include "RE_pipeline.h"
  59. #include "RE_render_ext.h"
  60. #include "BLF_api.h"
  61. Global G;
  62. UserDef U;
  63. char versionstr[48] = "";
  64. /* ********** free ********** */
  65. /* only to be called on exit blender */
  66. void BKE_blender_free(void)
  67. {
  68. /* samples are in a global list..., also sets G.main->sound->sample NULL */
  69. BKE_main_free(G.main);
  70. G.main = NULL;
  71. BKE_spacetypes_free(); /* after free main, it uses space callbacks */
  72. IMB_exit();
  73. BKE_cachefiles_exit();
  74. BKE_images_exit();
  75. DAG_exit();
  76. BKE_brush_system_exit();
  77. RE_texture_rng_exit();
  78. BLI_callback_global_finalize();
  79. BKE_sequencer_cache_destruct();
  80. IMB_moviecache_destruct();
  81. free_nodesystem();
  82. }
  83. void BKE_blender_version_string(char *version_str, size_t maxncpy, short version, short subversion, bool v_prefix, bool include_subversion)
  84. {
  85. const char *prefix = v_prefix ? "v" : "";
  86. if (include_subversion && subversion > 0) {
  87. BLI_snprintf(version_str, maxncpy, "%s%d.%02d.%d", prefix, version / 100, version % 100, subversion);
  88. }
  89. else {
  90. BLI_snprintf(version_str, maxncpy, "%s%d.%02d", prefix, version / 100, version % 100);
  91. }
  92. }
  93. void BKE_blender_globals_init(void)
  94. {
  95. memset(&G, 0, sizeof(Global));
  96. U.savetime = 1;
  97. G.main = BKE_main_new();
  98. strcpy(G.ima, "//");
  99. BKE_blender_version_string(versionstr, sizeof(versionstr), BLENDER_VERSION, BLENDER_SUBVERSION, true, true);
  100. #ifndef WITH_PYTHON_SECURITY /* default */
  101. G.f |= G_SCRIPT_AUTOEXEC;
  102. #else
  103. G.f &= ~G_SCRIPT_AUTOEXEC;
  104. #endif
  105. }
  106. void BKE_blender_globals_clear(void)
  107. {
  108. BKE_main_free(G.main); /* free all lib data */
  109. G.main = NULL;
  110. }
  111. /***/
  112. static void keymap_item_free(wmKeyMapItem *kmi)
  113. {
  114. if (kmi->properties) {
  115. IDP_FreeProperty(kmi->properties);
  116. MEM_freeN(kmi->properties);
  117. }
  118. if (kmi->ptr)
  119. MEM_freeN(kmi->ptr);
  120. }
  121. void BKE_blender_userdef_data_swap(UserDef *userdef_a, UserDef *userdef_b)
  122. {
  123. SWAP(UserDef, *userdef_a, *userdef_b);
  124. }
  125. void BKE_blender_userdef_data_set(UserDef *userdef)
  126. {
  127. BKE_blender_userdef_data_swap(&U, userdef);
  128. BKE_blender_userdef_data_free(userdef, true);
  129. }
  130. void BKE_blender_userdef_data_set_and_free(UserDef *userdef)
  131. {
  132. BKE_blender_userdef_data_set(userdef);
  133. MEM_freeN(userdef);
  134. }
  135. static void userdef_free_keymaps(UserDef *userdef)
  136. {
  137. for (wmKeyMap *km = userdef->user_keymaps.first, *km_next; km; km = km_next) {
  138. km_next = km->next;
  139. for (wmKeyMapDiffItem *kmdi = km->diff_items.first; kmdi; kmdi = kmdi->next) {
  140. if (kmdi->add_item) {
  141. keymap_item_free(kmdi->add_item);
  142. MEM_freeN(kmdi->add_item);
  143. }
  144. if (kmdi->remove_item) {
  145. keymap_item_free(kmdi->remove_item);
  146. MEM_freeN(kmdi->remove_item);
  147. }
  148. }
  149. for (wmKeyMapItem *kmi = km->items.first; kmi; kmi = kmi->next) {
  150. keymap_item_free(kmi);
  151. }
  152. BLI_freelistN(&km->diff_items);
  153. BLI_freelistN(&km->items);
  154. MEM_freeN(km);
  155. }
  156. BLI_listbase_clear(&userdef->user_keymaps);
  157. }
  158. static void userdef_free_addons(UserDef *userdef)
  159. {
  160. for (bAddon *addon = userdef->addons.first, *addon_next; addon; addon = addon_next) {
  161. addon_next = addon->next;
  162. if (addon->prop) {
  163. IDP_FreeProperty(addon->prop);
  164. MEM_freeN(addon->prop);
  165. }
  166. MEM_freeN(addon);
  167. }
  168. BLI_listbase_clear(&userdef->addons);
  169. }
  170. /**
  171. * When loading a new userdef from file,
  172. * or when exiting Blender.
  173. */
  174. void BKE_blender_userdef_data_free(UserDef *userdef, bool clear_fonts)
  175. {
  176. #define U _invalid_access_ /* ensure no accidental global access */
  177. #ifdef U /* quiet warning */
  178. #endif
  179. userdef_free_keymaps(userdef);
  180. userdef_free_addons(userdef);
  181. if (clear_fonts) {
  182. for (uiFont *font = userdef->uifonts.first; font; font = font->next) {
  183. BLF_unload_id(font->blf_id);
  184. }
  185. BLF_default_set(-1);
  186. }
  187. BLI_freelistN(&userdef->autoexec_paths);
  188. BLI_freelistN(&userdef->uistyles);
  189. BLI_freelistN(&userdef->uifonts);
  190. BLI_freelistN(&userdef->themes);
  191. #undef U
  192. }
  193. /**
  194. * Write U from userdef.
  195. * This function defines which settings a template will override for the user preferences.
  196. */
  197. void BKE_blender_userdef_app_template_data_swap(UserDef *userdef_a, UserDef *userdef_b)
  198. {
  199. /* TODO:
  200. * - various minor settings (add as needed).
  201. */
  202. #define DATA_SWAP(id) \
  203. { \
  204. UserDef userdef_tmp; \
  205. memcpy(&(userdef_tmp.id), &(userdef_a->id), sizeof(userdef_tmp.id)); \
  206. memcpy(&(userdef_a->id), &(userdef_b->id), sizeof(userdef_tmp.id)); \
  207. memcpy(&(userdef_b->id), &(userdef_tmp.id), sizeof(userdef_tmp.id)); \
  208. }
  209. #define LIST_SWAP(id) { \
  210. SWAP(ListBase, userdef_a->id, userdef_b->id); \
  211. } ((void)0)
  212. LIST_SWAP(uistyles);
  213. LIST_SWAP(uifonts);
  214. LIST_SWAP(themes);
  215. LIST_SWAP(addons);
  216. LIST_SWAP(user_keymaps);
  217. DATA_SWAP(light);
  218. DATA_SWAP(font_path_ui);
  219. DATA_SWAP(font_path_ui_mono);
  220. DATA_SWAP(keyconfigstr);
  221. #undef SWAP_TYPELESS
  222. #undef LIST_SWAP
  223. #undef DATA_SWAP
  224. }
  225. void BKE_blender_userdef_app_template_data_set(UserDef *userdef)
  226. {
  227. BKE_blender_userdef_app_template_data_swap(&U, userdef);
  228. BKE_blender_userdef_data_free(userdef, true);
  229. }
  230. void BKE_blender_userdef_app_template_data_set_and_free(UserDef *userdef)
  231. {
  232. BKE_blender_userdef_app_template_data_set(userdef);
  233. MEM_freeN(userdef);
  234. }
  235. /* ***************** testing for break ************* */
  236. static void (*blender_test_break_cb)(void) = NULL;
  237. void BKE_blender_callback_test_break_set(void (*func)(void))
  238. {
  239. blender_test_break_cb = func;
  240. }
  241. int BKE_blender_test_break(void)
  242. {
  243. if (!G.background) {
  244. if (blender_test_break_cb)
  245. blender_test_break_cb();
  246. }
  247. return (G.is_break == true);
  248. }
  249. /** \name Blender's AtExit
  250. *
  251. * \note Don't use MEM_mallocN so functions can be registered at any time.
  252. * \{ */
  253. static struct AtExitData {
  254. struct AtExitData *next;
  255. void (*func)(void *user_data);
  256. void *user_data;
  257. } *g_atexit = NULL;
  258. void BKE_blender_atexit_register(void (*func)(void *user_data), void *user_data)
  259. {
  260. struct AtExitData *ae = malloc(sizeof(*ae));
  261. ae->next = g_atexit;
  262. ae->func = func;
  263. ae->user_data = user_data;
  264. g_atexit = ae;
  265. }
  266. void BKE_blender_atexit_unregister(void (*func)(void *user_data), const void *user_data)
  267. {
  268. struct AtExitData *ae = g_atexit;
  269. struct AtExitData **ae_p = &g_atexit;
  270. while (ae) {
  271. if ((ae->func == func) && (ae->user_data == user_data)) {
  272. *ae_p = ae->next;
  273. free(ae);
  274. return;
  275. }
  276. ae_p = &ae;
  277. ae = ae->next;
  278. }
  279. }
  280. void BKE_blender_atexit(void)
  281. {
  282. struct AtExitData *ae = g_atexit, *ae_next;
  283. while (ae) {
  284. ae_next = ae->next;
  285. ae->func(ae->user_data);
  286. free(ae);
  287. ae = ae_next;
  288. }
  289. g_atexit = NULL;
  290. }
  291. /** \} */