| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | // Copyright (C) 2003-2008 Dolphin Project.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 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, version 2.0.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 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 2.0 for more details.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // A copy of the GPL 2.0 should have been included with the program.
 | 
					
						
							|  |  |  | // If not, see http://www.gnu.org/licenses/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Official SVN repository and contact information can be found at
 | 
					
						
							|  |  |  | // http://code.google.com/p/dolphin-emu/
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Include
 | 
					
						
							| 
									
										
										
										
											2009-01-17 23:41:21 +00:00
										 |  |  | // ¯¯¯¯¯¯¯¯¯¯
 | 
					
						
							| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | #include "Common.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <wx/button.h>
 | 
					
						
							|  |  |  | #include <wx/textctrl.h>
 | 
					
						
							|  |  |  | #include <wx/textdlg.h>
 | 
					
						
							|  |  |  | #include <wx/listctrl.h>
 | 
					
						
							|  |  |  | #include <wx/thread.h>
 | 
					
						
							|  |  |  | #include <wx/mstream.h>
 | 
					
						
							|  |  |  | #include <wx/tipwin.h>
 | 
					
						
							| 
									
										
										
										
											2009-02-06 18:18:20 +00:00
										 |  |  | #include <wx/fontdlg.h>
 | 
					
						
							| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // ugly that this lib included code from the main
 | 
					
						
							|  |  |  | #include "../../DolphinWX/Src/Globals.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Host.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Debugger.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "RegisterWindow.h"
 | 
					
						
							|  |  |  | #include "LogWindow.h"
 | 
					
						
							|  |  |  | #include "BreakpointWindow.h"
 | 
					
						
							|  |  |  | #include "MemoryWindow.h"
 | 
					
						
							|  |  |  | #include "JitWindow.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "CodeWindow.h"
 | 
					
						
							|  |  |  | #include "CodeView.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "FileUtil.h"
 | 
					
						
							|  |  |  | #include "Core.h"
 | 
					
						
							|  |  |  | #include "HLE/HLE.h"
 | 
					
						
							|  |  |  | #include "Boot/Boot.h"
 | 
					
						
							|  |  |  | #include "LogManager.h"
 | 
					
						
							|  |  |  | #include "HW/CPU.h"
 | 
					
						
							|  |  |  | #include "PowerPC/PowerPC.h"
 | 
					
						
							|  |  |  | #include "Debugger/PPCDebugInterface.h"
 | 
					
						
							|  |  |  | #include "Debugger/Debugger_SymbolMap.h"
 | 
					
						
							|  |  |  | #include "PowerPC/PPCAnalyst.h"
 | 
					
						
							|  |  |  | #include "PowerPC/Profiler.h"
 | 
					
						
							|  |  |  | #include "PowerPC/SymbolDB.h"
 | 
					
						
							|  |  |  | #include "PowerPC/SignatureDB.h"
 | 
					
						
							|  |  |  | #include "PowerPC/PPCTables.h"
 | 
					
						
							|  |  |  | #include "PowerPC/Jit64/Jit.h"
 | 
					
						
							|  |  |  | #include "PowerPC/Jit64/JitCache.h" // for ClearCache()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-09 12:46:04 +00:00
										 |  |  | #include "PluginManager.h"
 | 
					
						
							| 
									
										
										
										
											2009-01-17 23:41:21 +00:00
										 |  |  | #include "ConfigManager.h"
 | 
					
						
							| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | extern "C"  // Bitmaps
 | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	#include "../resources/toolbar_play.c"
 | 
					
						
							|  |  |  | 	#include "../resources/toolbar_pause.c"
 | 
					
						
							|  |  |  | 	#include "../resources/toolbar_add_memorycheck.c"
 | 
					
						
							|  |  |  | 	#include "../resources/toolbar_delete.c"
 | 
					
						
							|  |  |  | 	#include "../resources/toolbar_add_breakpoint.c"
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ///////////////////////////////////
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CCodeWindow::CreateSymbolsMenu() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	wxMenu *pSymbolsMenu = new wxMenu; | 
					
						
							|  |  |  | 	pSymbolsMenu->Append(IDM_CLEARSYMBOLS, _T("&Clear symbols")); | 
					
						
							|  |  |  | 	// pSymbolsMenu->Append(IDM_CLEANSYMBOLS, _T("&Clean symbols (zz)"));
 | 
					
						
							|  |  |  | 	pSymbolsMenu->Append(IDM_SCANFUNCTIONS, _T("&Generate symbol map")); | 
					
						
							|  |  |  | 	pSymbolsMenu->AppendSeparator(); | 
					
						
							|  |  |  | 	pSymbolsMenu->Append(IDM_LOADMAPFILE, _T("&Load symbol map")); | 
					
						
							|  |  |  | 	pSymbolsMenu->Append(IDM_SAVEMAPFILE, _T("&Save symbol map")); | 
					
						
							|  |  |  | 	pSymbolsMenu->AppendSeparator(); | 
					
						
							|  |  |  | 	pSymbolsMenu->Append(IDM_SAVEMAPFILEWITHCODES, _T("Save code"), | 
					
						
							|  |  |  | 		wxString::FromAscii("Save the entire disassembled code. This may take a several seconds" | 
					
						
							|  |  |  | 		" and may require between 50 and 100 MB of hard drive space. It will only save code" | 
					
						
							|  |  |  | 		" that are in the first 4 MB of memory, if you are debugging a game that load .rel" | 
					
						
							|  |  |  | 		" files with code to memory you may want to increase that to perhaps 8 MB, you can do" | 
					
						
							|  |  |  | 		" that from SymbolDB::SaveMap().") | 
					
						
							| 
									
										
										
										
											2009-01-21 18:08:12 +00:00
										 |  |  | 		); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | 	pSymbolsMenu->AppendSeparator(); | 
					
						
							|  |  |  | 	pSymbolsMenu->Append(IDM_CREATESIGNATUREFILE, _T("&Create signature file...")); | 
					
						
							|  |  |  | 	pSymbolsMenu->Append(IDM_USESIGNATUREFILE, _T("&Use signature file...")); | 
					
						
							|  |  |  | 	pSymbolsMenu->AppendSeparator(); | 
					
						
							|  |  |  | 	pSymbolsMenu->Append(IDM_PATCHHLEFUNCTIONS, _T("&Patch HLE functions")); | 
					
						
							|  |  |  | 	pMenuBar->Append(pSymbolsMenu, _T("&Symbols")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	wxMenu *pJitMenu = new wxMenu; | 
					
						
							|  |  |  | 	pJitMenu->Append(IDM_CLEARCODECACHE, _T("&Clear code cache")); | 
					
						
							|  |  |  | 	pJitMenu->Append(IDM_LOGINSTRUCTIONS, _T("&Log JIT instruction coverage")); | 
					
						
							|  |  |  | 	pMenuBar->Append(pJitMenu, _T("&JIT")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	wxMenu *pProfilerMenu = new wxMenu; | 
					
						
							|  |  |  | 	pProfilerMenu->Append(IDM_PROFILEBLOCKS, _T("&Profile blocks"), wxEmptyString, wxITEM_CHECK); | 
					
						
							|  |  |  | 	pProfilerMenu->AppendSeparator(); | 
					
						
							|  |  |  | 	pProfilerMenu->Append(IDM_WRITEPROFILE, _T("&Write to profile.txt, show")); | 
					
						
							|  |  |  | 	pMenuBar->Append(pProfilerMenu, _T("&Profiler")); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CCodeWindow::OnProfilerMenu(wxCommandEvent& event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (Core::GetState() == Core::CORE_RUN) { | 
					
						
							|  |  |  | 		event.Skip(); | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	switch (event.GetId()) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	case IDM_PROFILEBLOCKS: | 
					
						
							|  |  |  | 		jit.ClearCache(); | 
					
						
							|  |  |  | 		Profiler::g_ProfileBlocks = GetMenuBar()->IsChecked(IDM_PROFILEBLOCKS); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case IDM_WRITEPROFILE: | 
					
						
							|  |  |  | 		Profiler::WriteProfileResults("profiler.txt"); | 
					
						
							|  |  |  | 		File::Launch("profiler.txt"); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-01-15 06:48:15 +00:00
										 |  |  | void CCodeWindow::OnSymbolsMenu(wxCommandEvent& event) | 
					
						
							| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	if (Core::GetState() == Core::CORE_UNINITIALIZED) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// TODO: disable menu items instead :P
 | 
					
						
							|  |  |  | 		return; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	std::string mapfile = CBoot::GenerateMapFilename(); | 
					
						
							|  |  |  | 	switch (event.GetId()) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 	case IDM_CLEARSYMBOLS: | 
					
						
							|  |  |  | 		g_symbolDB.Clear(); | 
					
						
							|  |  |  | 		Host_NotifyMapLoaded(); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case IDM_CLEANSYMBOLS: | 
					
						
							|  |  |  | 		g_symbolDB.Clear("zz"); | 
					
						
							|  |  |  | 		Host_NotifyMapLoaded(); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case IDM_SCANFUNCTIONS: | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		PPCAnalyst::FindFunctions(0x80000000, 0x80400000, &g_symbolDB); | 
					
						
							|  |  |  | 		SignatureDB db; | 
					
						
							|  |  |  | 		if (db.Load(TOTALDB_FILE)) | 
					
						
							|  |  |  | 			db.Apply(&g_symbolDB); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// HLE::PatchFunctions();
 | 
					
						
							|  |  |  | 		NotifyMapLoaded(); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	case IDM_LOADMAPFILE: | 
					
						
							|  |  |  | 		if (!File::Exists(mapfile.c_str())) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			g_symbolDB.Clear(); | 
					
						
							|  |  |  | 			PPCAnalyst::FindFunctions(0x80000000, 0x80400000, &g_symbolDB); | 
					
						
							|  |  |  | 			SignatureDB db; | 
					
						
							|  |  |  | 			if (db.Load(TOTALDB_FILE)) | 
					
						
							|  |  |  | 				db.Apply(&g_symbolDB); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			g_symbolDB.LoadMap(mapfile.c_str()); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		NotifyMapLoaded(); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case IDM_SAVEMAPFILE: | 
					
						
							|  |  |  | 		g_symbolDB.SaveMap(mapfile.c_str()); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case IDM_SAVEMAPFILEWITHCODES: | 
					
						
							|  |  |  | 		g_symbolDB.SaveMap(mapfile.c_str(), true); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case IDM_CREATESIGNATUREFILE: | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		wxTextEntryDialog input_prefix(this, wxString::FromAscii("Only export symbols with prefix:"), wxGetTextFromUserPromptStr, _T(".")); | 
					
						
							|  |  |  | 		if (input_prefix.ShowModal() == wxID_OK) { | 
					
						
							|  |  |  | 			std::string prefix(input_prefix.GetValue().mb_str()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			wxString path = wxFileSelector( | 
					
						
							|  |  |  | 					_T("Save signature as"), wxEmptyString, wxEmptyString, wxEmptyString, | 
					
						
							|  |  |  | 					_T("Dolphin Signature File (*.dsy)|*.dsy;"), wxFD_SAVE, | 
					
						
							|  |  |  | 					this); | 
					
						
							|  |  |  | 			if (path) { | 
					
						
							|  |  |  | 				SignatureDB db; | 
					
						
							|  |  |  | 				db.Initialize(&g_symbolDB, prefix.c_str()); | 
					
						
							|  |  |  | 				std::string filename(path.ToAscii());		// PPCAnalyst::SaveSignatureDB(
 | 
					
						
							|  |  |  | 				db.Save(path.ToAscii()); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case IDM_USESIGNATUREFILE: | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 		wxString path = wxFileSelector( | 
					
						
							|  |  |  | 				_T("Apply signature file"), wxEmptyString, wxEmptyString, wxEmptyString, | 
					
						
							|  |  |  | 				_T("Dolphin Signature File (*.dsy)|*.dsy;"), wxFD_OPEN | wxFD_FILE_MUST_EXIST, | 
					
						
							|  |  |  | 				this); | 
					
						
							|  |  |  | 		if (path) { | 
					
						
							|  |  |  | 			SignatureDB db; | 
					
						
							|  |  |  | 			db.Load(path.ToAscii()); | 
					
						
							|  |  |  | 			db.Apply(&g_symbolDB); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		NotifyMapLoaded(); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	case IDM_PATCHHLEFUNCTIONS: | 
					
						
							|  |  |  | 		HLE::PatchFunctions(); | 
					
						
							|  |  |  | 		Update(); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CCodeWindow::NotifyMapLoaded() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	g_symbolDB.FillInCallers(); | 
					
						
							| 
									
										
										
										
											2009-01-21 18:08:12 +00:00
										 |  |  | 	//symbols->Show(false); // hide it for faster filling
 | 
					
						
							|  |  |  | 	symbols->Freeze();	// HyperIris: wx style fast filling
 | 
					
						
							| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | 	symbols->Clear(); | 
					
						
							|  |  |  | 	for (SymbolDB::XFuncMap::iterator iter = g_symbolDB.GetIterator(); iter != g_symbolDB.End(); iter++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		int idx = symbols->Append(wxString::FromAscii(iter->second.name.c_str())); | 
					
						
							|  |  |  | 		symbols->SetClientData(idx, (void*)&iter->second); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2009-01-21 18:08:12 +00:00
										 |  |  | 	symbols->Thaw(); | 
					
						
							|  |  |  | 	//symbols->Show(true);
 | 
					
						
							| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | 	Update(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CCodeWindow::OnSymbolListChange(wxCommandEvent& event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int index = symbols->GetSelection(); | 
					
						
							|  |  |  | 	if (index >= 0) { | 
					
						
							|  |  |  | 		Symbol* pSymbol = static_cast<Symbol *>(symbols->GetClientData(index)); | 
					
						
							|  |  |  | 		if (pSymbol != NULL) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			if(pSymbol->type == Symbol::SYMBOL_DATA) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				if(m_MemoryWindow && m_MemoryWindow->IsVisible()) | 
					
						
							|  |  |  | 					m_MemoryWindow->JumpToAddress(pSymbol->address); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				JumpToAddress(pSymbol->address); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CCodeWindow::OnSymbolListContextMenu(wxContextMenuEvent& event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Show and hide windows
 | 
					
						
							|  |  |  | /////////////////////////////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | void CCodeWindow::OnToggleLogWindow(wxCommandEvent& event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (LogManager::Enabled()) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		bool show = GetMenuBar()->IsChecked(event.GetId()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (show) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			if (!m_LogWindow) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				m_LogWindow = new CLogWindow(this); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			m_LogWindow->Show(true); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else // hide
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			// If m_dialog is NULL, then possibly the system
 | 
					
						
							|  |  |  | 			// didn't report the checked menu item status correctly.
 | 
					
						
							|  |  |  | 			// It should be true just after the menu item was selected,
 | 
					
						
							|  |  |  | 			// if there was no modeless dialog yet.
 | 
					
						
							|  |  |  | 			wxASSERT(m_LogWindow != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (m_LogWindow) | 
					
						
							|  |  |  | 			{ | 
					
						
							|  |  |  | 				m_LogWindow->Hide(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CCodeWindow::OnToggleRegisterWindow(wxCommandEvent& event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	bool show = GetMenuBar()->IsChecked(event.GetId()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (show) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (!m_RegisterWindow) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			m_RegisterWindow = new CRegisterWindow(this); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		m_RegisterWindow->Show(true); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else // hide
 | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// If m_dialog is NULL, then possibly the system
 | 
					
						
							|  |  |  | 		// didn't report the checked menu item status correctly.
 | 
					
						
							|  |  |  | 		// It should be true just after the menu item was selected,
 | 
					
						
							|  |  |  | 		// if there was no modeless dialog yet.
 | 
					
						
							|  |  |  | 		wxASSERT(m_RegisterWindow != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (m_RegisterWindow) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			m_RegisterWindow->Hide(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // =======================================================================================
 | 
					
						
							|  |  |  | // Toggle Sound Debugging Window
 | 
					
						
							|  |  |  | // ------------
 | 
					
						
							|  |  |  | void CCodeWindow::OnToggleSoundWindow(wxCommandEvent& event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	bool show = GetMenuBar()->IsChecked(event.GetId()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (show) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// TODO: add some kind of if() check here to?
 | 
					
						
							|  |  |  | 		CPluginManager::GetInstance().OpenDebug( | 
					
						
							|  |  |  | 			GetHandle(), | 
					
						
							|  |  |  | 			SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDSPPlugin.c_str(), | 
					
						
							| 
									
										
										
										
											2009-01-15 06:48:15 +00:00
										 |  |  | 			PLUGIN_TYPE_DSP, true // DSP, show
 | 
					
						
							| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | 			); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else // hide
 | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// Close the sound dll that has an open debugger
 | 
					
						
							|  |  |  | 		CPluginManager::GetInstance().OpenDebug( | 
					
						
							|  |  |  | 			GetHandle(), | 
					
						
							|  |  |  | 			SConfig::GetInstance().m_LocalCoreStartupParameter.m_strDSPPlugin.c_str(), | 
					
						
							| 
									
										
										
										
											2009-01-15 06:48:15 +00:00
										 |  |  | 			PLUGIN_TYPE_DSP, false // DSP, hide
 | 
					
						
							| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | 			); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | // ===========
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // =======================================================================================
 | 
					
						
							|  |  |  | // Toggle Video Debugging Window
 | 
					
						
							|  |  |  | // ------------
 | 
					
						
							|  |  |  | void CCodeWindow::OnToggleVideoWindow(wxCommandEvent& event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	bool show = GetMenuBar()->IsChecked(event.GetId()); | 
					
						
							|  |  |  | 	//GetMenuBar()->Check(event.GetId(), false); // Turn off
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (show) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// It works now, but I'll keep this message in case the problem reappears
 | 
					
						
							|  |  |  | 		/*if(Core::GetState() == Core::CORE_UNINITIALIZED)
 | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			wxMessageBox(_T("Warning, opening this window before a game is started \n\
 | 
					
						
							| 
									
										
										
										
											2009-01-15 06:48:15 +00:00
										 |  |  | may cause a crash when a game is later started. Todo: figure out why and fix it."), wxT("OpenGL Debugging Window")); | 
					
						
							| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | 		}*/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// TODO: add some kind of if() check here to?
 | 
					
						
							|  |  |  | 		CPluginManager::GetInstance().OpenDebug( | 
					
						
							|  |  |  | 		GetHandle(), | 
					
						
							|  |  |  | 		SConfig::GetInstance().m_LocalCoreStartupParameter.m_strVideoPlugin.c_str(), | 
					
						
							| 
									
										
										
										
											2009-01-15 06:48:15 +00:00
										 |  |  | 		PLUGIN_TYPE_VIDEO, true // Video, show
 | 
					
						
							| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | 		); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else // hide
 | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// Close the video dll that has an open debugger
 | 
					
						
							|  |  |  | 		CPluginManager::GetInstance().OpenDebug( | 
					
						
							|  |  |  | 			GetHandle(), | 
					
						
							|  |  |  | 			SConfig::GetInstance().m_LocalCoreStartupParameter.m_strVideoPlugin.c_str(), | 
					
						
							| 
									
										
										
										
											2009-01-15 06:48:15 +00:00
										 |  |  | 			PLUGIN_TYPE_VIDEO, false // Video, hide
 | 
					
						
							| 
									
										
										
										
											2009-01-05 03:01:22 +00:00
										 |  |  | 			); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | // ===========
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CCodeWindow::OnToggleJitWindow(wxCommandEvent& event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	bool show = GetMenuBar()->IsChecked(event.GetId()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (show) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (!m_JitWindow) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			m_JitWindow = new CJitWindow(this); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		m_JitWindow->Show(true); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else // hide
 | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// If m_dialog is NULL, then possibly the system
 | 
					
						
							|  |  |  | 		// didn't report the checked menu item status correctly.
 | 
					
						
							|  |  |  | 		// It should be true just after the menu item was selected,
 | 
					
						
							|  |  |  | 		// if there was no modeless dialog yet.
 | 
					
						
							|  |  |  | 		wxASSERT(m_JitWindow != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (m_JitWindow) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			m_JitWindow->Hide(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CCodeWindow::OnToggleBreakPointWindow(wxCommandEvent& event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	bool show = GetMenuBar()->IsChecked(event.GetId()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (show) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (!m_BreakpointWindow) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			m_BreakpointWindow = new CBreakPointWindow(this, this); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		m_BreakpointWindow->Show(true); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else // hide
 | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// If m_dialog is NULL, then possibly the system
 | 
					
						
							|  |  |  | 		// didn't report the checked menu item status correctly.
 | 
					
						
							|  |  |  | 		// It should be true just after the menu item was selected,
 | 
					
						
							|  |  |  | 		// if there was no modeless dialog yet.
 | 
					
						
							|  |  |  | 		wxASSERT(m_BreakpointWindow != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (m_BreakpointWindow) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			m_BreakpointWindow->Hide(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void CCodeWindow::OnToggleMemoryWindow(wxCommandEvent& event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	bool show = GetMenuBar()->IsChecked(event.GetId()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (show) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		if (!m_MemoryWindow) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			m_MemoryWindow = new CMemoryWindow(this); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		m_MemoryWindow->Show(true); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else // hide
 | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		// If m_dialog is NULL, then possibly the system
 | 
					
						
							|  |  |  | 		// didn't report the checked menu item status correctly.
 | 
					
						
							|  |  |  | 		// It should be true just after the menu item was selected,
 | 
					
						
							|  |  |  | 		// if there was no modeless dialog yet.
 | 
					
						
							|  |  |  | 		wxASSERT(m_MemoryWindow != NULL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if (m_MemoryWindow) | 
					
						
							|  |  |  | 		{ | 
					
						
							|  |  |  | 			m_MemoryWindow->Hide(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2009-02-06 18:18:20 +00:00
										 |  |  | //////////////////////////////////////////////////////////////////////////
 | 
					
						
							|  |  |  | // Change the global DebuggerFont
 | 
					
						
							|  |  |  | void CCodeWindow::OnChangeFont(wxCommandEvent& event) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	wxFontData data; | 
					
						
							|  |  |  | 	data.SetInitialFont(GetFont()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	wxFontDialog dialog(this, data); | 
					
						
							|  |  |  | 	if ( dialog.ShowModal() == wxID_OK ) | 
					
						
							|  |  |  | 		DebuggerFont = dialog.GetFontData().GetChosenFont(); | 
					
						
							|  |  |  | } |