diff --git a/Source/Core/Common/Src/ConsoleListener.cpp b/Source/Core/Common/Src/ConsoleListener.cpp index 7419c86b40..b5ce181d25 100644 --- a/Source/Core/Common/Src/ConsoleListener.cpp +++ b/Source/Core/Common/Src/ConsoleListener.cpp @@ -47,14 +47,29 @@ ConsoleListener::~ConsoleListener() void ConsoleListener::Open(int Width, int Height, const char *Title) { #ifdef _WIN32 - // Open the console window and create the window handle for GetStdHandle() - AllocConsole(); - // Save the window handle that AllocConsole() created + if (!GetConsoleWindow()) + { + // Open the console window and create the window handle for GetStdHandle() + AllocConsole(); + // Save the window handle that AllocConsole() created + hConsole = GetStdHandle(STD_OUTPUT_HANDLE); + // Set the console window title + SetConsoleTitle(Title); + // Set letter space + LetterSpace(80, 1000); + MoveWindow(GetConsoleWindow(), 200,200, 800,800, true); + } + else + { + hConsole = GetStdHandle(STD_OUTPUT_HANDLE); + } +#endif +} + +void ConsoleListener::UpdateHandle() +{ +#ifdef _WIN32 hConsole = GetStdHandle(STD_OUTPUT_HANDLE); - // Set the console window title - SetConsoleTitle(Title); - // Set letter space - LetterSpace(80, 4000); #endif } @@ -271,7 +286,7 @@ void ConsoleListener::Log(LogTypes::LOG_LEVELS Level, const char *Text) Color = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE; break; } - if (strlen(Text) > 10) + if (Level != CUSTOM_LEVEL && strlen(Text) > 10) { // First 10 chars white SetConsoleTextAttribute(hConsole, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); diff --git a/Source/Core/Common/Src/Log.h b/Source/Core/Common/Src/Log.h index a24f7e65f0..16c3ee9ed9 100644 --- a/Source/Core/Common/Src/Log.h +++ b/Source/Core/Common/Src/Log.h @@ -23,6 +23,7 @@ #define WARNING_LEVEL 3 // Something is suspicious. #define INFO_LEVEL 4 // General information. #define DEBUG_LEVEL 5 // Detailed debugging - might make things slow. +#define CUSTOM_LEVEL 6 // Custom level, no text formatting namespace LogTypes { @@ -81,6 +82,7 @@ enum LOG_LEVELS { LWARNING = WARNING_LEVEL, LINFO = INFO_LEVEL, LDEBUG = DEBUG_LEVEL, + LCUSTOM = CUSTOM_LEVEL }; } // namespace diff --git a/Source/Core/Common/Src/LogManager.h b/Source/Core/Common/Src/LogManager.h index 6a4c9ca46d..b41dbe1b59 100644 --- a/Source/Core/Common/Src/LogManager.h +++ b/Source/Core/Common/Src/LogManager.h @@ -73,8 +73,8 @@ public: ConsoleListener(); ~ConsoleListener(); - void Open(int Width = 100, int Height = 100, - const char * Name = "Console"); + void Open(int Width = 100, int Height = 100, const char * Name = "Console"); + void UpdateHandle(); void Close(); bool IsOpen(); void LetterSpace(int Width, int Height); diff --git a/Source/Core/DebuggerWX/Src/CodeWindow.cpp b/Source/Core/DebuggerWX/Src/CodeWindow.cpp index cadc9b4ae7..db31ea012d 100644 --- a/Source/Core/DebuggerWX/Src/CodeWindow.cpp +++ b/Source/Core/DebuggerWX/Src/CodeWindow.cpp @@ -174,7 +174,9 @@ CCodeWindow::CCodeWindow(const SCoreStartupParameter& _LocalCoreStartupParameter } CCodeWindow::~CCodeWindow() { - Parent->g_pCodeWindow = NULL; + //if (Parent) Parent->g_pCodeWindow = NULL; + //ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); + //Console->Log(LogTypes::LERROR, StringFromFormat(" >>> CCodeWindow Destroyed\n").c_str()); } // Redirect old wxFrame calls wxMenuBar *CCodeWindow::GetMenuBar() diff --git a/Source/Core/DebuggerWX/Src/CodeWindowFunctions.cpp b/Source/Core/DebuggerWX/Src/CodeWindowFunctions.cpp index c6983c55a2..21bda68a7f 100644 --- a/Source/Core/DebuggerWX/Src/CodeWindowFunctions.cpp +++ b/Source/Core/DebuggerWX/Src/CodeWindowFunctions.cpp @@ -418,6 +418,20 @@ void CCodeWindow::OnToggleMemoryWindow(bool Show, int i) #endif } + + +/* + + + +Notice: This windows docking for plugin windows will produce several wx debugging messages when +::GetWindowRect and ::DestroyWindow fails in wxApp::CleanUp() for the plugin. + + + +*/ + + //Toggle Sound Debugging Window void CCodeWindow::OnToggleSoundWindow(bool Show, int i) { @@ -446,13 +460,10 @@ void CCodeWindow::OnToggleSoundWindow(bool Show, int i) Win = Parent->GetWxWindow(wxT("Sound")); if (Win) { - //Parent->ListChildren(); Win->SetName(wxT("Sound")); Win->Reparent(Parent); - //Console->Log(LogTypes::LNOTICE, StringFromFormat("Reparent\n").c_str()); - //Parent->ListChildren(); Parent->GetNotebook(i)->AddPage(Win, wxT("Sound"), true, Parent->aNormalFile ); - Console->Log(LogTypes::LNOTICE, StringFromFormat("AddPage\n").c_str()); + //Console->Log(LogTypes::LNOTICE, StringFromFormat("AddPage\n").c_str()); //Parent->ListChildren(); //Console->Log(LogTypes::LNOTICE, StringFromFormat("OpenDebug: Win %i\n", FindWindowByName(wxT("Sound"))).c_str()); } @@ -466,7 +477,15 @@ void CCodeWindow::OnToggleSoundWindow(bool Show, int i) { #ifdef _WIN32 wxWindow *Win = Parent->GetWxWindow(wxT("Sound")); - Parent->DoRemovePage(Win, false); + if (Win) + { + Parent->DoRemovePage(Win, false); + //Console->Log(LogTypes::LNOTICE, StringFromFormat("Sound removed from NB (Win %i)\n", FindWindowByName(wxT("Sound"))).c_str()); + } + else + { + //Console->Log(LogTypes::LNOTICE, StringFromFormat("Sound not found (Win %i)\n", FindWindowByName(wxT("Sound"))).c_str()); + } #endif // Close the sound dll that has an open debugger CPluginManager::GetInstance().OpenDebug( diff --git a/Source/Core/DolphinWX/Src/Frame.cpp b/Source/Core/DolphinWX/Src/Frame.cpp index 0333d3f40f..8f44a1f69f 100644 --- a/Source/Core/DolphinWX/Src/Frame.cpp +++ b/Source/Core/DolphinWX/Src/Frame.cpp @@ -17,16 +17,22 @@ -/* +////////////////////////////////////////////////////////////////////////////////////////// +// Windows +/* ŻŻŻŻŻŻŻŻŻŻŻŻŻŻ -CFrame is the main parent window. Inside CFrame there is an m_Panel that is the -parent for the rendering window (when we render to the main window). In Windows -the rendering window is created by giving CreateWindow() m_Panel->GetHandle() -as parent window and creating a new child window to m_Panel. The new child -window handle that is returned by CreateWindow() can be accessed from -Core::GetWindowHandle(). -*/ +CFrame is the main parent window. Inside CFrame there is an m_Panel that is the parent for +the rendering window (when we render to the main window). In Windows the rendering window is +created by giving CreateWindow() m_Panel->GetHandle() as parent window and creating a new +child window to m_Panel. The new child window handle that is returned by CreateWindow() can +be accessed from Core::GetWindowHandle(). +///////////////////////////////////////////////*/ + + +// ---------------------------------------------------------------------------- +// includes +// ---------------------------------------------------------------------------- #include "Common.h" // Common #include "FileUtil.h" @@ -51,6 +57,10 @@ Core::GetWindowHandle(). #include // wxWidgets +// ---------------------------------------------------------------------------- +// resources +// ---------------------------------------------------------------------------- + extern "C" { #include "../resources/Dolphin.c" // Dolphin icon #include "../resources/toolbar_browse.c" @@ -72,10 +82,10 @@ extern "C" { }; -/* Windows functions. Setting the cursor with wxSetCursor() did not work in - this instance. Probably because it's somehow reset from the WndProc() in - the child window */ - +///////////////////////////////////////////////////////////////////////////////////////////////////////// +/* Windows functions. Setting the cursor with wxSetCursor() did not work in this instance. + Probably because it's somehow reset from the WndProc() in the child window */ +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻ #ifdef _WIN32 // Declare a blank icon and one that will be the normal cursor HCURSOR hCursor = NULL, hCursorBlank = NULL; @@ -103,7 +113,13 @@ HWND MSWGetParent_(HWND Parent) return GetParent(Parent); } #endif +///////////////////////////////////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +/* The CPanel class to receive MSWWindowProc messages from the video plugin. */ +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻ extern CFrame* main_frame; class CPanel : public wxPanel @@ -177,8 +193,9 @@ int abc = 0; Core::ReconnectWiimote(); return 0; + // ----------------------------------------- #ifdef RERECORDING - + // ----------------- case INPUT_FRAME_COUNTER: // Wind back the frame counter after a save state has been loaded Core::WindBack((int)lParam); @@ -196,6 +213,12 @@ int abc = 0; return wxPanel::MSWWindowProc(nMsg, wParam, lParam); } #endif +///////////////////////////////////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// event tables +// ---------------------------- // Notice that wxID_HELP will be processed for the 'About' menu and the toolbar // help button. @@ -288,8 +311,12 @@ EVT_AUINOTEBOOK_ALLOW_DND(wxID_ANY, CFrame::OnAllowNotebookDnD) EVT_AUINOTEBOOK_PAGE_CHANGED(wxID_ANY, CFrame::OnNotebookPageChanged) END_EVENT_TABLE() +///////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Creation and close, quit functions +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ CFrame::CFrame(bool showLogWindow, wxFrame* parent, wxWindowID id, @@ -300,7 +327,7 @@ CFrame::CFrame(bool showLogWindow, long style) : wxFrame(parent, id, title, pos, size, style) , UseDebugger(_UseDebugger), m_LogWindow(NULL) - , m_pStatusBar(NULL), bRenderToMain(true), HaveLeds(false) + , m_GameListCtrl(NULL), m_pStatusBar(NULL), bRenderToMain(true), HaveLeds(false) , HaveSpeakers(false), m_Panel(NULL), m_ToolBar(NULL), m_ToolBarDebug(NULL) , m_bLogWindow(showLogWindow || SConfig::GetInstance().m_InterfaceLogWindow) , m_fLastClickTime(0), m_iLastMotionTime(0), LastMouseX(0), LastMouseY(0) @@ -314,7 +341,7 @@ CFrame::CFrame(bool showLogWindow, if (SConfig::GetInstance().m_InterfaceConsole) Console->Open(); // Start debugging mazimized - //if (UseDebugger) this->Maximize(true); + if (UseDebugger) this->Maximize(true); // Debugger class if (UseDebugger) { @@ -345,6 +372,9 @@ CFrame::CFrame(bool showLogWindow, // Give it a menu bar CreateMenu(); + // ------------------------------------------------------------------------- + // Main panel + // ŻŻŻŻŻŻŻŻŻŻŻŻŻ // This panel is the parent for rendering and it holds the gamelistctrl m_Panel = new CPanel(this, IDM_MPANEL); @@ -355,6 +385,7 @@ CFrame::CFrame(bool showLogWindow, sizerPanel = new wxBoxSizer(wxHORIZONTAL); sizerPanel->Add(m_GameListCtrl, 1, wxEXPAND | wxALL); m_Panel->SetSizer(sizerPanel); + // ------------------------------------------------------------------------- m_Mgr = new wxAuiManager(); m_Mgr->SetManagedWindow(this); @@ -425,6 +456,9 @@ CFrame::CFrame(bool showLogWindow, CreateCursor(); #endif + // ------------------------- + // Connect event handlers + // ---------- wxTheApp->Connect(wxID_ANY, wxEVT_KEY_DOWN, // Keyboard wxKeyEventHandler(CFrame::OnKeyDown), (wxObject*)0, this); @@ -442,14 +476,20 @@ CFrame::CFrame(bool showLogWindow, wxTheApp->Connect(wxID_ANY, wxEVT_MOTION, wxMouseEventHandler(CFrame::OnMotion), (wxObject*)0, this); + // ---------- + // Update controls UpdateGUI(); - m_GameListCtrl->Update(); + //if we are ever going back to optional iso caching: + //m_GameListCtrl->Update(SConfig::GetInstance().m_LocalCoreStartupParameter.bEnableIsoCache); + if (m_GameListCtrl) m_GameListCtrl->Update(); // If we are rerecording create the status bar now instead of later when a game starts #ifdef RERECORDING ModifyStatusBar(); + // It's to early for the OnHostMessage(), we will update the status when Ctrl or Space is pressed + //Core::WriteStatus(); #endif } // Destructor @@ -461,6 +501,8 @@ CFrame::~CFrame() #if wxUSE_TIMER if (m_timer.IsRunning()) m_timer.Stop(); #endif + + ClosePages(); } void CFrame::OnQuit(wxCommandEvent& WXUNUSED (event)) @@ -579,46 +621,66 @@ void CFrame::ListChildren() ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); wxAuiNotebook * NB = NULL; + Console->Log(LogTypes::LCUSTOM, "--------------------------------------------------------------------\n"); + for (int i = 0; i < this->GetChildren().size(); i++) { wxWindow * Win = this->GetChildren().Item(i)->GetData(); - // FIXME: fix POD passing error from uncommenting - // Console->Log(LogTypes::LNOTICE, StringFromFormat( - // "%i: %s (%s) :: %s", i, - // Win->GetName().mb_str(), Win->GetLabel().mb_str(), Win->GetParent()->GetName().mb_str()).c_str()); + Console->Log(LogTypes::LCUSTOM, StringFromFormat( + "%i: %s (%s) :: %s", i, + Win->GetName().mb_str(), Win->GetLabel().mb_str(), Win->GetParent()->GetName().mb_str()).c_str()); //if (Win->GetName().IsSameAs(wxT("control"))) if (Win->IsKindOf(CLASSINFO(wxAuiNotebook))) { NB = (wxAuiNotebook*)Win; - Console->Log(LogTypes::LNOTICE, StringFromFormat("%s", NB->GetName().mb_str()).c_str()); + Console->Log(LogTypes::LCUSTOM, StringFromFormat(" :: NB", NB->GetName().mb_str()).c_str()); } else { NB = NULL; } - Console->Log(LogTypes::LNOTICE, StringFromFormat("\n").c_str()); + Console->Log(LogTypes::LCUSTOM, StringFromFormat("\n").c_str()); Win = this->GetChildren().Item(i)->GetData(); for (int j = 0; j < Win->GetChildren().size(); j++) { - // FIXME: fix POD passing error from uncommenting - // Console->Log(LogTypes::LNOTICE, StringFromFormat( - // " %i.%i: %s (%s) :: %s", i, j, - // Win->GetName().mb_str(), Win->GetLabel().mb_str(), Win->GetParent()->GetName().mb_str()).c_str()); - // if (NB) - // Console->Log(LogTypes::LNOTICE, StringFromFormat("%s", NB->GetPage(j)->GetName().mb_str()).c_str()); - // Console->Log(LogTypes::LNOTICE, StringFromFormat("\n").c_str()); + Console->Log(LogTypes::LCUSTOM, StringFromFormat( + " %i.%i: %s (%s) :: %s", i, j, + Win->GetName().mb_str(), Win->GetLabel().mb_str(), Win->GetParent()->GetName().mb_str()).c_str()); + if (NB) + { + if (j < NB->GetPageCount()) + Console->Log(LogTypes::LCUSTOM, StringFromFormat(" :: %s", NB->GetPage(j)->GetName().mb_str()).c_str()); + } + Console->Log(LogTypes::LCUSTOM, StringFromFormat("\n").c_str()); + /* Win = this->GetChildren().Item(j)->GetData(); for (int k = 0; k < Win->GetChildren().size(); k++) { - // FIXME: fix POD passing error from uncommenting - // Console->Log(LogTypes::LNOTICE, StringFromFormat( - // " %i.%i.%i: %s (%s) :: %s\n", i, j, k, - // Win->GetName().mb_str(), Win->GetLabel().mb_str(), Win->GetParent()->GetName().mb_str()).c_str()); + Console->Log(LogTypes::LCUSTOM, StringFromFormat( + " %i.%i.%i: %s (%s) :: %s\n", i, j, k, + Win->GetName().mb_str(), Win->GetLabel().mb_str(), Win->GetParent()->GetName().mb_str()).c_str()); } + */ } } + + Console->Log(LogTypes::LCUSTOM, "--------------------------------------------------------------------\n"); + + for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (!m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) continue; + wxAuiNotebook * NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; + Console->Log(LogTypes::LCUSTOM, StringFromFormat("%i: %s\n", i, m_Mgr->GetAllPanes().Item(i).name.mb_str()).c_str()); + + for (int j = 0; j < NB->GetPageCount(); j++) + { + Console->Log(LogTypes::LCUSTOM, StringFromFormat("%i.%i: %s\n", i, j, NB->GetPageText(j).mb_str()).c_str()); + } + } + + Console->Log(LogTypes::LCUSTOM, "--------------------------------------------------------------------\n"); } void CFrame::ReloadPanes() { @@ -626,8 +688,7 @@ void CFrame::ReloadPanes() bool bConsole = SConfig::GetInstance().m_InterfaceConsole; //ListChildren(); - - ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); + //ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); //Console->Log(LogTypes::LNOTICE, StringFromFormat("ReloadPanes begin: Sound %i\n", FindWindowByName(wxT("Sound"))).c_str()); if (ActivePerspective >= Perspectives.size()) ActivePerspective = 0; @@ -638,35 +699,25 @@ void CFrame::ReloadPanes() // Check that the perspective was saved once before if (Perspectives.at(ActivePerspective).Width.size() == 0) return; + // Hide to avoid flickering + HideAllNotebooks(true); // Close all pages ClosePages(); - /* - Console->Log(LogTypes::LNOTICE, StringFromFormat( - "Will detached panes, have %i panes (%i NBs)\n", m_Mgr->GetAllPanes().GetCount(), GetNotebookCount()).c_str()); - */ - CloseAllNotebooks(); - m_Mgr->Update(); - /* - Console->Log(LogTypes::LNOTICE, StringFromFormat( - "Detached panes, have %i panes (%i NBs)\n", m_Mgr->GetAllPanes().GetCount(), GetNotebookCount()).c_str()); - */ + //m_Mgr->Update(); // Create new panes with notebooks for (int i = 0; i < Perspectives.at(ActivePerspective).Width.size() - 1; i++) { - m_Mgr->AddPane(CreateEmptyNotebook(), wxAuiPaneInfo().Show()); + m_Mgr->AddPane(CreateEmptyNotebook(), wxAuiPaneInfo().Hide()); } - /* - Console->Log(LogTypes::LNOTICE, StringFromFormat( - "Created %i panes, have %i panes (%i NBs)\n", - Perspectives.at(ActivePerspective).Width.size() - 1, m_Mgr->GetAllPanes().GetCount(), GetNotebookCount()).c_str()); - */ + HideAllNotebooks(true); + // Names NamePanes(); // Perspectives - m_Mgr->LoadPerspective(Perspectives.at(ActivePerspective).Perspective, true); + m_Mgr->LoadPerspective(Perspectives.at(ActivePerspective).Perspective, false); } // Create one pane by default else @@ -674,31 +725,33 @@ void CFrame::ReloadPanes() m_Mgr->AddPane(CreateEmptyNotebook()); } - //Console->Log(LogTypes::LNOTICE, StringFromFormat("ReloadPanes end: Sound %i\n", FindWindowByName(wxT("Sound"))).c_str()); - //ListChildren(); - - // If the code window was closed - if (!g_pCodeWindow) g_pCodeWindow = new CCodeWindow(SConfig::GetInstance().m_LocalCoreStartupParameter, this, this); + // Restore settings + SConfig::GetInstance().m_InterfaceConsole = bConsole; // Load GUI settings g_pCodeWindow->Load(); // Open notebook pages AddRemoveBlankPage(); g_pCodeWindow->OpenPages(); if (m_bLogWindow) DoToggleWindow(IDM_LOGWINDOW, true); - //if (bConsole) DoToggleWindow(IDM_CONSOLEWINDOW, true); + if (SConfig::GetInstance().m_InterfaceConsole) DoToggleWindow(IDM_CONSOLEWINDOW, true); + + //Console->Log(LogTypes::LNOTICE, StringFromFormat("ReloadPanes end: Sound %i\n", FindWindowByName(wxT("Sound"))).c_str()); + //ListChildren(); } void CFrame::DoLoadPerspective() { ReloadPanes(); // Restore the exact window sizes, which LoadPerspective doesn't always do SetPaneSize(); + // Show + ShowAllNotebooks(true); - /* + /* */ ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); - Console->Log(LogTypes::LNOTICE, StringFromFormat( - "Loaded: %s, NBs: %i, Non-NBs: %i, \n\n", - Perspectives.at(ActivePerspective).Name.c_str(), GetNotebookCount(), m_Mgr->GetAllPanes().GetCount() - GetNotebookCount()).c_str()); - */ + Console->Log(LogTypes::LCUSTOM, StringFromFormat( + "Loaded: %s (%i panes, %i NBs)\n", + Perspectives.at(ActivePerspective).Name.c_str(), m_Mgr->GetAllPanes().GetCount(), GetNotebookCount()).c_str()); + } // Update the local perspectives array void CFrame::SaveLocal() @@ -799,9 +852,9 @@ void CFrame::Save() /**/ ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); - Console->Log(LogTypes::LNOTICE, StringFromFormat( - "Saved: %s, NBs: %i, Non-NBs: %i, \n\n", - Perspectives.at(ActivePerspective).Name.c_str(), GetNotebookCount(), m_Mgr->GetAllPanes().GetCount() - GetNotebookCount()).c_str()); + Console->Log(LogTypes::LCUSTOM, StringFromFormat( + "Saved: %s (%i panes, %i NBs)\n", + Perspectives.at(ActivePerspective).Name.c_str(), m_Mgr->GetAllPanes().GetCount(), GetNotebookCount()).c_str()); TogglePaneStyle(m_ToolBarAui->GetToolToggled(IDM_EDIT_PERSPECTIVES)); @@ -852,18 +905,24 @@ void CFrame::OnPaneClose(wxAuiManagerEvent& event) { /* ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); - Console->Log(LogTypes::LNOTICE, StringFromFormat("GetNotebookCount before: %i\n", GetNotebookCount()).c_str()); + Console->Log(LogTypes::LCUSTOM, StringFromFormat("GetNotebookCount before: %i\n", GetNotebookCount()).c_str()); */ // Detach and delete the empty notebook event.pane->DestroyOnClose(true); m_Mgr->ClosePane(*event.pane); - //Console->Log(LogTypes::LNOTICE, StringFromFormat("GetNotebookCount after: %i\n", GetNotebookCount()).c_str()); + //Console->Log(LogTypes::LCUSTOM, StringFromFormat("GetNotebookCount after: %i\n", GetNotebookCount()).c_str()); } m_Mgr->Update(); } +///////////////////////////////////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Host messages +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ #ifdef _WIN32 WXLRESULT CFrame::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) { @@ -921,8 +980,12 @@ void CFrame::PostUpdateUIEvent(wxUpdateUIEvent& event) { if (g_pCodeWindow) wxPostEvent(g_pCodeWindow, event); } +///////////////////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Input +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void CFrame::OnGameListCtrl_ItemActivated(wxListEvent& WXUNUSED (event)) { // Show all platforms and regions if... @@ -1012,7 +1075,12 @@ void CFrame::OnKeyUp(wxKeyEvent& event) CPluginManager::GetInstance().GetPad(0)->PAD_Input(event.GetKeyCode(), 0); // 0 = Up event.Skip(); } +///////////////////////////////////////////////////////////////////////////////////////////////////////// + +///////////////////////////////////////////////////////////////////////////////////////////////////////// +// Detect double click. Kind of, for some reason we have to manually create the double click for now. +// ŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻŻ void CFrame::OnDoubleClick(wxMouseEvent& event) { // Don't block the mouse click @@ -1136,3 +1204,4 @@ void CFrame::Update() } } #endif +///////////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/Source/Core/DolphinWX/Src/Frame.h b/Source/Core/DolphinWX/Src/Frame.h index 4fa091d834..a6e69e2e7b 100644 --- a/Source/Core/DolphinWX/Src/Frame.h +++ b/Source/Core/DolphinWX/Src/Frame.h @@ -117,11 +117,13 @@ class CFrame : public wxFrame void ListChildren(); void ClosePages(); void DoToggleWindow(int,bool); + void ShowAllNotebooks(bool Window = false); + void HideAllNotebooks(bool Window = false); void CloseAllNotebooks(); int GetNotebookCount(); void DoAddPage(wxWindow *, int, std::string); void DoRemovePage(wxWindow *, bool Hide = true); - void DoRemovePageString(wxString, bool Hide = true); + void DoRemovePageString(wxString, bool Hide = true, bool Destroy = false); void HidePane(); void SetSimplePaneSize(); void SetPaneSize(); diff --git a/Source/Core/DolphinWX/Src/FrameTools.cpp b/Source/Core/DolphinWX/Src/FrameTools.cpp index fa68c4f493..e8205aab37 100644 --- a/Source/Core/DolphinWX/Src/FrameTools.cpp +++ b/Source/Core/DolphinWX/Src/FrameTools.cpp @@ -293,6 +293,7 @@ void CFrame::RecreateToolbar() m_ToolBar = new wxAuiToolBar(this, ID_TOOLBAR, wxDefaultPosition, wxDefaultSize, wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_OVERFLOW | wxAUI_TB_TEXT); PopulateToolbar(m_ToolBar); + m_Mgr->AddPane(m_ToolBar, wxAuiPaneInfo(). Name(wxT("TBMain")).Caption(wxT("TBMain")). ToolbarPane().Top(). @@ -303,12 +304,11 @@ void CFrame::RecreateToolbar() m_ToolBarDebug = new wxAuiToolBar(this, ID_TOOLBAR_DEBUG, wxDefaultPosition, wxDefaultSize, wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_OVERFLOW | wxAUI_TB_TEXT); g_pCodeWindow->PopulateToolbar(m_ToolBarDebug); - /* + m_Mgr->AddPane(m_ToolBarDebug, wxAuiPaneInfo(). Name(wxT("TBDebug")).Caption(wxT("TBDebug")). ToolbarPane().Top(). LeftDockable(false).RightDockable(false).Floatable(false)); - */ m_ToolBarAui = new wxAuiToolBar(this, ID_TOOLBAR_AUI, wxDefaultPosition, wxDefaultSize, wxAUI_TB_DEFAULT_STYLE | wxAUI_TB_OVERFLOW | wxAUI_TB_TEXT); @@ -1070,7 +1070,7 @@ int CFrame::GetNootebookAffiliation(wxString Name) void CFrame::ClosePages() { DoToggleWindow(IDM_LOGWINDOW, false); - //DoToggleWindow(IDM_CONSOLEWINDOW, false); + DoToggleWindow(IDM_CONSOLEWINDOW, false); DoToggleWindow(IDM_CODEWINDOW, false); DoToggleWindow(IDM_REGISTERWINDOW, false); DoToggleWindow(IDM_BREAKPOINTWINDOW, false); @@ -1080,11 +1080,17 @@ void CFrame::ClosePages() DoToggleWindow(IDM_VIDEOWINDOW, false); } void CFrame::DoToggleWindow(int Id, bool Show) -{ +{ switch (Id) { case IDM_LOGWINDOW: ToggleLogWindow(Show, UseDebugger ? g_pCodeWindow->iLogWindow : 0); break; case IDM_CONSOLEWINDOW: ToggleConsole(Show, UseDebugger ? g_pCodeWindow->iConsoleWindow : 0); break; + } + + if (!UseDebugger) return; + + switch (Id) + { case IDM_CODEWINDOW: g_pCodeWindow->OnToggleCodeWindow(Show, g_pCodeWindow->iCodeWindow); break; case IDM_REGISTERWINDOW: g_pCodeWindow->OnToggleRegisterWindow(Show, g_pCodeWindow->iRegisterWindow); break; case IDM_BREAKPOINTWINDOW: g_pCodeWindow->OnToggleBreakPointWindow(Show, g_pCodeWindow->iBreakpointWindow); break; @@ -1154,7 +1160,7 @@ void CFrame::HidePane() SetSimplePaneSize(); } -void CFrame::DoRemovePageString(wxString Str, bool Hide) +void CFrame::DoRemovePageString(wxString Str, bool Hide, bool Destroy) { for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) { @@ -1162,10 +1168,25 @@ void CFrame::DoRemovePageString(wxString Str, bool Hide) wxAuiNotebook * NB = (wxAuiNotebook*)m_Mgr->GetAllPanes().Item(i).window; for (int j = 0; j < NB->GetPageCount(); j++) { - if (NB->GetPageText(j).IsSameAs(Str)) { NB->RemovePage(j); break; } + if (NB->GetPageText(j).IsSameAs(Str)) + { + if (!Destroy) + { + // Reparent to avoid destruction if the notebook is closed and destroyed + wxWindow * Win = NB->GetPage(j); + NB->RemovePage(j); + Win->Reparent(this); + } + else + { + NB->DeletePage(j); + } + //if (Hide) Win->Hide(); + break; + } } } - //if (Hide) Win->Hide(); + } wxAuiNotebook * CFrame::GetNotebook(int NBId) { @@ -1178,6 +1199,34 @@ wxAuiNotebook * CFrame::GetNotebook(int NBId) } return NULL; } +void CFrame::ShowAllNotebooks(bool Window) +{ + for (int i = 0, j = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) + { + if (Window) + m_Mgr->GetAllPanes().Item(i).Show(); + else + m_Mgr->GetAllPanes().Item(i).window->Hide(); + } + } + m_Mgr->Update(); +} +void CFrame::HideAllNotebooks(bool Window) +{ + for (int i = 0; i < m_Mgr->GetAllPanes().GetCount(); i++) + { + if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) + { + if (Window) + m_Mgr->GetAllPanes().Item(i).Hide(); + else + m_Mgr->GetAllPanes().Item(i).window->Hide(); + } + } + m_Mgr->Update(); +} // Close all panes with notebooks void CFrame::CloseAllNotebooks() { @@ -1186,10 +1235,10 @@ void CFrame::CloseAllNotebooks() { if (m_Mgr->GetAllPanes().Item(i).window->IsKindOf(CLASSINFO(wxAuiNotebook))) { - //m_Mgr->GetAllPanes().Item(i).DestroyOnClose(true); - //m_Mgr->ClosePane(m_Mgr->GetAllPanes().Item(i)); - m_Mgr->GetAllPanes().Item(i).window->Hide(); - m_Mgr->DetachPane(m_Mgr->GetAllPanes().Item(i).window); + m_Mgr->GetAllPanes().Item(i).DestroyOnClose(true); + m_Mgr->ClosePane(m_Mgr->GetAllPanes().Item(i)); + //m_Mgr->GetAllPanes().Item(i).window->Hide(); + //m_Mgr->DetachPane(m_Mgr->GetAllPanes().Item(i).window); i = 0; //Console->Log(LogTypes::LCUSTOM, StringFromFormat(" %i Pane\n", i).c_str()); @@ -1236,6 +1285,9 @@ void CFrame::DoRemovePage(wxWindow * Win, bool Hide) { if (GetNotebook(i)->GetPageIndex(Win) != wxNOT_FOUND) GetNotebook(i)->RemovePage(GetNotebook(i)->GetPageIndex(Win)); } + // Reparent to avoid destruction if the notebook is closed and destroyed + Win->Reparent(this); + if (Hide) Win->Hide(); } } @@ -1318,6 +1370,8 @@ void CFrame::ToggleConsole(bool Show, int i) if (Show) { + //Console->Log(LogTypes::LCUSTOM, StringFromFormat(" >>> Show\n").c_str()); + if (GetNotebookCount() == 0) return; if (i < 0 || i > GetNotebookCount()-1) i = 0; @@ -1346,17 +1400,19 @@ void CFrame::ToggleConsole(bool Show, int i) } else // hide { + //Console->Log(LogTypes::LCUSTOM, StringFromFormat(" >>> Show\n").c_str()); + #ifdef _WIN32 - //wxWindow *Win = GetWxWindowHwnd(GetConsoleWindow()); - //DoRemovePage (Win, true); - DoRemovePageString(wxT("Console"), true); + // Hide if(GetConsoleWindow()) ShowWindow(GetConsoleWindow(),SW_HIDE); + // Release the console to Windows + ::SetParent(GetConsoleWindow(), NULL); + // Destroy the empty parent of the console + DoRemovePageString(wxT("Console"), true, true); #else Console->Close(); #endif - - } // Hide pane @@ -1388,6 +1444,8 @@ void CFrame::OnResize(wxSizeEvent& event) // Update the enabled/disabled status void CFrame::UpdateGUI() { + return; + // Save status bool initialized = Core::isRunning(); bool running = Core::GetState() == Core::CORE_RUN; @@ -1451,19 +1509,25 @@ void CFrame::UpdateGUI() if (!initialized) { - if (m_GameListCtrl && !m_GameListCtrl->IsShown()) + if (m_GameListCtrl) { - m_GameListCtrl->Enable(); - m_GameListCtrl->Show(); - sizerPanel->FitInside(m_Panel); + if (!m_GameListCtrl->IsShown()) + { + m_GameListCtrl->Enable(); + m_GameListCtrl->Show(); + sizerPanel->FitInside(m_Panel); + } } } else { - if (m_GameListCtrl && m_GameListCtrl->IsShown()) + if (m_GameListCtrl) { - m_GameListCtrl->Disable(); - m_GameListCtrl->Hide(); + if (m_GameListCtrl->IsShown()) + { + m_GameListCtrl->Disable(); + m_GameListCtrl->Hide(); + } } } diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.cpp b/Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.cpp index 138761756e..850711b8f3 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.cpp +++ b/Source/Plugins/Plugin_DSP_HLE/Src/Debugger/Debugger.cpp @@ -31,12 +31,14 @@ #include #endif -#include "Debugger.h" -#include "PBView.h" -#include "IniFile.h" +#include "IniFile.h" // Common #include "FileUtil.h" #include "StringUtil.h" #include "FileSearch.h" +#include "LogManager.h" + +#include "Debugger.h" +#include "PBView.h" #include "../Debugger/File.h" // Write to file ////////////////////////////// @@ -147,6 +149,12 @@ DSPDebuggerHLE::~DSPDebuggerHLE() file.Load(DEBUGGER_CONFIG_FILE); this->Save(file); file.Save(DEBUGGER_CONFIG_FILE); + + // Reset + m_DebuggerFrame = NULL; + // Talk + ConsoleListener* Console = LogManager::GetInstance()->getConsoleListener(); + Console->Log(LogTypes::LNOTICE, StringFromFormat("Sound closed\n").c_str()); } // ==================== @@ -241,7 +249,7 @@ void DSPDebuggerHLE::CreateGUIControls() wxStaticBoxSizer* sLeft; - int m_radioBoxNChoices[3]; + int m_radioBoxNChoices[4]; // Notebook ----------------------------------------------------- diff --git a/Source/Plugins/Plugin_DSP_HLE/Src/Globals.h b/Source/Plugins/Plugin_DSP_HLE/Src/Globals.h index 77ed007c1f..bcd99a6140 100644 --- a/Source/Plugins/Plugin_DSP_HLE/Src/Globals.h +++ b/Source/Plugins/Plugin_DSP_HLE/Src/Globals.h @@ -25,6 +25,12 @@ #include "../../../Core/Core/Src/ConfigManager.h" // FIXME extern DSPInitialize g_dspInitialize; +#if defined(HAVE_WX) && HAVE_WX + #include "Debugger/Debugger.h" + class DSPDebuggerHLE; + extern DSPDebuggerHLE* m_DebuggerFrame; +#endif + extern bool gSSBM; extern bool gSSBMremedy1; extern bool gSSBMremedy2;