2011-02-23 10:52:22 +00:00
|
|
|
/*
|
2007-12-24 18:27:28 +00:00
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
2018-06-01 18:19:39 +02:00
|
|
|
* of the License, or (at your option) any later version.
|
2007-12-24 18:27:28 +00:00
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software Foundation,
|
2010-02-12 13:34:04 +00:00
|
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2007-12-24 18:27:28 +00:00
|
|
|
*
|
|
|
|
* The Original Code is Copyright (C) 2007 Blender Foundation.
|
|
|
|
* All rights reserved.
|
|
|
|
*/
|
|
|
|
|
2019-02-18 08:08:12 +11:00
|
|
|
/** \file
|
|
|
|
* \ingroup wm
|
2014-01-19 23:14:24 +11:00
|
|
|
*
|
|
|
|
* Manage initializing resources and correctly shutting down.
|
2011-02-25 14:04:21 +00:00
|
|
|
*/
|
|
|
|
|
2007-12-24 18:27:28 +00:00
|
|
|
#include <stdlib.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
2018-05-09 11:20:12 +02:00
|
|
|
#ifdef _WIN32
|
2018-07-19 17:20:48 +02:00
|
|
|
# define WIN32_LEAN_AND_MEAN
|
2013-02-19 12:05:38 +00:00
|
|
|
# include <windows.h>
|
2012-07-26 16:56:09 +00:00
|
|
|
#endif
|
|
|
|
|
2007-12-24 18:27:28 +00:00
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
|
2018-03-29 20:38:32 +02:00
|
|
|
#include "CLG_log.h"
|
|
|
|
|
2016-07-12 12:53:49 +10:00
|
|
|
#include "DNA_genfile.h"
|
2007-12-24 18:27:28 +00:00
|
|
|
#include "DNA_scene_types.h"
|
|
|
|
#include "DNA_userdef_types.h"
|
|
|
|
#include "DNA_windowmanager_types.h"
|
|
|
|
|
2013-03-28 06:36:09 +00:00
|
|
|
#include "BLI_callbacks.h"
|
2012-10-30 19:20:17 +00:00
|
|
|
#include "BLI_listbase.h"
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
#include "BLI_path_util.h"
|
2012-10-30 19:20:17 +00:00
|
|
|
#include "BLI_string.h"
|
2013-08-19 10:51:40 +00:00
|
|
|
#include "BLI_threads.h"
|
2012-10-30 19:20:17 +00:00
|
|
|
#include "BLI_utildefines.h"
|
2018-11-26 20:25:15 +01:00
|
|
|
#include "BLI_timer.h"
|
2012-10-30 19:20:17 +00:00
|
|
|
|
2014-10-10 11:48:48 +02:00
|
|
|
#include "BLO_writefile.h"
|
2018-03-19 14:17:59 +01:00
|
|
|
#include "BLO_undofile.h"
|
2014-10-10 11:48:48 +02:00
|
|
|
|
2019-05-10 18:29:58 +10:00
|
|
|
#include "BKE_blendfile.h"
|
2007-12-24 18:27:28 +00:00
|
|
|
#include "BKE_blender.h"
|
2016-04-24 22:42:41 +10:00
|
|
|
#include "BKE_blender_undo.h"
|
2008-12-18 02:56:48 +00:00
|
|
|
#include "BKE_context.h"
|
2018-11-07 18:00:24 +01:00
|
|
|
#include "BKE_font.h"
|
2007-12-24 18:27:28 +00:00
|
|
|
#include "BKE_global.h"
|
2015-05-16 06:18:04 +10:00
|
|
|
#include "BKE_icons.h"
|
ID-Remap - Step one: core work (cleanup and rework of generic ID datablock handling).
This commit changes a lot of how IDs are handled internally, especially the unlinking/freeing
processes. So far, this was very fuzy, to summarize cleanly deleting or replacing a datablock
was pretty much impossible, except for a few special cases.
Also, unlinking was handled by each datatype, in a rather messy and prone-to-errors way (quite
a few ID usages were missed or wrongly handled that way).
One of the main goal of id-remap branch was to cleanup this, and fatorize ID links handling
by using library_query utils to allow generic handling of those, which is now the case
(now, generic ID links handling is only "knwon" from readfile.c and library_query.c).
This commit also adds backends to allow live replacement and deletion of datablocks in Blender
(so-called 'remapping' process, where we replace all usages of a given ID pointer by a new one,
or NULL one in case of unlinking).
This will allow nice new features, like ability to easily reload or relocate libraries, real immediate
deletion of datablocks in blender, replacement of one datablock by another, etc.
Some of those are for next commits.
A word of warning: this commit is highly risky, because it affects potentially a lot in Blender core.
Though it was tested rather deeply, being totally impossible to check all possible ID usage cases,
it's likely there are some remaining issues and bugs in new code... Please report them! ;)
Review task: D2027 (https://developer.blender.org/D2027).
Reviewed by campbellbarton, thanks a bunch.
2016-06-22 17:29:38 +02:00
|
|
|
#include "BKE_library_remap.h"
|
2010-08-16 12:14:09 +00:00
|
|
|
#include "BKE_main.h"
|
2015-04-07 12:44:39 +10:00
|
|
|
#include "BKE_mball_tessellate.h"
|
2012-08-06 08:25:24 +00:00
|
|
|
#include "BKE_node.h"
|
2009-07-16 00:50:27 +00:00
|
|
|
#include "BKE_report.h"
|
2018-11-07 18:00:24 +01:00
|
|
|
#include "BKE_screen.h"
|
2018-11-16 11:24:49 +11:00
|
|
|
#include "BKE_keyconfig.h"
|
2011-01-07 19:18:31 +00:00
|
|
|
|
2012-12-29 10:24:42 +00:00
|
|
|
#include "BKE_addon.h"
|
2014-11-23 14:37:13 +01:00
|
|
|
#include "BKE_appdir.h"
|
2009-12-17 16:28:45 +00:00
|
|
|
#include "BKE_sequencer.h" /* free seq clipboard */
|
2018-05-11 16:55:14 +02:00
|
|
|
#include "BKE_studiolight.h"
|
2010-03-09 09:17:45 +00:00
|
|
|
#include "BKE_material.h" /* clear_matcopybuf */
|
2012-01-09 20:18:48 +00:00
|
|
|
#include "BKE_tracking.h" /* free tracking clipboard */
|
2019-04-17 06:17:24 +02:00
|
|
|
#include "BKE_mask.h" /* free mask clipboard */
|
2007-12-24 18:27:28 +00:00
|
|
|
|
2011-10-22 16:24:28 +00:00
|
|
|
#include "RE_engine.h"
|
2019-04-17 06:17:24 +02:00
|
|
|
#include "RE_pipeline.h" /* RE_ free stuff */
|
2007-12-24 18:27:28 +00:00
|
|
|
|
2010-10-31 04:11:39 +00:00
|
|
|
#ifdef WITH_PYTHON
|
2019-04-17 06:17:24 +02:00
|
|
|
# include "BPY_extern.h"
|
2008-12-31 05:20:35 +00:00
|
|
|
#endif
|
2007-12-24 18:27:28 +00:00
|
|
|
|
2011-01-05 14:00:14 +00:00
|
|
|
#include "GHOST_Path-api.h"
|
2011-05-02 08:07:24 +00:00
|
|
|
#include "GHOST_C-api.h"
|
2007-12-24 18:27:28 +00:00
|
|
|
|
2008-11-21 19:14:38 +00:00
|
|
|
#include "RNA_define.h"
|
|
|
|
|
2007-12-24 18:27:28 +00:00
|
|
|
#include "WM_api.h"
|
2008-01-01 15:53:38 +00:00
|
|
|
#include "WM_types.h"
|
2017-11-13 19:43:34 +11:00
|
|
|
#include "WM_message.h"
|
2008-12-15 16:54:47 +00:00
|
|
|
|
|
|
|
#include "wm_cursors.h"
|
Lots of stuff; couldn't commit in parts because of refactor work.
* Changes in interface/ module
This commit brings back the way how buttons/menus work under control
of WM event system. The previous implementation extended usage of
handlers and operators in an interesting but confusing way. Better to
try it first according the design specs. :)
Most obviously:
- modal-handler operators are not stored anymore in regions/areas/windows.
such modal handlers own their operator, and should remove it themselves.
- removed code to move handlers from one queue to another.
(needs review with brecht!)
- WM fix: the API call to remove a modal handler got removed. This was a
dangerous thing anyway, and you should leave that to the event system.
Now, if a handler modal() call gets a cancel/finish return, it frees
itself in event system. WM_event_remove_modal_handler was a confusing
call anyway!
Todo:
- allow button-activate to refresh after using button
- re-enable arrow keys for menus
(do both after commit)
- review return values of operator callbacks in interface_ops.c
* Fixes in WM system
- Freeing areas/regions/windows, also on quit, now correctly closes
running modal handlers
- On starting a modal handler, the handler now stores previous area
and region context, so they send proper notifiers etc.
* Other fixes
- Area-split operator had bug, wrong minimal size checking. This
solves error when trying to split a very narrow area.
- removed DNA_USHORT_FIX from screen_types.h, gave warning
- operators didn't get ID name copied when activated, needed for
later re-use or saving.
2008-12-02 14:22:52 +00:00
|
|
|
#include "wm_event_system.h"
|
2007-12-24 18:27:28 +00:00
|
|
|
#include "wm.h"
|
|
|
|
#include "wm_files.h"
|
|
|
|
#include "wm_window.h"
|
|
|
|
|
2016-04-03 01:18:23 +13:00
|
|
|
#include "ED_anim_api.h"
|
2009-03-22 00:30:18 +00:00
|
|
|
#include "ED_armature.h"
|
2015-01-01 12:36:01 +13:00
|
|
|
#include "ED_gpencil.h"
|
2009-03-31 22:36:13 +00:00
|
|
|
#include "ED_keyframing.h"
|
2016-04-03 01:18:23 +13:00
|
|
|
#include "ED_keyframes_edit.h"
|
2009-01-27 17:12:40 +00:00
|
|
|
#include "ED_node.h"
|
Sorry, three commits in one, became difficult to untangle..
Editors Modules
* render/ module added in editors, moved the preview render code there and
also shading related operators.
* physics/ module made more consistent with other modules. renaming files,
making a single physics_ops.c for operators and keymaps. Also move all
particle related operators here now.
* space_buttons/ now should have only operators relevant to the buttons
specificially.
Updates & Notifiers
* Material/Texture/World/Lamp can now be passed to DAG_id_flush_update,
which will go back to a callback in editors. Eventually these should
be in the depsgraph itself, but for now this gives a unified call for
doing updates.
* GLSL materials are now refreshed on changes. There's still various
cases missing,
* Preview icons now hook into this system, solving various update cases
that were missed before.
* Also fixes issue in my last commit, where some preview would not render,
problem is avoided in the new system.
Icon Rendering
* On systems with support for non-power of two textures, an OpenGL texture
is now used instead of glDrawPixels. This avoids problems with icons get
clipped on region borders. On my Linux desktop, this gives an 1.1x speedup,
and on my Mac laptop a 2.3x speedup overall in redrawing the full window,
with the default setup. The glDrawPixels implementation on Mac seems to
have a lot of overhread.
* Preview icons are now drawn using proper premul alpha, and never faded so
you can see them clearly.
* Also tried to fix issue with texture node preview rendering, globals can't
be used with threads reliably.
2009-09-29 19:12:12 +00:00
|
|
|
#include "ED_render.h"
|
2009-01-06 18:14:37 +00:00
|
|
|
#include "ED_space_api.h"
|
2008-01-07 18:03:41 +00:00
|
|
|
#include "ED_screen.h"
|
2008-12-31 17:11:42 +00:00
|
|
|
#include "ED_util.h"
|
2018-04-02 15:02:08 +02:00
|
|
|
#include "ED_undo.h"
|
2008-01-07 18:03:41 +00:00
|
|
|
|
2008-12-19 12:14:58 +00:00
|
|
|
#include "UI_interface.h"
|
2018-07-24 12:43:21 +02:00
|
|
|
#include "UI_resources.h"
|
2009-01-29 05:19:27 +00:00
|
|
|
#include "BLF_api.h"
|
2015-08-16 17:32:01 +10:00
|
|
|
#include "BLT_lang.h"
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2018-03-11 23:43:09 +01:00
|
|
|
#include "GPU_material.h"
|
2008-12-19 12:14:58 +00:00
|
|
|
#include "GPU_draw.h"
|
2018-07-19 15:48:13 +02:00
|
|
|
#include "GPU_immediate.h"
|
2014-10-07 15:46:19 -05:00
|
|
|
#include "GPU_init_exit.h"
|
2008-12-19 12:14:58 +00:00
|
|
|
|
2009-08-09 21:16:39 +00:00
|
|
|
#include "BKE_sound.h"
|
2012-08-13 10:56:36 +00:00
|
|
|
#include "COM_compositor.h"
|
2009-07-16 00:50:27 +00:00
|
|
|
|
2017-04-06 16:44:32 +02:00
|
|
|
#include "DEG_depsgraph.h"
|
|
|
|
|
2018-02-26 19:41:17 +01:00
|
|
|
#include "DRW_engine.h"
|
|
|
|
|
2015-07-20 16:08:06 +02:00
|
|
|
#ifdef WITH_OPENSUBDIV
|
2015-11-04 21:30:25 +05:00
|
|
|
# include "BKE_subsurf.h"
|
2015-07-20 16:08:06 +02:00
|
|
|
#endif
|
|
|
|
|
2018-03-29 20:38:32 +02:00
|
|
|
CLG_LOGREF_DECLARE_GLOBAL(WM_LOG_OPERATORS, "wm.operator");
|
|
|
|
CLG_LOGREF_DECLARE_GLOBAL(WM_LOG_HANDLERS, "wm.handler");
|
|
|
|
CLG_LOGREF_DECLARE_GLOBAL(WM_LOG_EVENTS, "wm.event");
|
|
|
|
CLG_LOGREF_DECLARE_GLOBAL(WM_LOG_KEYMAPS, "wm.keymap");
|
2018-05-03 07:31:55 +02:00
|
|
|
CLG_LOGREF_DECLARE_GLOBAL(WM_LOG_TOOLS, "wm.tool");
|
2018-05-08 08:34:06 +02:00
|
|
|
CLG_LOGREF_DECLARE_GLOBAL(WM_LOG_MSGBUS_PUB, "wm.msgbus.pub");
|
|
|
|
CLG_LOGREF_DECLARE_GLOBAL(WM_LOG_MSGBUS_SUB, "wm.msgbus.sub");
|
2018-03-29 20:38:32 +02:00
|
|
|
|
2009-07-16 00:50:27 +00:00
|
|
|
static void wm_init_reports(bContext *C)
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
ReportList *reports = CTX_wm_reports(C);
|
2014-06-18 15:48:38 +10:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BLI_assert(!reports || BLI_listbase_is_empty(&reports->list));
|
2014-06-18 15:48:38 +10:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_reports_init(reports, RPT_STORE);
|
2009-07-16 00:50:27 +00:00
|
|
|
}
|
|
|
|
static void wm_free_reports(bContext *C)
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
ReportList *reports = CTX_wm_reports(C);
|
2014-06-18 15:48:38 +10:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_reports_clear(reports);
|
2009-07-16 00:50:27 +00:00
|
|
|
}
|
|
|
|
|
2019-02-23 17:23:03 +11:00
|
|
|
static bool wm_start_with_console = false;
|
|
|
|
|
|
|
|
void WM_init_state_start_with_console_set(bool value)
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
wm_start_with_console = value;
|
2019-02-23 17:23:03 +11:00
|
|
|
}
|
2009-07-16 00:50:27 +00:00
|
|
|
|
2018-04-25 17:43:08 +02:00
|
|
|
/**
|
|
|
|
* Since we cannot know in advance if we will require the draw manager
|
|
|
|
* context when starting blender in background mode (specially true with
|
|
|
|
* scripts) we deferre the ghost initialization the most as possible
|
|
|
|
* so that it does not break anything that can run in headless mode (as in
|
|
|
|
* without display server attached).
|
2019-03-19 15:17:46 +11:00
|
|
|
*/
|
2018-04-25 17:43:08 +02:00
|
|
|
static bool opengl_is_init = false;
|
|
|
|
|
2018-06-25 12:50:32 +02:00
|
|
|
void WM_init_opengl(Main *bmain)
|
2018-04-25 17:43:08 +02:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
/* must be called only once */
|
|
|
|
BLI_assert(opengl_is_init == false);
|
2018-04-25 17:43:08 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (G.background) {
|
|
|
|
/* Ghost is still not init elsewhere in background mode. */
|
|
|
|
wm_ghost_init(NULL);
|
|
|
|
}
|
2018-04-25 17:43:08 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Needs to be first to have an ogl context bound. */
|
|
|
|
DRW_opengl_context_create();
|
2018-04-25 17:43:08 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
GPU_init();
|
|
|
|
GPU_set_mipmap(bmain, true);
|
|
|
|
GPU_set_linear_mipmap(true);
|
|
|
|
GPU_set_anisotropic(bmain, U.anisotropic_filter);
|
2018-04-25 17:43:08 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
GPU_pass_cache_init();
|
2018-06-07 11:58:15 +02:00
|
|
|
|
2018-04-25 17:43:08 +02:00
|
|
|
#ifdef WITH_OPENSUBDIV
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_subsurf_osd_init();
|
2018-04-25 17:43:08 +02:00
|
|
|
#endif
|
2019-04-17 06:17:24 +02:00
|
|
|
opengl_is_init = true;
|
2018-04-25 17:43:08 +02:00
|
|
|
}
|
|
|
|
|
2007-12-24 18:27:28 +00:00
|
|
|
/* only called once, for startup */
|
2011-02-19 12:05:20 +00:00
|
|
|
void WM_init(bContext *C, int argc, const char **argv)
|
2007-12-24 18:27:28 +00:00
|
|
|
{
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (!G.background) {
|
|
|
|
wm_ghost_init(C); /* note: it assigns C to ghost! */
|
|
|
|
wm_init_cursor_data();
|
|
|
|
}
|
2018-04-25 17:43:08 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
GHOST_CreateSystemPaths();
|
2012-12-29 10:24:42 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_addon_pref_type_init();
|
|
|
|
BKE_keyconfig_pref_type_init();
|
2012-12-29 10:24:42 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
wm_operatortype_init();
|
|
|
|
wm_operatortypes_register();
|
2018-07-13 12:15:18 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
WM_paneltype_init(); /* Lookup table only. */
|
|
|
|
WM_menutype_init();
|
|
|
|
WM_uilisttype_init();
|
|
|
|
wm_gizmotype_init();
|
|
|
|
wm_gizmogrouptype_init();
|
2011-08-11 06:06:17 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
ED_undosys_type_init();
|
2016-06-25 21:10:30 +10:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_library_callback_free_window_manager_set(wm_close_and_free); /* library.c */
|
|
|
|
BKE_library_callback_free_notifier_reference_set(
|
|
|
|
WM_main_remove_notifier_reference); /* library.c */
|
|
|
|
BKE_region_callback_free_gizmomap_set(wm_gizmomap_remove); /* screen.c */
|
|
|
|
BKE_region_callback_refresh_tag_gizmomap_set(WM_gizmomap_tag_refresh);
|
|
|
|
BKE_library_callback_remap_editor_id_reference_set(
|
|
|
|
WM_main_remap_editor_id_reference); /* library.c */
|
|
|
|
BKE_spacedata_callback_id_remap_set(ED_spacedata_id_remap); /* screen.c */
|
|
|
|
DEG_editors_set_update_cb(ED_render_id_flush_update, ED_render_scene_update);
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
ED_spacetypes_init(); /* editors/space_api/spacetype.c */
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
ED_file_init(); /* for fsmenu */
|
|
|
|
ED_node_init_butfuncs();
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BLF_init();
|
2018-10-22 10:39:57 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BLT_lang_init();
|
2019-04-20 10:02:28 +02:00
|
|
|
/* Must call first before doing any '.blend' file reading,
|
|
|
|
* since versionning code may create new IDs... See T57066. */
|
2019-04-17 06:17:24 +02:00
|
|
|
BLT_lang_set(NULL);
|
2012-07-27 14:53:57 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Init icons before reading .blend files for preview icons, which can
|
|
|
|
* get triggered by the depsgraph. This is also done in background mode
|
|
|
|
* for scripts that do background processing with preview icons. */
|
|
|
|
BKE_icons_init(BIFICONID_LAST);
|
2018-07-24 12:43:21 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* reports cant be initialized before the wm,
|
|
|
|
* but keep before file reading, since that may report errors */
|
|
|
|
wm_init_reports(C);
|
2015-09-22 15:56:03 +10:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
WM_msgbus_types_init();
|
2017-11-13 19:43:34 +11:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* get the default database, plus a wm */
|
|
|
|
bool is_factory_startup = true;
|
2019-05-13 12:44:08 +10:00
|
|
|
const bool use_data = true;
|
|
|
|
const bool use_userdef = true;
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
wm_homefile_read(C,
|
|
|
|
NULL,
|
|
|
|
G.factory_startup,
|
|
|
|
false,
|
2019-05-13 12:44:08 +10:00
|
|
|
use_data,
|
|
|
|
use_userdef,
|
2019-04-17 06:17:24 +02:00
|
|
|
NULL,
|
|
|
|
WM_init_state_app_template_get(),
|
|
|
|
&is_factory_startup);
|
2015-07-01 13:45:19 +10:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* Call again to set from userpreferences... */
|
|
|
|
BLT_lang_set(NULL);
|
2011-09-15 13:20:18 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (!G.background) {
|
2016-08-18 00:21:55 -04:00
|
|
|
|
|
|
|
#ifdef WITH_INPUT_NDOF
|
2019-04-17 06:17:24 +02:00
|
|
|
/* sets 3D mouse deadzone */
|
|
|
|
WM_ndof_deadzone_set(U.ndof_deadzone);
|
2016-08-18 00:21:55 -04:00
|
|
|
#endif
|
2019-04-17 06:17:24 +02:00
|
|
|
WM_init_opengl(G_MAIN);
|
2015-09-16 22:23:07 +05:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
UI_init();
|
|
|
|
}
|
2015-05-11 16:29:12 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_studiolight_init();
|
2019-02-06 12:10:11 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
ED_spacemacros_init();
|
2014-12-26 19:13:32 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* note: there is a bug where python needs initializing before loading the
|
|
|
|
* startup.blend because it may contain PyDrivers. It also needs to be after
|
|
|
|
* initializing space types and other internal data.
|
|
|
|
*
|
|
|
|
* However cant redo this at the moment. Solution is to load python
|
|
|
|
* before wm_homefile_read() or make py-drivers check if python is running.
|
|
|
|
* Will try fix when the crash can be repeated. - campbell. */
|
2010-01-18 18:52:03 +00:00
|
|
|
|
2010-10-31 04:11:39 +00:00
|
|
|
#ifdef WITH_PYTHON
|
2019-04-17 06:17:24 +02:00
|
|
|
BPY_context_set(C); /* necessary evil */
|
|
|
|
BPY_python_start(argc, argv);
|
2010-11-27 02:39:51 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BPY_python_reset(C);
|
2010-10-23 16:03:31 +00:00
|
|
|
#else
|
2019-04-17 06:17:24 +02:00
|
|
|
(void)argc; /* unused */
|
|
|
|
(void)argv; /* unused */
|
2010-01-10 20:01:13 +00:00
|
|
|
#endif
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (!G.background && !wm_start_with_console) {
|
|
|
|
GHOST_toggleConsole(3);
|
|
|
|
}
|
2011-05-02 08:07:24 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
clear_matcopybuf();
|
|
|
|
ED_render_clear_mtex_copybuf();
|
2010-03-09 09:17:45 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
// glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
|
2015-07-22 11:24:38 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
wm_history_file_read();
|
2010-07-15 21:39:47 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* allow a path of "", this is what happens when making a new file */
|
2012-03-09 18:28:30 +00:00
|
|
|
#if 0
|
2019-04-17 06:17:24 +02:00
|
|
|
if (BKE_main_blendfile_path_from_global()[0] == '\0')
|
|
|
|
BLI_make_file_string("/", G_MAIN->name, BKE_appdir_folder_default(), "untitled.blend");
|
2012-03-09 18:28:30 +00:00
|
|
|
#endif
|
2010-07-15 21:39:47 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BLI_strncpy(G.lib, BKE_main_blendfile_path_from_global(), sizeof(G.lib));
|
2012-07-16 08:42:55 +00:00
|
|
|
|
2012-07-17 10:19:47 +00:00
|
|
|
#ifdef WITH_COMPOSITOR
|
2019-04-17 06:17:24 +02:00
|
|
|
if (1) {
|
|
|
|
extern void *COM_linker_hack;
|
|
|
|
COM_linker_hack = COM_execute;
|
|
|
|
}
|
2012-07-17 10:19:47 +00:00
|
|
|
#endif
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
{
|
|
|
|
Main *bmain = CTX_data_main(C);
|
|
|
|
/* note, logic here is from wm_file_read_post,
|
|
|
|
* call functions that depend on Python being initialized. */
|
|
|
|
|
|
|
|
/* normally 'wm_homefile_read' will do this,
|
|
|
|
* however python is not initialized when called from this function.
|
|
|
|
*
|
|
|
|
* unlikely any handlers are set but its possible,
|
|
|
|
* note that recovering the last session does its own callbacks. */
|
|
|
|
CTX_wm_window_set(C, CTX_wm_manager(C)->windows.first);
|
|
|
|
|
|
|
|
BLI_callback_exec(bmain, NULL, BLI_CB_EVT_VERSION_UPDATE);
|
|
|
|
BLI_callback_exec(bmain, NULL, BLI_CB_EVT_LOAD_POST);
|
|
|
|
if (is_factory_startup) {
|
|
|
|
BLI_callback_exec(bmain, NULL, BLI_CB_EVT_LOAD_FACTORY_STARTUP_POST);
|
|
|
|
}
|
|
|
|
|
|
|
|
wm_file_read_report(C, bmain);
|
|
|
|
|
|
|
|
if (!G.background) {
|
|
|
|
CTX_wm_window_set(C, NULL);
|
|
|
|
}
|
|
|
|
}
|
2009-11-23 13:58:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void WM_init_splash(bContext *C)
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
if ((U.uiflag & USER_SPLASH_DISABLE) == 0) {
|
|
|
|
wmWindowManager *wm = CTX_wm_manager(C);
|
|
|
|
wmWindow *prevwin = CTX_wm_window(C);
|
|
|
|
|
|
|
|
if (wm->windows.first) {
|
|
|
|
CTX_wm_window_set(C, wm->windows.first);
|
|
|
|
WM_operator_name_call(C, "WM_OT_splash", WM_OP_INVOKE_DEFAULT, NULL);
|
|
|
|
CTX_wm_window_set(C, prevwin);
|
|
|
|
}
|
|
|
|
}
|
2007-12-24 18:27:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* free strings of open recent files */
|
|
|
|
static void free_openrecent(void)
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
struct RecentFile *recent;
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
for (recent = G.recent_files.first; recent; recent = recent->next) {
|
|
|
|
MEM_freeN(recent->filepath);
|
|
|
|
}
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BLI_freelistN(&(G.recent_files));
|
2007-12-24 18:27:28 +00:00
|
|
|
}
|
|
|
|
|
2012-09-16 00:26:36 +00:00
|
|
|
#ifdef WIN32
|
2012-07-27 10:48:33 +00:00
|
|
|
/* Read console events until there is a key event. Also returns on any error. */
|
2012-07-26 16:56:09 +00:00
|
|
|
static void wait_for_console_key(void)
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
HANDLE hConsoleInput = GetStdHandle(STD_INPUT_HANDLE);
|
|
|
|
|
|
|
|
if (!ELEM(hConsoleInput, NULL, INVALID_HANDLE_VALUE) && FlushConsoleInputBuffer(hConsoleInput)) {
|
|
|
|
for (;;) {
|
|
|
|
INPUT_RECORD buffer;
|
|
|
|
DWORD ignored;
|
|
|
|
|
|
|
|
if (!ReadConsoleInput(hConsoleInput, &buffer, 1, &ignored)) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (buffer.EventType == KEY_EVENT) {
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2012-07-26 16:56:09 +00:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2018-03-22 23:09:19 +01:00
|
|
|
static int wm_exit_handler(bContext *C, const wmEvent *event, void *userdata)
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
WM_exit(C);
|
2018-03-22 23:09:19 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
UNUSED_VARS(event, userdata);
|
|
|
|
return WM_UI_HANDLER_BREAK;
|
2018-03-22 23:09:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2019-04-20 10:02:28 +02:00
|
|
|
* Cause a delayed #WM_exit()
|
|
|
|
* call to avoid leaking memory when trying to exit from within operators.
|
2018-03-22 23:09:19 +01:00
|
|
|
*/
|
|
|
|
void wm_exit_schedule_delayed(const bContext *C)
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
/* What we do here is a little bit hacky, but quite simple and doesn't require bigger
|
|
|
|
* changes: Add a handler wrapping WM_exit() to cause a delayed call of it. */
|
2018-03-22 23:09:19 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
wmWindow *win = CTX_wm_window(C);
|
2018-03-22 23:09:19 +01:00
|
|
|
|
2019-04-20 10:02:28 +02:00
|
|
|
/* Use modal UI handler for now.
|
|
|
|
* Could add separate WM handlers or so, but probably not worth it. */
|
2019-04-17 06:17:24 +02:00
|
|
|
WM_event_add_ui_handler(C, &win->modalhandlers, wm_exit_handler, NULL, NULL, 0);
|
|
|
|
WM_event_add_mousemove(C); /* ensure handler actually gets called */
|
2018-03-22 23:09:19 +01:00
|
|
|
}
|
|
|
|
|
2016-01-24 14:25:01 +11:00
|
|
|
/**
|
|
|
|
* \note doesn't run exit() call #WM_exit() for that.
|
|
|
|
*/
|
2013-12-05 17:26:03 +11:00
|
|
|
void WM_exit_ext(bContext *C, const bool do_python)
|
2007-12-24 18:27:28 +00:00
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
wmWindowManager *wm = C ? CTX_wm_manager(C) : NULL;
|
2009-08-09 21:16:39 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* first wrap up running stuff, we assume only the active WM is running */
|
|
|
|
/* modal handlers are on window level freed, others too? */
|
|
|
|
/* note; same code copied in wm_files.c */
|
|
|
|
if (C && wm) {
|
|
|
|
wmWindow *win;
|
2012-08-15 10:12:41 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (!G.background) {
|
|
|
|
struct MemFile *undo_memfile = wm->undo_stack ?
|
|
|
|
ED_undosys_stack_memfile_get_active(wm->undo_stack) :
|
|
|
|
NULL;
|
|
|
|
if (undo_memfile != NULL) {
|
|
|
|
/* save the undo state as quit.blend */
|
|
|
|
Main *bmain = CTX_data_main(C);
|
|
|
|
char filename[FILE_MAX];
|
|
|
|
bool has_edited;
|
|
|
|
int fileflags = G.fileflags & ~(G_FILE_COMPRESS | G_FILE_HISTORY);
|
2014-10-10 11:48:48 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BLI_make_file_string("/", filename, BKE_tempdir_base(), BLENDER_QUIT_FILE);
|
Holiday coding log :)
Nice formatted version (pictures soon):
http://wiki.blender.org/index.php/Dev:Ref/Release_Notes/2.66/Usability
Short list of main changes:
- Transparent region option (over main region), added code to blend in/out such panels.
- Min size window now 640 x 480
- Fixed DPI for ui - lots of cleanup and changes everywhere. Icon image need correct size still, layer-in-use icon needs remake.
- Macbook retina support, use command line --no-native-pixels to disable it
- Timeline Marker label was drawing wrong
- Trackpad and magic mouse: supports zoom (hold ctrl)
- Fix for splash position: removed ghost function and made window size update after creation immediate
- Fast undo buffer save now adds UI as well. Could be checked for regular file save even...
Quit.blend and temp file saving use this now.
- Dixed filename in window on reading quit.blend or temp saves, and they now add a warning in window title: "(Recovered)"
- New Userpref option "Keep Session" - this always saves quit.blend, and loads on start.
This allows keeping UI and data without actual saves, until you actually save.
When you load startup.blend and quit, it recognises the quit.blend as a startup (no file name in header)
- Added 3D view copy/paste buffers (selected objects). Shortcuts ctrl-c, ctrl-v (OSX, cmd-c, cmd-v).
Coded partial file saving for it. Could be used for other purposes. Todo: use OS clipboards.
- User preferences (themes, keymaps, user settings) now can be saved as a separate file.
Old option is called "Save Startup File" the new one "Save User Settings".
To visualise this difference, the 'save startup file' button has been removed from user preferences window. That option is available as CTRL+U and in File menu still.
- OSX: fixed bug that stopped giving mouse events outside window.
This also fixes "Continuous Grab" for OSX. (error since 2009)
2012-12-12 18:58:11 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
has_edited = ED_editors_flush_edits(bmain, false);
|
2014-10-10 11:48:48 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if ((has_edited && BLO_write_file(bmain, filename, fileflags, NULL, NULL)) ||
|
|
|
|
(undo_memfile && BLO_memfile_write_file(undo_memfile, filename))) {
|
|
|
|
printf("Saved session recovery to '%s'\n", filename);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
WM_jobs_kill_all(wm);
|
2012-08-15 10:12:41 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
for (win = wm->windows.first; win; win = win->next) {
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
CTX_wm_window_set(C, win); /* needed by operator close callbacks */
|
|
|
|
WM_event_remove_handlers(C, &win->handlers);
|
|
|
|
WM_event_remove_handlers(C, &win->modalhandlers);
|
|
|
|
ED_screen_exit(C, win, WM_window_get_active_screen(win));
|
|
|
|
}
|
2019-05-10 18:29:58 +10:00
|
|
|
|
2019-05-11 21:03:28 +10:00
|
|
|
/* Disable until we have a revert button. */
|
|
|
|
#if 0
|
2019-05-10 18:29:58 +10:00
|
|
|
if (U.runtime.is_dirty) {
|
|
|
|
BKE_blendfile_userdef_write_all(NULL);
|
|
|
|
}
|
2019-05-11 21:03:28 +10:00
|
|
|
#endif
|
2019-04-17 06:17:24 +02:00
|
|
|
}
|
2012-12-29 10:24:42 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BLI_timer_free();
|
2018-11-26 20:25:15 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
WM_paneltype_clear();
|
2018-11-16 11:24:49 +11:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_addon_pref_type_free();
|
|
|
|
BKE_keyconfig_pref_type_free();
|
2018-11-16 11:24:49 +11:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
wm_operatortype_free();
|
|
|
|
wm_dropbox_free();
|
|
|
|
WM_menutype_free();
|
|
|
|
WM_uilisttype_free();
|
2018-03-19 14:17:59 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* all non-screen and non-space stuff editors did, like editmode */
|
|
|
|
if (C) {
|
|
|
|
Main *bmain = CTX_data_main(C);
|
|
|
|
ED_editors_exit(bmain, true);
|
|
|
|
}
|
2009-03-20 18:00:51 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
ED_undosys_type_free();
|
2018-03-19 14:17:59 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
free_openrecent();
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_mball_cubeTable_free();
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
/* render code might still access databases */
|
|
|
|
RE_FreeAllRender();
|
|
|
|
RE_engines_exit();
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
ED_preview_free_dbase(); /* frees a Main dbase, before BKE_blender_free! */
|
2009-08-02 11:32:03 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (C && wm) {
|
|
|
|
/* Before BKE_blender_free! - since the ListBases get freed there. */
|
|
|
|
wm_free_reports(C);
|
|
|
|
}
|
2009-12-17 16:28:45 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_sequencer_free_clipboard(); /* sequencer.c */
|
|
|
|
BKE_tracking_clipboard_free();
|
|
|
|
BKE_mask_clipboard_free();
|
|
|
|
BKE_vfont_clipboard_free();
|
|
|
|
BKE_node_clipboard_free();
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2012-08-13 10:56:36 +00:00
|
|
|
#ifdef WITH_COMPOSITOR
|
2019-04-17 06:17:24 +02:00
|
|
|
COM_deinitialize();
|
2012-08-13 10:56:36 +00:00
|
|
|
#endif
|
2018-02-22 12:39:57 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (opengl_is_init) {
|
2018-02-22 12:39:57 +01:00
|
|
|
#ifdef WITH_OPENSUBDIV
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_subsurf_osd_cleanup();
|
2018-02-22 12:39:57 +01:00
|
|
|
#endif
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
GPU_free_unused_buffers(G_MAIN);
|
|
|
|
}
|
|
|
|
|
|
|
|
BKE_blender_free(); /* blender.c, does entire library and spacetypes */
|
|
|
|
// free_matcopybuf();
|
|
|
|
ANIM_fcurves_copybuf_free();
|
|
|
|
ANIM_drivers_copybuf_free();
|
|
|
|
ANIM_driver_vars_copybuf_free();
|
|
|
|
ANIM_fmodifiers_copybuf_free();
|
|
|
|
ED_gpencil_anim_copybuf_free();
|
|
|
|
ED_gpencil_strokes_copybuf_free();
|
|
|
|
|
2019-04-20 10:02:28 +02:00
|
|
|
/* free gizmo-maps after freeing blender,
|
|
|
|
* so no deleted data get accessed during cleaning up of areas. */
|
2019-04-17 06:17:24 +02:00
|
|
|
wm_gizmomaptypes_free();
|
|
|
|
wm_gizmogrouptype_free();
|
|
|
|
wm_gizmotype_free();
|
|
|
|
|
|
|
|
BLF_exit();
|
|
|
|
|
|
|
|
if (opengl_is_init) {
|
|
|
|
DRW_opengl_context_enable_ex(false);
|
|
|
|
GPU_pass_cache_free();
|
|
|
|
GPU_exit();
|
|
|
|
DRW_opengl_context_disable_ex(false);
|
|
|
|
DRW_opengl_context_destroy();
|
|
|
|
}
|
2018-02-26 19:41:17 +01:00
|
|
|
|
2011-09-26 10:35:47 +00:00
|
|
|
#ifdef WITH_INTERNATIONAL
|
2019-04-17 06:17:24 +02:00
|
|
|
BLF_free_unifont();
|
|
|
|
BLF_free_unifont_mono();
|
|
|
|
BLT_lang_free();
|
2011-09-20 14:07:40 +00:00
|
|
|
#endif
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
ANIM_keyingset_infos_exit();
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
// free_txt_data();
|
2009-08-14 12:29:55 +00:00
|
|
|
|
2010-10-31 04:11:39 +00:00
|
|
|
#ifdef WITH_PYTHON
|
2019-04-17 06:17:24 +02:00
|
|
|
/* option not to close python so we can use 'atexit' */
|
|
|
|
if (do_python && ((C == NULL) || CTX_py_init_get(C))) {
|
|
|
|
/* XXX - old note */
|
|
|
|
/* before BKE_blender_free so py's gc happens while library still exists */
|
|
|
|
/* needed at least for a rare sigsegv that can happen in pydrivers */
|
|
|
|
|
2019-04-20 10:02:28 +02:00
|
|
|
/* Update for blender 2.5, move after BKE_blender_free because Blender now holds references to
|
|
|
|
* PyObject's so decref'ing them after python ends causes bad problems every time
|
|
|
|
* the py-driver bug can be fixed if it happens again we can deal with it then. */
|
2019-04-17 06:17:24 +02:00
|
|
|
BPY_python_end();
|
|
|
|
}
|
2011-09-30 07:47:45 +00:00
|
|
|
#else
|
2019-04-17 06:17:24 +02:00
|
|
|
(void)do_python;
|
2009-08-14 12:29:55 +00:00
|
|
|
#endif
|
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
ED_file_exit(); /* for fsmenu */
|
2009-01-06 14:42:54 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
UI_exit();
|
|
|
|
BKE_blender_userdef_data_free(&U, false);
|
2008-11-21 19:14:38 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
RNA_exit(); /* should be after BPY_python_end so struct python slots are cleared */
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
wm_ghost_exit();
|
2009-08-05 02:40:51 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
CTX_free(C);
|
2018-06-07 16:43:52 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
GHOST_DisposeSystemPaths();
|
2011-01-05 14:00:14 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
DNA_sdna_current_free();
|
2016-07-12 12:53:49 +10:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BLI_threadapi_exit();
|
2013-08-19 10:51:40 +00:00
|
|
|
|
2019-04-20 10:02:28 +02:00
|
|
|
/* No need to call this early, rather do it late so that other
|
|
|
|
* pieces of Blender using sound may exit cleanly, see also T50676. */
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_sound_exit();
|
2017-02-24 14:56:50 +01:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
CLG_exit();
|
2018-03-29 20:38:32 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_blender_atexit();
|
2016-06-24 10:05:18 +10:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
if (MEM_get_memory_blocks_in_use() != 0) {
|
|
|
|
size_t mem_in_use = MEM_get_memory_in_use() + MEM_get_memory_in_use();
|
|
|
|
printf("Error: Not freed memory blocks: %u, total unfreed memory %f MB\n",
|
|
|
|
MEM_get_memory_blocks_in_use(),
|
|
|
|
(double)mem_in_use / 1024 / 1024);
|
|
|
|
MEM_printmemlist();
|
|
|
|
}
|
|
|
|
wm_autosave_delete();
|
T39690: Modifications to Blender's 'temp dir' system.
Current temporary data of Blender suffers one major issue - default 'temp' dir on Windows is never
automatically cleaned up, and can end being quite big when used by Blender, especially when we have
to store per-process data (using getpid() in file names).
To address this, this patch:
* Divides tempdir paths in two, one for 'base' temp dir (the same as previous unique tempdir path),
the other is a mkdtemp-generated sub-dir, specific to each Blender instance.
* Only uses base tempdir when we need some shallow persistance accross Blender sessions - and we always
reuse the same filename (quit.blend...) or generate small file (crash reports...).
* Uses temp sub-dir for heavy files like pointcache or renderEXRs (Save Buffer option).
* Erases temp sub-dir on quit or crash.
To get this working it also adds a working 'recursive delete' to BLI_delete() under Windows.
Note that, as in current code, the 'recover render result' hack-feature that was possible
with SaveBuffer option is still removed. A real renderresult cache feature will be added
soon, though.
Reviewers: campbellbarton, brecht, sergey
Reviewed By: campbellbarton, sergey
CC: sergey
Differential Revision: https://developer.blender.org/D531
2014-06-23 13:42:19 +02:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
BKE_tempdir_session_purge();
|
2014-02-13 06:53:42 +11:00
|
|
|
}
|
|
|
|
|
2018-03-22 23:09:19 +01:00
|
|
|
/**
|
|
|
|
* \brief Main exit function to close Blender ordinarily.
|
2019-04-20 10:02:28 +02:00
|
|
|
* \note Use #wm_exit_schedule_delayed() to close Blender from an operator.
|
|
|
|
* Might leak memory otherwise.
|
2018-03-22 23:09:19 +01:00
|
|
|
*/
|
2014-02-13 06:53:42 +11:00
|
|
|
void WM_exit(bContext *C)
|
|
|
|
{
|
2019-04-17 06:17:24 +02:00
|
|
|
WM_exit_ext(C, 1);
|
2014-02-13 06:53:42 +11:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
printf("\nBlender quit\n");
|
2014-02-13 06:53:42 +11:00
|
|
|
|
|
|
|
#ifdef WIN32
|
2019-04-17 06:17:24 +02:00
|
|
|
/* ask user to press a key when in debug mode */
|
|
|
|
if (G.debug & G_DEBUG) {
|
|
|
|
printf("Press any key to exit . . .\n\n");
|
|
|
|
wait_for_console_key();
|
|
|
|
}
|
2014-02-13 06:53:42 +11:00
|
|
|
#endif
|
2007-12-24 18:27:28 +00:00
|
|
|
|
2019-04-17 06:17:24 +02:00
|
|
|
exit(G.is_break == true);
|
2011-09-20 12:22:19 +00:00
|
|
|
}
|