diff options
Diffstat (limited to 'source/blender/windowmanager/intern/wm_init_exit.c')
-rw-r--r-- | source/blender/windowmanager/intern/wm_init_exit.c | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/source/blender/windowmanager/intern/wm_init_exit.c b/source/blender/windowmanager/intern/wm_init_exit.c new file mode 100644 index 00000000000..db37f0754a0 --- /dev/null +++ b/source/blender/windowmanager/intern/wm_init_exit.c @@ -0,0 +1,286 @@ +/** + * $Id: + * + * ***** BEGIN GPL LICENSE BLOCK ***** + * + * 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 + * of the License, or (at your option) any later version. + * + * 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, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2007 Blender Foundation. + * All rights reserved. + * + * + * Contributor(s): Blender Foundation + * + * ***** END GPL LICENSE BLOCK ***** + */ + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> + +#include "MEM_guardedalloc.h" +#include "MEM_CacheLimiterC-Api.h" + +#include "IMB_imbuf_types.h" +#include "IMB_imbuf.h" + +#include "DNA_object_types.h" +#include "DNA_scene_types.h" +#include "DNA_sound_types.h" +#include "DNA_userdef_types.h" +#include "DNA_windowmanager_types.h" + +#include "BKE_blender.h" +#include "BKE_curve.h" +#include "BKE_displist.h" +#include "BKE_DerivedMesh.h" +#include "BKE_font.h" +#include "BKE_global.h" +#include "BKE_library.h" +#include "BKE_mball.h" +#include "BKE_utildefines.h" +#include "BKE_packedFile.h" + +#include "BMF_Api.h" +#ifdef INTERNATIONAL +#include "FTF_Api.h" +#endif + +#include "BLI_blenlib.h" + +#include "RE_pipeline.h" /* RE_ free stuff */ + +#include "radio.h" + +#include "BPY_extern.h" + +#include "SYS_System.h" + +#include "UI_interface.h" + +#include "RNA_define.h" + +#include "WM_api.h" +#include "WM_types.h" +#include "wm_event_system.h" +#include "wm.h" +#include "wm_files.h" +#include "wm_window.h" + +#include "ED_screen.h" + +static void initbuttons(void) +{ + UI_init(); + +// glClearColor(.7f, .7f, .6f, 0.0); + + G.font= BMF_GetFont(BMF_kHelvetica12); + G.fonts= BMF_GetFont(BMF_kHelvetica10); + G.fontss= BMF_GetFont(BMF_kHelveticaBold8); + +// clear_matcopybuf(); /* XXX */ + +// glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); +} + +/* XXX */ +static void sound_init_listener(void) +{ + G.listener = MEM_callocN(sizeof(bSoundListener), "soundlistener"); + G.listener->gain = 1.0; + G.listener->dopplerfactor = 1.0; + G.listener->dopplervelocity = 340.29f; +} + +/* only called once, for startup */ +void WM_init(bContext *C) +{ + + wm_ghost_init(C); /* note: it assigns C to ghost! */ + wm_operatortype_init(); + + set_free_windowmanager_cb(wm_close_and_free); /* library.c */ + + ED_spacetypes_init(); /* editors/area/spacetype.c */ + + /* get the default database, plus a wm */ + WM_read_homefile(C, 0); + + wm_check(C); /* opens window(s), checks keymaps */ + +// initscreen(); /* for (visual) speed, this first, then setscreen */ + initbuttons(); +// InitCursorData(); + sound_init_listener(); +// init_node_butfuncs(); + +// XXX BIF_preview_init_dbase(); + +// XXX UI_filelist_init_icons(); + +// init_gl_stuff(); /* drawview.c, after homefile */ + read_Blog(); + BLI_strncpy(G.lib, G.sce, FILE_MAX); +} + +/* free strings of open recent files */ +static void free_openrecent(void) +{ + struct RecentFile *recent; + + for(recent = G.recent_files.first; recent; recent=recent->next) + MEM_freeN(recent->filename); + + BLI_freelistN(&(G.recent_files)); +} + + +/* bad stuff*/ + +extern ListBase editNurb; +extern ListBase editelems; +extern wchar_t *copybuf; +extern wchar_t *copybufinfo; + +/* called in creator.c even... tsk, split this! */ +void WM_exit(bContext *C) +{ + wmWindow *win; + + /* first wrap up running stuff, we assume only the active WM is running */ + /* modal handlers are on window level freed, others too? */ + if(C && C->wm) { + for(win= C->wm->windows.first; win; win= win->next) { + ARegion *ar; + + C->window= win; /* needed by operator close callbacks */ + WM_event_remove_handlers(C, &win->handlers); + + for(ar= win->screen->regionbase.first; ar; ar= ar->next) + WM_event_remove_handlers(C, &ar->handlers); + + ED_screen_exit(C, win, win->screen); + } + } + wm_operatortype_free(); + + free_ttfont(); /* bke_font.h */ + +#ifdef WITH_VERSE + end_all_verse_sessions(); +#endif + free_openrecent(); + + freeAllRad(); + BKE_freecubetable(); + +// if (G.background == 0) +// sound_end_all_sounds(); + + if(G.obedit) { + if(G.obedit->type==OB_FONT) { +// free_editText(); + } +// else if(G.obedit->type==OB_MBALL) BLI_freelistN(&editelems); +// free_editMesh(G.editMesh); + } + +// free_editLatt(); +// free_editArmature(); +// free_posebuf(); + + /* before free_blender so py's gc happens while library still exists */ + /* needed at least for a rare sigsegv that can happen in pydrivers */ +// BPY_end_python(); + +// fastshade_free_render(); /* shaded view */ + free_blender(); /* blender.c, does entire library */ +// free_matcopybuf(); +// free_ipocopybuf(); +// free_actcopybuf(); +// free_vertexpaint(); +// free_imagepaint(); + + /* editnurb can remain to exist outside editmode */ + freeNurblist(&editNurb); + +// fsmenu_free(); + +#ifdef INTERNATIONAL +// free_languagemenu(); +#endif + + RE_FreeAllRender(); + +// free_txt_data(); + +// sound_exit_audio(); + if(G.listener) MEM_freeN(G.listener); + + + libtiff_exit(); + +#ifdef WITH_QUICKTIME + quicktime_exit(); +#endif + + if (!G.background) { +// XXX UI_filelist_free_icons(); + } + +#ifdef INTERNATIONAL + FTF_End(); +#endif + +// if (copybuf) MEM_freeN(copybuf); +// if (copybufinfo) MEM_freeN(copybufinfo); + + /* undo free stuff */ +// undo_editmode_clear(); + + BKE_undo_save_quit(); // saves quit.blend if global undo is on + BKE_reset_undo(); + + UI_exit(); + BLI_freelistN(&U.themes); +// XXX BIF_preview_free_dbase(); + + RNA_exit(); + + MEM_freeN(C); + + if(MEM_get_memory_blocks_in_use()!=0) { + printf("Error Totblock: %d\n", MEM_get_memory_blocks_in_use()); + MEM_printmemlist(); + } +// delete_autosave(); + + printf("\nBlender quit\n"); + +#ifdef WIN32 + /* ask user to press enter when in debug mode */ + if(G.f & G_DEBUG) { + printf("press enter key to exit...\n\n"); + getchar(); + } +#endif + + + SYS_DeleteSystem(SYS_GetSystem()); + + exit(G.afbreek==1); +} + |