diff --git a/pcsx2/AsciiString.cpp b/pcsx2/AsciiString.cpp deleted file mode 100644 index c1c101abc5..0000000000 --- a/pcsx2/AsciiString.cpp +++ /dev/null @@ -1,251 +0,0 @@ -/* Pcsx2 - Pc Ps2 Emulator - * Copyright (C) 2002-2009 Pcsx2 Team - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#include "PrecompiledHeader.h" - -#include "SafeArray.h" -#include "AsciiString.h" - -using namespace Threading; - -namespace AsciiStringAllocator -{ - struct PrivateHandle - { - AsciiStringAllocatorHandle* PublicHandle; - }; - - static const uint UnitLength = 256; - static const uint UnitLengthMask = UnitLength-1; - - static const uint AllocationCleanupThreshold = 256; - static const uint InitialBufferLength = 0x100000; // 1MB! - static const AsciiStringAllocatorHandle* PublicHandleAllocated = (AsciiStringAllocatorHandle*)1; - - static uint m_release_counter( 0 ); - - static SafeArray m_PrivateHandles( InitialBufferLength / UnitLength ); - static SafeArray m_StringBuffer( InitialBufferLength ); - - static int m_NextPrivateHandle; - static int m_NextBufferIndex; - - static MutexLock m_Lock; - - static char* GetPtr( const AsciiStringAllocatorHandle& handle ) - { - return &m_StringBuffer[ m_PrivateHandles[ handle.Index ] ]; - } - - static void DoCompact() - { - if( m_release_counter < AllocationCleanupThreshold ) return; - - ScopedLock locker( m_Lock ); - int handlecount = m_PrivateHandles.GetLength(); - int writepos = 0; - for( int readpos=0; readposIndex = cwpos; - - // todo: replace this with a hardcoded XMM inline copy of 256 bytes. :) - - memcpy_fast( - m_StringBuffer.GetPtr(cwpos*UnitLength), - m_StringBuffer.GetPtr(readpos*UnitLength), - UnitLength - ); - } - } - } - - void New( AsciiStringAllocatorHandle& dest, int length ) - { - int numblocks = (length / UnitLength)+1; - length = numblocks * UnitLength; - - ScopedLock locker( m_Lock ); - AsciiStringAllocatorHandle retval( m_NextPrivateHandle, length ); - m_PrivateHandles[m_NextPrivateHandle++].PublicHandle = &dest; - for( int p=numblocks-1; p; --p, ++m_NextPrivateHandle ) - m_PrivateHandles[m_NextPrivateHandle].PublicHandle = PublicHandleAllocated; - - m_StringBuffer.MakeRoomFor( m_NextPrivateHandle * UnitLength ); - - return retval; - } - - bool Grow( AsciiStringAllocatorHandle& dest ) - { - ScopedLock locker( m_lock ); - - if( m_PrivateHandles[m_NextPrivateHandle].PublicHandle == NULL ) - { - m_PrivateHandles[m_NextPrivateHandle].PublicHandle = PublicHandleAllocated; - return true; - } - return false; - } - - // releases the block without clearing the handle structure information - // and without doing a block compact check. - static int _release( AsciiStringAllocatorHandle& handle ) - { - const int numblocks = handle.Length / UnitLength; - const int endblock = handle.Index + numblocks; - - ScopedLock locker( m_Lock ); - for( int i=handle.Index; i= AllocationCleanupThreshold ) - DoCleanup(); - } - - // Allocates a new handle and copies the old string contents to the new reserve. - void Reallocate( AsciiStringAllocatorHandle& handle, int newsize ) - { - int newblocks = (newsize / UnitLength)+1; - newsize = newblocks * UnitLength; - - ScopedLock locker( m_Lock ); - _release( handle ); - - m_StringBuffer.MakeRoomFor( m_NextPrivateHandle + newblocks ); - if( m_NextPrivateHandle != handle.Index ) - { - memcpy_fast( - m_StringBuffer.GetPtr( m_NextPrivateHandle ), - m_StringBuffer(handle.Index), - handle.Length - ); - handle.Index = m_NextPrivateHandle; - } - handle.Length = newsize; - } -}; - -AsciiStringAllocatorHandle::GetPtr() const -{ - return AsciiStringAllocator::GetPtr( *this ); -} - -////////////////////////////////////////////////////////////////////////////////////////// -// - -AsciiString::AsciiString( int length_reserve ) -{ - AsciiStringAllocator::New( m_MemoryHandle, len ) -} - -const wxCharBuffer AsciiString::mb_str() const -{ - // use wxCharBuffer here for sake of safety, since parallel string operations could - // result in the pointer to this string becoming invalid. - ScopedLock locker( AsciiStringAllocator::m_Lock ); - return wxCharBuffer( AsciiStringAllocator::GetPtr( m_MemoryHandle ) ); -} - -AsciiStringLock::operator char*() -{ - return m_buffer; -} - -char& AsciiStringLock::operator[]( int idx ) -{ - return m_buffer[idx]; -} - -char AsciiStringLock::GetCharAt( int idx ) const -{ - return m_buffer[idx]; -} - -char* AsciiStringLock::GetPtr() -{ - return m_buffer; -} - -AsciiStringLock::AsciiStringLock( AsciiString& str ) : - m_string( str ) -{ - m_string.Lock(); -} - -AsciiStringLock::~AsciiStringLock() -{ - m_string.Unlock(); -} - -AsciiStringLock::operator char*() -{ - AsciiStringAllocator::GetPtr( m_handle ); -} - -AsciiString AsciiString::operator+( const AsciiString& right ) -{ - int len = GetLength() + right.GetLength(); - - AsciiString dest( len+1 ); - - char* lockptr = m_MemoryHandle.GetPtr(); - memcpy_fast( lockptr, GetBufferPtr(), GetLength() ); - memcpy_fast( lockptr+GetLength(), right.GetBufferPtr(), right.GetLength() ); - lockptr[dest.GetLength()] = 0; -} - -AsciiString& AsciiString::Append( const AsciiString& src ) -{ - int needlen = src.GetLength() + GetLength()+1; - if( needlen >= m_MemoryHandle.Length ) - { - // The new string is too large -- looks like we're going to need to allocate - // a larger block. We try and use Grow first, if the appending string is very - // short (it sometimes saves the need to copy the block to a new location) - - if( src.GetLength() >= AsciiStringAllocator::UnitLength || !AsciiStringAllocator::Grow( m_MemoryHandle ) ) - AsciiStringAllocator::Reallocate( m_MemoryHandle, needlen ); - } - - char* lockptr = m_MemoryHandle.GetPtr(); - memcpy_fast( lockptr+GetLength(), src.GetBufferPtr(), src.GetLength() ); - lockptr[GetLength()] = 0; -} diff --git a/pcsx2/AsciiString.h b/pcsx2/AsciiString.h deleted file mode 100644 index 8309043ac5..0000000000 --- a/pcsx2/AsciiString.h +++ /dev/null @@ -1,84 +0,0 @@ -/* Pcsx2 - Pc Ps2 Emulator - * Copyright (C) 2002-2009 Pcsx2 Team - * - * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA - */ - -#pragma once - -class AsciiStringAllocatorHandle -{ -public: - const int Index; - const int Length; - -public: - AsciiStringAllocatorHandle( int handle, int len ) : - Index( handle ), - Length( len ) - { - } - - char* GetPtr() const; - void Lock(); - void Unlock(); -}; - -class AsciiString -{ -protected: - AsciiStringAllocatorHandle m_MemoryHandle; - int m_Length; - -public: - AsciiString(); - AsciiString( AsciiString& copycat ); - AsciiString( const char* src ); - AsciiString( const char* src, int length ); - AsciiString( const char* src, int startpos, int length ); - AsciiString( int length_reserve ); - - const char* mb_str() const; - char mb_str_unsafe(); - - int GetLength() const - { - return m_Length; - } - - AsciiString operator+( const AsciiString& right ); - AsciiString& Append( const AsciiString& src ); - - void Lock(); - void Unlock(); -}; - - -class AsciiStringLock -{ -protected: - AsciiString& m_string; - char* m_buffer; - -public: - AsciiStringLock( const AsciiStringAllocatorHandle& handle ); - ~AsciiStringLock(); - - char* GetPtr(); - char GetCharAt( int idx ) const; - operator char*(); - char& operator[]( int idx ); - const char& operator[]( int idx ) const { return GetCharAt( idx ); } -}; \ No newline at end of file diff --git a/pcsx2/Linux/LnxHostSys.cpp b/pcsx2/Linux/LnxHostSys.cpp index 6e0d8701ef..a3643bceea 100644 --- a/pcsx2/Linux/LnxHostSys.cpp +++ b/pcsx2/Linux/LnxHostSys.cpp @@ -22,13 +22,6 @@ #include #include "Common.h" -extern void SysPageFaultExceptionFilter( int signal, siginfo_t *info, void * ); -extern void __fastcall InstallLinuxExceptionHandler(); -extern void __fastcall ReleaseLinuxExceptionHandler(); - -#define PCSX2_MEM_PROTECT_BEGIN() InstallLinuxExceptionHandler() -#define PCSX2_MEM_PROTECT_END() ReleaseLinuxExceptionHandler() - extern void SignalExit(int sig); static const uptr m_pagemask = getpagesize()-1; diff --git a/pcsx2/Paths.h b/pcsx2/Paths.h index c16ef04554..d642927bfc 100644 --- a/pcsx2/Paths.h +++ b/pcsx2/Paths.h @@ -173,6 +173,7 @@ namespace PathDefs namespace FilenameDefs { extern wxFileName GetConfig(); + extern wxFileName GetUsermodeConfig(); extern const wxFileName& Memcard( int slot ); }; diff --git a/pcsx2/System.cpp b/pcsx2/System.cpp index c145ce865d..969b0b34c0 100644 --- a/pcsx2/System.cpp +++ b/pcsx2/System.cpp @@ -30,97 +30,48 @@ #include "R5900Exceptions.h" using namespace std; -using namespace Console; // disable all session overrides by default... SessionOverrideFlags g_Session = {false}; bool sysInitialized = false; -// I can't believe I had to make my own version of trim. C++'s STL is totally whack. -// And I still had to fix it too. I found three samples of trim online and *all* three -// were buggy. People really need to learn to code before they start posting trim -// functions in their blogs. (air) -static void trim( string& line ) -{ - if ( line.empty() ) - return; - int string_size = line.length(); - int beginning_of_string = 0; - int end_of_string = string_size - 1; - - bool encountered_characters = false; - - // find the start of characters in the string - while ( (beginning_of_string < string_size) && (!encountered_characters) ) - { - if ( (line[ beginning_of_string ] != ' ') && (line[ beginning_of_string ] != '\t') ) - encountered_characters = true; - else - ++beginning_of_string; - } - - // test if no characters were found in the string - if ( beginning_of_string == string_size ) - return; - - encountered_characters = false; - - // find the character in the string - while ( (end_of_string > beginning_of_string) && (!encountered_characters) ) - { - // if a space or tab was found then ignore it - if ( (line[ end_of_string ] != ' ') && (line[ end_of_string ] != '\t') ) - encountered_characters = true; - else - --end_of_string; - } - - // return the original string with all whitespace removed from its beginning and end - // + 1 at the end to add the space for the string delimiter - //line.substr( beginning_of_string, end_of_string - beginning_of_string + 1 ); - line.erase( end_of_string+1, string_size ); - line.erase( 0, beginning_of_string ); -} - - -////////////////////////////////////////////////////////////////////////////////////////// +// ----------------------------------------------------------------------- // This function should be called once during program execution. +// void SysDetect() { + using namespace Console; + if( sysInitialized ) return; sysInitialized = true; Notice("PCSX2 " PCSX2_VERSION " - compiled on " __DATE__ ); Notice("Savestate version: %x", params g_SaveVersion); - // fixme: This line is here for the purpose of creating external ASM code. Yah. >_< - DevCon::Notice( "EE pc offset: 0x%x, IOP pc offset: 0x%x", params (u32)&cpuRegs.pc - (u32)&cpuRegs, (u32)&psxRegs.pc - (u32)&psxRegs ); - cpudetectInit(); - string family( cpuinfo.x86Fam ); - trim( family ); - - SetColor( Console::Color_White ); + SetColor( Color_Black ); WriteLn( "x86Init:" ); - WriteLn( - "\tCPU vendor name = %s\n" - "\tFamilyID = %x\n" - "\tx86Family = %s\n" - "\tCPU speed = %d.%03d Ghz\n" - "\tCores = %d physical [%d logical]\n" - "\tx86PType = %s\n" - "\tx86Flags = %8.8x %8.8x\n" - "\tx86EFlags = %8.8x\n", params - cpuinfo.x86ID, cpuinfo.x86StepID, family.c_str(), + WriteLn( wxsFormat( + L"\tCPU vendor name = %s\n" + L"\tFamilyID = %x\n" + L"\tx86Family = %s\n" + L"\tCPU speed = %d.%03d Ghz\n" + L"\tCores = %d physical [%d logical]\n" + L"\tx86PType = %s\n" + L"\tx86Flags = %8.8x %8.8x\n" + L"\tx86EFlags = %8.8x\n", + wxString::FromAscii( cpuinfo.x86ID ).c_str(), cpuinfo.x86StepID, + wxString::FromAscii( cpuinfo.x86Fam ).Trim().Trim(false).c_str(), cpuinfo.cpuspeed / 1000, cpuinfo.cpuspeed%1000, cpuinfo.PhysicalCores, cpuinfo.LogicalCores, - cpuinfo.x86Type, cpuinfo.x86Flags, cpuinfo.x86Flags2, + wxString::FromAscii( cpuinfo.x86Type ).c_str(), + cpuinfo.x86Flags, cpuinfo.x86Flags2, cpuinfo.x86EFlags - ); + ) ); WriteLn( "Features:" ); WriteLn( @@ -493,3 +444,24 @@ u8 *SysMmapEx(uptr base, u32 size, uptr bounds, const char *caller) } return Mem; } + +// Ensures existence of necessary folders, and performs error handling if the +// folders fail to create. +static void InitFolderStructure() +{ + +} + +// Returns FALSE if the core/recompiler memory allocations failed. +bool SysInit() +{ + PCSX2_MEM_PROTECT_BEGIN(); + SysDetect(); + if( !SysAllocateMem() ) + return false; // critical memory allocation failure; + + SysAllocateDynarecs(); + PCSX2_MEM_PROTECT_END(); + + return true; +} diff --git a/pcsx2/System.h b/pcsx2/System.h index b03cfc2b7d..c298703473 100644 --- a/pcsx2/System.h +++ b/pcsx2/System.h @@ -24,6 +24,7 @@ #include "Utilities/Threading.h" // to use threading stuff, include the Threading namespace in your file. #include "Misc.h" +extern bool SysInit(); extern void SysDetect(); // Detects cpu type and fills cpuInfo structs. extern void SysReset(); // Resets the various PS2 cpus, sub-systems, and recompilers. extern void SysUpdate(); // Called on VBlank (to update i.e. pads) @@ -50,9 +51,29 @@ extern void SysExecute(); // The allocated block has code execution privileges. // Returns NULL on allocation failure. extern u8 *SysMmapEx(uptr base, u32 size, uptr bounds, const char *caller="Unnamed"); - extern void vSyncDebugStuff( uint frame ); +#ifdef __LINUX__ + + extern void SysPageFaultExceptionFilter( int signal, siginfo_t *info, void * ); + extern void __fastcall InstallLinuxExceptionHandler(); + extern void __fastcall ReleaseLinuxExceptionHandler(); + static void NTFS_CompressFile( const wxString& file, bool compressStatus=true ) {} + +# define PCSX2_MEM_PROTECT_BEGIN() InstallLinuxExceptionHandler() +# define PCSX2_MEM_PROTECT_END() ReleaseLinuxExceptionHandler() + +#elif defined( _WIN32 ) + + extern int SysPageFaultExceptionFilter(EXCEPTION_POINTERS* eps); + extern void NTFS_CompressFile( const wxString& file, bool compressStatus=true ); + +# define PCSX2_MEM_PROTECT_BEGIN() __try { +# define PCSX2_MEM_PROTECT_END() } __except(SysPageFaultExceptionFilter(GetExceptionInformation())) {} + +#else +# error PCSX2 - Unsupported operating system platform. +#endif ////////////////////////////////////////////////////////////////////////////////////////// // Different types of message boxes that the emulator can employ from the friendly confines diff --git a/pcsx2/gui/AppConfig.cpp b/pcsx2/gui/AppConfig.cpp index ed9de09fbe..c24ab660c9 100644 --- a/pcsx2/gui/AppConfig.cpp +++ b/pcsx2/gui/AppConfig.cpp @@ -154,6 +154,11 @@ namespace FilenameDefs return wxGetApp().GetAppName() + L".ini"; } + + wxFileName GetUsermodeConfig() + { + return L"usermode.ini"; + } const wxFileName& Memcard( int slot ) { @@ -292,6 +297,18 @@ void AppConfig::LoadSave( IniInterface& ini ) // void AppConfig::Apply() { + // Ensure existence of necessary documents folders. Plugins and other parts + // of PCSX2 rely on them. + + g_Conf->Folders.MemoryCards.Mkdir(); + g_Conf->Folders.Savestates.Mkdir(); + g_Conf->Folders.Snapshots.Mkdir(); + + // Update the compression attribute on the Memcards folder. + // Memcards generally compress very well via NTFS compression. + + NTFS_CompressFile( g_Conf->Folders.MemoryCards.ToString(), g_Conf->MemoryCards.EnableNTFS ); + if( !i18n_SetLanguage( LanguageId ) ) { if( !i18n_SetLanguage( wxLANGUAGE_DEFAULT ) ) @@ -306,7 +323,7 @@ void AppConfig::Apply() wxConfigBase* cfg = wxConfigBase::Get( false ); wxASSERT( cfg != NULL ); - + if( g_RecentIsoList != NULL ) g_RecentIsoList->Save( *cfg ); safe_delete( g_RecentIsoList ); diff --git a/pcsx2/gui/ConsoleLogger.cpp b/pcsx2/gui/ConsoleLogger.cpp index 323b8ec0df..1f105e57bf 100644 --- a/pcsx2/gui/ConsoleLogger.cpp +++ b/pcsx2/gui/ConsoleLogger.cpp @@ -89,15 +89,18 @@ static bool OpenLogFile(wxFile& file, wxString& filename, wxWindow *parent) ConsoleLogFrame::ColorArray::ColorArray() : m_table( 8 ) { + wxFont fixed( 8, wxMODERN, wxNORMAL, wxNORMAL ); + wxFont fixedB( 8, wxMODERN, wxNORMAL, wxBOLD ); + // Standard R, G, B format: - new (&m_table[Color_Black]) wxTextAttr( wxColor( 0, 0, 0 ) ); - new (&m_table[Color_Red]) wxTextAttr( wxColor( 128, 0, 0 ) ); - new (&m_table[Color_Green]) wxTextAttr( wxColor( 0, 128, 0 ) ); - new (&m_table[Color_Blue]) wxTextAttr( wxColor( 0, 0, 128 ) ); - new (&m_table[Color_Yellow]) wxTextAttr( wxColor( 180, 180, 0 ) ); - new (&m_table[Color_Cyan]) wxTextAttr( wxColor( 0, 160, 160 ) ); - new (&m_table[Color_Magenta]) wxTextAttr( wxColor( 160, 0, 160 ) ); - new (&m_table[Color_White]) wxTextAttr( wxColor( 160, 160, 160 ) ); + new (&m_table[Color_Black]) wxTextAttr( wxColor( 0, 0, 0 ), wxNullColour, fixed ); + new (&m_table[Color_Red]) wxTextAttr( wxColor( 128, 0, 0 ), wxNullColour, fixedB ); + new (&m_table[Color_Green]) wxTextAttr( wxColor( 0, 128, 0 ), wxNullColour, fixed ); + new (&m_table[Color_Blue]) wxTextAttr( wxColor( 0, 0, 128 ), wxNullColour, fixed ); + new (&m_table[Color_Yellow]) wxTextAttr( wxColor( 160, 160, 0 ), wxNullColour, fixedB ); + new (&m_table[Color_Cyan]) wxTextAttr( wxColor( 0, 140, 140 ), wxNullColour, fixed ); + new (&m_table[Color_Magenta]) wxTextAttr( wxColor( 160, 0, 160 ), wxNullColour, fixed ); + new (&m_table[Color_White]) wxTextAttr( wxColor( 128, 128, 128 ), wxNullColour, fixed ); } // ------------------------------------------------------------------------ @@ -110,16 +113,18 @@ void ConsoleLogFrame::ColorArray::SetFont( const wxFont& font ) m_table[i].SetFont( font ); } +static const Console::Colors DefaultConsoleColor = Color_White; + // ------------------------------------------------------------------------ ConsoleLogFrame::ConsoleLogFrame(MainEmuFrame *parent, const wxString& title) : wxFrame(parent, wxID_ANY, title) , m_TextCtrl( *new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxTE_MULTILINE | wxHSCROLL | wxTE_READONLY | wxTE_RICH2 ) ) , m_ColorTable() -, m_curcolor( Color_Black ) +, m_curcolor( DefaultConsoleColor ) , m_msgcounter( 0 ) { - m_TextCtrl.SetBackgroundColour( wxColor( 238, 240, 248 ) ); //wxColor( 48, 48, 64 ) ); + m_TextCtrl.SetBackgroundColour( wxColor( 230, 235, 242 ) ); // create menu wxMenuBar *pMenuBar = new wxMenuBar; @@ -156,10 +161,10 @@ ConsoleLogFrame::ConsoleLogFrame(MainEmuFrame *parent, const wxString& title) : Connect( wxEVT_MOVE, wxMoveEventHandler(ConsoleLogFrame::OnMoveAround) ); Connect( wxEVT_SIZE, wxSizeEventHandler(ConsoleLogFrame::OnResize) ); - Connect( wxEVT_LOG_Write, wxCommandEventHandler(ConsoleLogFrame::OnWrite) ); - Connect( wxEVT_LOG_Newline, wxCommandEventHandler(ConsoleLogFrame::OnNewline) ); - Connect( wxEVT_SetTitleText, wxCommandEventHandler(ConsoleLogFrame::OnSetTitle) ); - Connect( wxEVT_DockConsole, wxCommandEventHandler(ConsoleLogFrame::OnDockedMove) ); + Connect( wxEVT_LOG_Write, wxCommandEventHandler(ConsoleLogFrame::OnWrite) ); + Connect( wxEVT_LOG_Newline, wxCommandEventHandler(ConsoleLogFrame::OnNewline) ); + Connect( wxEVT_SetTitleText,wxCommandEventHandler(ConsoleLogFrame::OnSetTitle) ); + Connect( wxEVT_DockConsole, wxCommandEventHandler(ConsoleLogFrame::OnDockedMove) ); } ConsoleLogFrame::~ConsoleLogFrame() { } @@ -257,8 +262,8 @@ void ConsoleLogFrame::SetColor( Colors color ) void ConsoleLogFrame::ClearColor() { - m_curcolor = Color_Black; - m_TextCtrl.SetDefaultStyle( m_ColorTable.Default() ); + if( DefaultConsoleColor != m_curcolor ) + m_TextCtrl.SetDefaultStyle( m_ColorTable[m_curcolor=DefaultConsoleColor] ); } void ConsoleLogFrame::OnWrite( wxCommandEvent& event ) @@ -368,7 +373,7 @@ void ConsoleLogFrame::DoMessage() namespace Console { // thread-local console color storage. - __threadlocal Colors th_CurrentColor = Color_Black; + __threadlocal Colors th_CurrentColor = DefaultConsoleColor; void __fastcall SetTitle( const wxString& title ) { @@ -384,7 +389,7 @@ namespace Console void ClearColor() { - th_CurrentColor = Color_Black; + th_CurrentColor = DefaultConsoleColor; } bool Newline() diff --git a/pcsx2/gui/Dialogs/ConfigurationDialog.cpp b/pcsx2/gui/Dialogs/ConfigurationDialog.cpp index fb01eb16fe..8de1bdc3cf 100644 --- a/pcsx2/gui/Dialogs/ConfigurationDialog.cpp +++ b/pcsx2/gui/Dialogs/ConfigurationDialog.cpp @@ -72,17 +72,26 @@ bool Dialogs::ConfigurationDialog::ApplySettings() { AppConfig confcopy( *g_Conf ); - int pagecount = m_listbook.GetPageCount(); - for( int i=0; iApply( confcopy ) ) return false; + int pagecount = m_listbook.GetPageCount(); + for( int i=0; iApply( confcopy ); + } + + *g_Conf = confcopy; + g_Conf->Apply(); + g_Conf->Save(); + } + catch( Exception::CannotApplySettings& ex ) + { + wxMessageBox( ex.DisplayMessage(), _("Cannot apply settings...") ); + + // TODO : Automatically switch focus to the panel that failed. + return false; } - - *g_Conf = confcopy; - g_Conf->Apply(); - g_Conf->Save(); - return true; } diff --git a/pcsx2/gui/Dialogs/ModalPopups.h b/pcsx2/gui/Dialogs/ModalPopups.h index 6e97d5fc9f..290c95be67 100644 --- a/pcsx2/gui/Dialogs/ModalPopups.h +++ b/pcsx2/gui/Dialogs/ModalPopups.h @@ -22,6 +22,7 @@ #include #include "wxHelpers.h" +#include "Panels/ConfigurationPanels.h" namespace Dialogs { @@ -38,8 +39,14 @@ namespace Dialogs class PickUserModeDialog : public wxDialogWithHelpers { + protected: + Panels::UsermodeSelectionPanel* m_panel_usersel; + public: PickUserModeDialog( wxWindow* parent, int id=wxID_ANY ); + + protected: + void OnOk_Click( wxCommandEvent& evt ); }; } diff --git a/pcsx2/gui/Dialogs/PickUserModeDialog.cpp b/pcsx2/gui/Dialogs/PickUserModeDialog.cpp index ba65f79184..1d8464988c 100644 --- a/pcsx2/gui/Dialogs/PickUserModeDialog.cpp +++ b/pcsx2/gui/Dialogs/PickUserModeDialog.cpp @@ -17,20 +17,75 @@ */ #include "PrecompiledHeader.h" - #include "ModalPopups.h" +#include + using namespace wxHelpers; +Panels::UsermodeSelectionPanel::UsermodeSelectionPanel( wxWindow* parent ) : + BaseApplicableConfigPanel( parent ) +, m_radio_user( NULL ) +, m_radio_cwd( NULL ) +{ + wxStaticBoxSizer& s_boxer = *new wxStaticBoxSizer( wxVERTICAL, this, _( "Usermode Selection" ) ); + AddStaticText( s_boxer, + L"Please select your preferred default location for PCSX2 user-level documents below " + L"(includes memory cards, screenshots, settings, and savestates). " + L"These folder locations can be overridden at any time using the Core Settings panel.", + 480, wxALIGN_CENTRE ); + + m_radio_user = &AddRadioButton( s_boxer, _("User Documents (recommended)"), _("Location: ") + wxStandardPaths::Get().GetDocumentsDir() ); + m_radio_cwd = &AddRadioButton( s_boxer, _("Current working folder (intended for developer use only)"), _("Location: ") + wxGetCwd() ); + + s_boxer.AddSpacer( 4 ); + SetSizerAndFit( &s_boxer ); +} + +void Panels::UsermodeSelectionPanel::Apply( AppConfig& conf ) +{ + if( !m_radio_cwd->GetValue() && !m_radio_user->GetValue() ) + throw Exception::CannotApplySettings( wxLt( "You must select one of the available user modes before proceeding." ) ); + conf.UseAdminMode = m_radio_cwd->GetValue(); +} + + Dialogs::PickUserModeDialog::PickUserModeDialog( wxWindow* parent, int id ) : - wxDialogWithHelpers( parent, id, _("PCSX2 Select User Mode"), false ) + wxDialogWithHelpers( parent, id, _("PCSX2 First Time configuration"), false ) +, m_panel_usersel( new Panels::UsermodeSelectionPanel( this ) ) { wxBoxSizer& s_main = *new wxBoxSizer( wxVERTICAL ); - AddStaticText( s_main, _("PCSX2 is starting from a new or unknown working directory and needs to be configured."), 400 ); - AddStaticText( s_main, _("Current Working Directory: ") + wxGetCwd(), 480 ); + AddStaticText( s_main, _("PCSX2 is starting from a new or unknown folder and needs to be configured."), + 0, wxALIGN_CENTRE ); + s_main.AddSpacer( 8 ); + s_main.Add( m_panel_usersel, SizerFlags::StdGroupie() ); + + //new wxListCt AddOkCancel( s_main ); - + SetSizerAndFit( &s_main ); + + Connect( wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PickUserModeDialog::OnOk_Click ) ); } +void Dialogs::PickUserModeDialog::OnOk_Click( wxCommandEvent& evt ) +{ + AppConfig confcopy( *g_Conf ); + + try + { + m_panel_usersel->Apply( confcopy ); + + *g_Conf = confcopy; + g_Conf->Apply(); + g_Conf->Save(); + + Close(); + evt.Skip(); + } + catch( Exception::CannotApplySettings& ex ) + { + wxMessageBox( ex.DisplayMessage() + L"\n" + _("You may press Cancel to close the program."), _("Cannot apply settings...") ); + } +} diff --git a/pcsx2/gui/MainFrame.cpp b/pcsx2/gui/MainFrame.cpp index a912cbedfa..601dbd4b52 100644 --- a/pcsx2/gui/MainFrame.cpp +++ b/pcsx2/gui/MainFrame.cpp @@ -6,7 +6,7 @@ * 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, + * This program is distributed in the hopeb 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. @@ -18,16 +18,10 @@ #include "PrecompiledHeader.h" #include "MainFrame.h" -#include "Dialogs/LogOptionsDialog.h" -#include "Dialogs/ModalPopups.h" #include "Resources/EmbeddedImage.h" #include "Resources/AppIcon.h" -#include "Dialogs/ConfigurationDialog.h" - -using namespace Dialogs; - // ------------------------------------------------------------------------ wxMenu* MainEmuFrame::MakeStatesMenu() { @@ -339,82 +333,3 @@ MainEmuFrame::MainEmuFrame(wxWindow* parent, const wxString& title): Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler(MainEmuFrame::OnCloseWindow) ); } -void MainEmuFrame::Menu_ConfigSettings_Click(wxCommandEvent &event) -{ - Dialogs::ConfigurationDialog( this ).ShowModal(); -} - -void MainEmuFrame::Menu_RunIso_Click(wxCommandEvent &event) -{ - wxFileDialog ctrl( this, _("Run PS2 Iso..."), g_Conf->Folders.RunIso.ToString(), wxEmptyString, - L"Iso Image (*.iso)|*.iso|(*.mdf)|*.mdf|Nero Image (*.nrg)|*.nrg", wxFD_FILE_MUST_EXIST ); - ctrl.ShowModal(); - - Console::WriteLn( L"Test Iso Open: " + ctrl.GetFilename() ); -} - -void MainEmuFrame::Menu_RunWithoutDisc_Click(wxCommandEvent &event) -{ -} - -void MainEmuFrame::Menu_IsoRecent_Click(wxCommandEvent &event) -{ - //Console::Status( "%d", params event.GetId() - g_RecentIsoList->GetBaseId() ); - //Console::WriteLn( Color_Magenta, g_RecentIsoList->GetHistoryFile( event.GetId() - g_RecentIsoList->GetBaseId() ) ); -} - -void MainEmuFrame::Menu_OpenELF_Click(wxCommandEvent &event) -{ -} - -void MainEmuFrame::Menu_LoadStateOther_Click(wxCommandEvent &event) -{ -} - -void MainEmuFrame::Menu_SaveStateOther_Click(wxCommandEvent &event) -{ -} - -void MainEmuFrame::Menu_Exit_Click(wxCommandEvent &event) -{ - Close(); -} - -void MainEmuFrame::Menu_Suspend_Click(wxCommandEvent &event) -{ -} - -void MainEmuFrame::Menu_Resume_Click(wxCommandEvent &event) -{ -} - -void MainEmuFrame::Menu_Reset_Click(wxCommandEvent &event) -{ -} - -void MainEmuFrame::Menu_Debug_Open_Click(wxCommandEvent &event) -{ -} - -void MainEmuFrame::Menu_Debug_MemoryDump_Click(wxCommandEvent &event) -{ -} - -void MainEmuFrame::Menu_Debug_Logging_Click(wxCommandEvent &event) -{ - LogOptionsDialog( this, wxID_ANY ).ShowModal(); -} - -void MainEmuFrame::Menu_ShowConsole(wxCommandEvent &event) -{ - // Use messages to relay open/close commands (thread-safe) - - g_Conf->ConLogBox.Visible = event.IsChecked(); - wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED, g_Conf->ConLogBox.Visible ? wxID_OPEN : wxID_CLOSE ); - wxGetApp().ProgramLog_PostEvent( evt ); -} - -void MainEmuFrame::Menu_ShowAboutBox(wxCommandEvent &event) -{ - AboutBoxDialog( this, wxID_ANY ).ShowModal(); -} diff --git a/pcsx2/gui/MainMenuClicks.cpp b/pcsx2/gui/MainMenuClicks.cpp new file mode 100644 index 0000000000..accbcd36b8 --- /dev/null +++ b/pcsx2/gui/MainMenuClicks.cpp @@ -0,0 +1,112 @@ +/* Pcsx2 - Pc Ps2 Emulator + * Copyright (C) 2002-2009 Pcsx2 Team + * + * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#include "PrecompiledHeader.h" +#include "MainFrame.h" +#include "Dialogs/ModalPopups.h" +#include "Dialogs/ConfigurationDialog.h" +#include "Dialogs/LogOptionsDialog.h" + +using namespace Dialogs; + + +void MainEmuFrame::Menu_ConfigSettings_Click(wxCommandEvent &event) +{ + Dialogs::ConfigurationDialog( this ).ShowModal(); +} + +static const wxChar* isoFilterTypes = + L"Iso Image (*.iso)|*.iso|Bin Image|(*.bin)|MDF Image (*.mdf)|*.mdf|Nero Image (*.nrg)|*.nrg"; + +void MainEmuFrame::Menu_RunIso_Click(wxCommandEvent &event) +{ + Console::Status( L"Default Folder: " + g_Conf->Folders.RunIso.ToString() ); + wxFileDialog ctrl( this, _("Run PS2 Iso..."), g_Conf->Folders.RunIso.ToString(), wxEmptyString, + isoFilterTypes, wxFD_OPEN | wxFD_FILE_MUST_EXIST ); + + if( ctrl.ShowModal() == wxID_CANCEL ) return; + g_Conf->Folders.RunIso = ctrl.GetPath(); + + +} + +void MainEmuFrame::Menu_RunWithoutDisc_Click(wxCommandEvent &event) +{ +} + +void MainEmuFrame::Menu_IsoRecent_Click(wxCommandEvent &event) +{ + //Console::Status( "%d", params event.GetId() - g_RecentIsoList->GetBaseId() ); + //Console::WriteLn( Color_Magenta, g_RecentIsoList->GetHistoryFile( event.GetId() - g_RecentIsoList->GetBaseId() ) ); +} + +void MainEmuFrame::Menu_OpenELF_Click(wxCommandEvent &event) +{ +} + +void MainEmuFrame::Menu_LoadStateOther_Click(wxCommandEvent &event) +{ +} + +void MainEmuFrame::Menu_SaveStateOther_Click(wxCommandEvent &event) +{ +} + +void MainEmuFrame::Menu_Exit_Click(wxCommandEvent &event) +{ + Close(); +} + +void MainEmuFrame::Menu_Suspend_Click(wxCommandEvent &event) +{ +} + +void MainEmuFrame::Menu_Resume_Click(wxCommandEvent &event) +{ +} + +void MainEmuFrame::Menu_Reset_Click(wxCommandEvent &event) +{ +} + +void MainEmuFrame::Menu_Debug_Open_Click(wxCommandEvent &event) +{ +} + +void MainEmuFrame::Menu_Debug_MemoryDump_Click(wxCommandEvent &event) +{ +} + +void MainEmuFrame::Menu_Debug_Logging_Click(wxCommandEvent &event) +{ + LogOptionsDialog( this, wxID_ANY ).ShowModal(); +} + +void MainEmuFrame::Menu_ShowConsole(wxCommandEvent &event) +{ + // Use messages to relay open/close commands (thread-safe) + + g_Conf->ConLogBox.Visible = event.IsChecked(); + wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED, g_Conf->ConLogBox.Visible ? wxID_OPEN : wxID_CLOSE ); + wxGetApp().ProgramLog_PostEvent( evt ); +} + +void MainEmuFrame::Menu_ShowAboutBox(wxCommandEvent &event) +{ + AboutBoxDialog( this, wxID_ANY ).ShowModal(); +} diff --git a/pcsx2/gui/Panels/ConfigurationPanels.h b/pcsx2/gui/Panels/ConfigurationPanels.h index 4ef5d76950..bbb03cf4a9 100644 --- a/pcsx2/gui/Panels/ConfigurationPanels.h +++ b/pcsx2/gui/Panels/ConfigurationPanels.h @@ -31,6 +31,28 @@ #include "Utilities/SafeArray.h" #include "Utilities/Threading.h" +namespace Exception +{ + // -------------------------------------------------------------------------- + // Exception used to perform an abort of Apply/Ok action on settings panels. + // When thrown, the user recieves a popup message containing the information + // specified in the exception message, and is returned to the settings dialog + // to correct the invalid input fields. + // + class CannotApplySettings : public BaseException + { + public: + virtual ~CannotApplySettings() throw() {} + CannotApplySettings( const CannotApplySettings& src ) : BaseException( src ) {} + + explicit CannotApplySettings( const char* msg=wxLt("Cannot apply new settings, one of the settings is invalid.") ) : + BaseException( msg ) {} + + explicit CannotApplySettings( const wxString& msg_eng, const wxString& msg_xlt ) : + BaseException( msg_eng, msg_xlt ) { } + }; +} + namespace Panels { ////////////////////////////////////////////////////////////////////////////////////////// @@ -46,17 +68,33 @@ namespace Panels // This method attempts to assign the settings for the panel into the given // configuration structure (which is typically a copy of g_Conf). If validation - // of form contents fails, the function returns false. - virtual bool Apply( AppConfig& conf )=0; + // of form contents fails, the function should throw Exception::CannotApplySettings. + // If no exceptions are thrown, then the operation is assumed a success. :) + virtual void Apply( AppConfig& conf )=0; }; + ////////////////////////////////////////////////////////////////////////////////////////// + // + class UsermodeSelectionPanel : public BaseApplicableConfigPanel + { + protected: + wxRadioButton* m_radio_user; + wxRadioButton* m_radio_cwd; + + public: + virtual ~UsermodeSelectionPanel() { } + UsermodeSelectionPanel( wxWindow* parent ); + + void Apply( AppConfig& conf ); + }; + ////////////////////////////////////////////////////////////////////////////////////////// // class SpeedHacksPanel : public BaseApplicableConfigPanel { public: SpeedHacksPanel(wxWindow& parent); - bool Apply( AppConfig& conf ); + void Apply( AppConfig& conf ); protected: void IOPCycleDouble_Click(wxCommandEvent &event); @@ -71,7 +109,7 @@ namespace Panels { public: GameFixesPanel(wxWindow& parent); - bool Apply( AppConfig& conf ); + void Apply( AppConfig& conf ); void FPUCompareHack_Click(wxCommandEvent &event); void FPUMultHack_Click(wxCommandEvent &event); @@ -127,7 +165,7 @@ namespace Panels public: PathsPanel(wxWindow& parent); - bool Apply( AppConfig& conf ); + void Apply( AppConfig& conf ); }; ////////////////////////////////////////////////////////////////////////////////////////// @@ -219,7 +257,7 @@ namespace Panels virtual void OnProgress( wxCommandEvent& evt ); virtual void OnEnumComplete( wxCommandEvent& evt ); - bool Apply( AppConfig& conf ); + void Apply( AppConfig& conf ); protected: void DoRefresh(); diff --git a/pcsx2/gui/Panels/GameFixesPanel.cpp b/pcsx2/gui/Panels/GameFixesPanel.cpp index 6f9c1302b8..ebe7671803 100644 --- a/pcsx2/gui/Panels/GameFixesPanel.cpp +++ b/pcsx2/gui/Panels/GameFixesPanel.cpp @@ -52,9 +52,8 @@ Panels::GameFixesPanel::GameFixesPanel( wxWindow& parent ) : Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( GameFixesPanel::GodWar_Click ) ); } -bool Panels::GameFixesPanel::Apply( AppConfig& conf ) +void Panels::GameFixesPanel::Apply( AppConfig& conf ) { - return true; } void Panels::GameFixesPanel::FPUCompareHack_Click(wxCommandEvent &event) diff --git a/pcsx2/gui/Panels/PathsPanel.cpp b/pcsx2/gui/Panels/PathsPanel.cpp index 9d882ba836..7a07a936fe 100644 --- a/pcsx2/gui/Panels/PathsPanel.cpp +++ b/pcsx2/gui/Panels/PathsPanel.cpp @@ -114,20 +114,8 @@ Panels::PathsPanel::AdvancedPanel::AdvancedPanel( wxWindow& parent, int id ) : AddDirPicker( advanced, g_Conf->Folders.Settings, PathDefs::GetSettings, _("Settings:"), _("Select a folder for PCSX2 settings/inis"), Msg_Tooltips_SettingsPath ); - wxStaticBoxSizer& s_diag = *new wxStaticBoxSizer( wxVERTICAL, this, _("Default folder mode") ); - - AddStaticText( s_diag, - L"This setting only affects folders which are set to use the default folder configurations for your " - L"operating system. Any folders which are configured manually will override this option. ", - 400, wxALIGN_CENTRE ); - - AddRadioButton( s_diag, _("Use to your Documents folder"), _("Location: ") + wxStandardPaths::Get().GetDocumentsDir() ); - AddRadioButton( s_diag, _("Use the current working folder"), _("Location: ") + wxGetCwd() ); - - s_diag.AddSpacer( 4 ); - advanced.AddSpacer( 4 ); - advanced.Add( &s_diag, SizerFlags::StdGroupie() ); + advanced.Add( new UsermodeSelectionPanel( this ), SizerFlags::StdGroupie() ); s_main.Add( &advanced, SizerFlags::StdGroupie() ); s_main.AddSpacer( 5 ); @@ -150,7 +138,6 @@ Panels::PathsPanel::PathsPanel( wxWindow& parent ) : SetSizerAndFit( &s_main ); } -bool Panels::PathsPanel::Apply( AppConfig& conf ) +void Panels::PathsPanel::Apply( AppConfig& conf ) { - return true; } diff --git a/pcsx2/gui/Panels/PluginSelectorPanel.cpp b/pcsx2/gui/Panels/PluginSelectorPanel.cpp index 542734c1bf..ecf016bd0e 100644 --- a/pcsx2/gui/Panels/PluginSelectorPanel.cpp +++ b/pcsx2/gui/Panels/PluginSelectorPanel.cpp @@ -251,7 +251,7 @@ Panels::PluginSelectorPanel::~PluginSelectorPanel() safe_delete( m_EnumeratorThread ); } -bool Panels::PluginSelectorPanel::Apply( AppConfig& conf ) +void Panels::PluginSelectorPanel::Apply( AppConfig& conf ) { for( int i=0; iFolders.Plugins.ToString() ); conf.BaseFilenames.Plugins[tbl_PluginInfo[i].id] = relative.GetFullPath(); } - - return true; } void Panels::PluginSelectorPanel::DoRefresh() diff --git a/pcsx2/gui/Panels/SpeedhacksPanel.cpp b/pcsx2/gui/Panels/SpeedhacksPanel.cpp index 1c27315646..83befa9957 100644 --- a/pcsx2/gui/Panels/SpeedhacksPanel.cpp +++ b/pcsx2/gui/Panels/SpeedhacksPanel.cpp @@ -77,9 +77,8 @@ Panels::SpeedHacksPanel::SpeedHacksPanel( wxWindow& parent ) : Connect( wxEVT_COMMAND_CHECKBOX_CLICKED, wxCommandEventHandler( SpeedHacksPanel::IdleLoopFF_Click ) ); } -bool Panels::SpeedHacksPanel::Apply( AppConfig& conf ) +void Panels::SpeedHacksPanel::Apply( AppConfig& conf ) { - return true; } void Panels::SpeedHacksPanel::IOPCycleDouble_Click(wxCommandEvent &event) diff --git a/pcsx2/gui/main.cpp b/pcsx2/gui/main.cpp index 531a4e5638..f11a31c97e 100644 --- a/pcsx2/gui/main.cpp +++ b/pcsx2/gui/main.cpp @@ -31,6 +31,23 @@ IMPLEMENT_APP(Pcsx2App) AppConfig* g_Conf = NULL; wxFileHistory* g_RecentIsoList = NULL; +namespace Exception +{ + // -------------------------------------------------------------------------- + // Exception used to perfom an "errorless" termination of the app during OnInit + // procedures. This happens when a user cancels out of startup prompts/wizards. + // + class StartupAborted : public BaseException + { + public: + virtual ~StartupAborted() throw() {} + StartupAborted( const StartupAborted& src ) : BaseException( src ) {} + + explicit StartupAborted( const wxString& msg_eng=L"Startup initialization was aborted by the user." ) : + BaseException( msg_eng, msg_eng ) { } // english messages only for this exception. + }; +} + Pcsx2App::Pcsx2App() : m_ProgramLogBox( NULL ) , m_Ps2ConLogBox( NULL ) @@ -51,22 +68,38 @@ wxFileConfig* OpenConfig( const wxString& filename ) void Pcsx2App::ReadUserModeSettings() { - wxString configfile( Path::Combine( wxGetCwd(), L"usermode.ini" ) ); + wxFileName usermodefile( FilenameDefs::GetUsermodeConfig() ); + usermodefile.SetPath( wxGetCwd() ); - if( !wxFile::Exists( configfile ) ) + wxFileConfig* conf_usermode = OpenConfig( usermodefile.GetFullPath() ); + + if( !wxFile::Exists( usermodefile.GetFullPath() ) ) { - Dialogs::PickUserModeDialog( m_MainFrame ).ShowModal(); + // first time startup, so give the user the choice of user mode: + if( Dialogs::PickUserModeDialog( NULL ).ShowModal() == wxID_CANCEL ) + throw Exception::StartupAborted( L"Startup aborted: User cancelled Usermode selection." ); + + // Save user's new settings + if( conf_usermode != NULL ) + { + IniSaver saver( *conf_usermode ); + g_Conf->LoadSaveUserMode( saver ); + } + } + else + { + // usermode.ini exists -- assume Documents mode, unless the ini explicitly + // specifies otherwise. + g_Conf->UseAdminMode = false; + + if( conf_usermode != NULL ) + { + IniLoader loader( *conf_usermode ); + g_Conf->LoadSaveUserMode( loader ); + } } - wxFileConfig* conf_usermode = OpenConfig( Path::Combine( wxGetCwd(), L"usermode.ini" ) ); - - // Ensure proper scoping (IniLoader gets closed prior to delete) - { - IniLoader loader( *conf_usermode ); - g_Conf->LoadSaveUserMode( loader ); - } - - delete conf_usermode; + safe_delete( conf_usermode ); } // ------------------------------------------------------------------------ @@ -75,6 +108,8 @@ void Pcsx2App::ReadUserModeSettings() // bool Pcsx2App::TryOpenConfigCwd() { + ReadUserModeSettings(); + wxDirName inipath_cwd( (wxDirName)wxGetCwd() + PathDefs::Base::Settings() ); if( !inipath_cwd.IsReadable() ) return false; @@ -167,23 +202,34 @@ bool Pcsx2App::OnInit() // // Conveniently this dual mode setup applies equally well to most modern Linux distros. - if( !TryOpenConfigCwd() ) + try { - PathDefs::GetDocuments().Mkdir(); - PathDefs::GetSettings().Mkdir(); + if( !TryOpenConfigCwd() ) + { + PathDefs::GetDocuments().Mkdir(); + PathDefs::GetSettings().Mkdir(); - // Allow wx to use our config, and enforces auto-cleanup as well - wxString confile( Path::Combine( PathDefs::GetSettings(), FilenameDefs::GetConfig() ) ); - wxConfigBase::Set( OpenConfig( confile ) ); - wxConfigBase::Get()->SetRecordDefaults(); + // Allow wx to use our config, and enforces auto-cleanup as well + wxString confile( Path::Combine( PathDefs::GetSettings(), FilenameDefs::GetConfig() ) ); + wxConfigBase::Set( OpenConfig( confile ) ); + wxConfigBase::Get()->SetRecordDefaults(); + } + g_Conf->Load(); + g_Conf->Apply(); + + g_Conf->Folders.Logs.Mkdir(); + + m_ProgramLogBox = new ConsoleLogFrame( NULL, L"PCSX2 Program Log" ); + m_Ps2ConLogBox = m_ProgramLogBox; // just use a single logger for now. + m_ProgramLogBox->Hide(); + //m_Ps2ConLogBox = new ConsoleLogFrame( NULL, L"PS2 Console Log" ); + + SysInit(); } - - g_Conf->Load(); - g_Conf->Apply(); - - m_ProgramLogBox = new ConsoleLogFrame( NULL, L"PCSX2 Program Log" ); - m_Ps2ConLogBox = m_ProgramLogBox; // just use a single logger for now. - //m_Ps2ConLogBox = new ConsoleLogFrame( NULL, L"PS2 Console Log" ); + catch( Exception::StartupAborted& ) + { + return false; + } m_MainFrame = new MainEmuFrame( NULL, L"PCSX2" ); SetTopWindow( m_MainFrame ); diff --git a/pcsx2/gui/wxHelpers.cpp b/pcsx2/gui/wxHelpers.cpp index 55c270f26c..01559c69c9 100644 --- a/pcsx2/gui/wxHelpers.cpp +++ b/pcsx2/gui/wxHelpers.cpp @@ -175,9 +175,9 @@ wxCheckBox& wxDialogWithHelpers::AddCheckBox( wxSizer& sizer, const wxString& la return wxHelpers::AddCheckBoxTo( this, sizer, label, id ); } -wxStaticText& wxDialogWithHelpers::AddStaticText(wxSizer& sizer, const wxString& label, int size ) +wxStaticText& wxDialogWithHelpers::AddStaticText(wxSizer& sizer, const wxString& label, int size, int alignFlags ) { - return wxHelpers::AddStaticTextTo( this, sizer, label, size ); + return wxHelpers::AddStaticTextTo( this, sizer, label, size, alignFlags ); } void wxDialogWithHelpers::AddOkCancel( wxSizer &sizer, bool hasApply ) diff --git a/pcsx2/gui/wxHelpers.h b/pcsx2/gui/wxHelpers.h index d974cf4010..ad687397f5 100644 --- a/pcsx2/gui/wxHelpers.h +++ b/pcsx2/gui/wxHelpers.h @@ -33,7 +33,7 @@ public: protected: wxCheckBox& AddCheckBox( wxSizer& sizer, const wxString& label, wxWindowID id=wxID_ANY ); - wxStaticText& AddStaticText(wxSizer& sizer, const wxString& label, int size=0 ); + wxStaticText& AddStaticText(wxSizer& sizer, const wxString& label, int size=0, int alignFlags=wxALIGN_LEFT ); void AddOkCancel( wxSizer& sizer, bool hasApply=false ); }; diff --git a/pcsx2/windows/VCprojects/pcsx2_2008.vcproj b/pcsx2/windows/VCprojects/pcsx2_2008.vcproj index b6c78e9fbc..91bb8238db 100644 --- a/pcsx2/windows/VCprojects/pcsx2_2008.vcproj +++ b/pcsx2/windows/VCprojects/pcsx2_2008.vcproj @@ -1966,6 +1966,10 @@ RelativePath="..\..\gui\MainFrame.h" > + + @@ -2138,6 +2142,10 @@ RelativePath="..\WinCompressNTFS.cpp" > + + diff --git a/pcsx2/windows/Win32.h b/pcsx2/windows/Win32.h index f672aecdd2..c0e3de47b4 100644 --- a/pcsx2/windows/Win32.h +++ b/pcsx2/windows/Win32.h @@ -19,10 +19,6 @@ #pragma once #include "Utilities/RedtapeWindows.h" // our "safe" include of windows (sets version and undefs uselessness) -#include - -#include -#include #include "System.h" #include "HostGui.h" @@ -36,18 +32,7 @@ int SysPageFaultExceptionFilter(EXCEPTION_POINTERS* eps); #define PCSX2_MEM_PROTECT_BEGIN() __try { #define PCSX2_MEM_PROTECT_END() } __except(SysPageFaultExceptionFilter(GetExceptionInformation())) {} - -// --->> Ini Configuration [ini.c] - -extern char g_WorkingFolder[g_MaxPath]; -extern const char* g_CustomConfigFile; - -bool LoadConfig(); -void SaveConfig(); - -// <<--- END Ini Configuration [ini.c] - -// --->> Patch Browser Stuff (in the event we ever use it +// --->> Patch Browser Stuff (in the event we ever use it) void ListPatches (HWND hW); int ReadPatch (HWND hW, char fileName[1024]); @@ -56,114 +41,13 @@ BOOL Save_Patch_Proc( char * filename ); // <<--- END Patch Browser -struct AppData -{ - HWND hWnd; // Main window handle - HINSTANCE hInstance; // Application instance - HMENU hMenu; // Main window menu -}; - -class IniFile -{ -protected: - wxString m_filename; - wxString m_section; - -public: - virtual ~IniFile(); - IniFile(); - - void SetCurrentSection( const wxString& newsection ); - - virtual void Entry( const wxString& var, wxString& value, const wxString& defvalue=wxString() )=0; - virtual void Entry( const wxString& var, char (&value)[g_MaxPath], const wxString& defvalue=wxString() )=0; - virtual void Entry( const wxString& var, int& value, const int defvalue=0 )=0; - virtual void Entry( const wxString& var, uint& value, const uint defvalue=0 )=0; - virtual void Entry( const wxString& var, bool& value, const bool defvalue=0 )=0; - virtual void EnumEntry( const wxString& var, int& value, const char* const* enumArray, const int defvalue=0 )=0; - - void DoConfig( PcsxConfig& Conf ); - void MemcardSettings( PcsxConfig& Conf ); -}; - -class IniFileLoader : public IniFile -{ -protected: - SafeArray m_workspace; - -public: - virtual ~IniFileLoader(); - IniFileLoader(); - - void Entry( const wxString& var, wxString& value, const wxString& defvalue=wxString() ); - void Entry( const wxString& var, char (&value)[g_MaxPath], const wxString& defvalue=wxString() ); - void Entry( const wxString& var, int& value, const int defvalue=0 ); - void Entry( const wxString& var, uint& value, const uint defvalue=0 ); - void Entry( const wxString& var, bool& value, const bool defvalue=false ); - void EnumEntry( const wxString& var, int& value, const char* const* enumArray, const int defvalue=0 ); -}; - -class IniFileSaver : public IniFile -{ -public: - virtual ~IniFileSaver(); - IniFileSaver(); - - void Entry( const wxString& var, const wxString& value, const wxString& defvalue=wxString() ); - void Entry( const wxString& var, wxString& value, const wxString& defvalue=wxString() ); - void Entry( const wxString& var, char (&value)[g_MaxPath], const wxString& defvalue=wxString() ); - void Entry( const wxString& var, int& value, const int defvalue=0 ); - void Entry( const wxString& var, uint& value, const uint defvalue=0 ); - void Entry( const wxString& var, bool& value, const bool defvalue=false ); - void EnumEntry( const wxString& var, int& value, const char* const* enumArray, const int defvalue=0 ); -}; - -extern LRESULT WINAPI MainWndProc(HWND, UINT, WPARAM, LPARAM); -extern void CreateMainWindow(); -extern void RunGui(); -extern bool HostGuiInit(); - -extern BOOL Pcsx2Configure(HWND hWnd); -extern void InitLanguages(); -extern char *GetLanguageNext(); -extern void CloseLanguages(); -extern void ChangeLanguage(char *lang); - -extern void WinClose(); -extern void ExecuteCpu(); -extern void OnStates_LoadOther(); -extern void OnStates_SaveOther(); -extern int ParseCommandLine( int tokenCount, TCHAR *const *const tokens ); - -extern BOOL CALLBACK PatchBDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam); -extern BOOL CALLBACK CpuDlgProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam); -extern BOOL CALLBACK AdvancedOptionsProc(HWND hW, UINT uMsg, WPARAM wParam, LPARAM lParam); -//extern BOOL CALLBACK HacksProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam); - -extern AppData gApp; -extern HWND hStatusWnd; -extern PcsxConfig winConfig; // local storage of the configuration options. - -extern bool nDisableSC; // screensaver -extern unsigned int langsMax; - extern SafeArray* g_RecoveryState; extern SafeArray* g_gsRecoveryState; extern const char* g_pRunGSState; extern int g_SaveGSStream; -// Throws an exception based on the value returned from GetLastError. -// Performs an option return value success/fail check on hresult. extern void StreamException_ThrowLastError( const wxString& streamname, HANDLE result=INVALID_HANDLE_VALUE ); - -// Throws an exception based on the given error code (usually taken from ANSI C's errno) extern void StreamException_ThrowFromErrno( const wxString& streamname, errno_t errcode ); - extern bool StreamException_LogFromErrno( const wxString& streamname, const wxChar* action, errno_t result ); extern bool StreamException_LogLastError( const wxString& streamname, const wxChar* action, HANDLE result=INVALID_HANDLE_VALUE ); -// Sets the NTFS compression flag for a directory or file. This function does not operate -// recursively. Set compressStatus to false to decompress compressed files (and do nothing -// to already decompressed files). -extern void NTFS_CompressFile( const wxString& file, bool compressStatus=true ); - diff --git a/pcsx2/windows/WinCompressNTFS.cpp b/pcsx2/windows/WinCompressNTFS.cpp index 9064007129..36f4e6cb41 100644 --- a/pcsx2/windows/WinCompressNTFS.cpp +++ b/pcsx2/windows/WinCompressNTFS.cpp @@ -19,6 +19,7 @@ #include "Win32.h" // Translates an Errno code into an exception. +// Throws an exception based on the given error code (usually taken from ANSI C's errno) void StreamException_ThrowFromErrno( const wxString& streamname, errno_t errcode ) { if( errcode == 0 ) return; @@ -53,6 +54,8 @@ void StreamException_ThrowFromErrno( const wxString& streamname, errno_t errcode } } +// Throws an exception based on the value returned from GetLastError. +// Performs an option return value success/fail check on hresult. void StreamException_ThrowLastError( const wxString& streamname, HANDLE result ) { if( result != INVALID_HANDLE_VALUE ) return; @@ -118,7 +121,13 @@ bool StreamException_LogLastError( const wxString& streamname, const wxChar* act return false; } -// Exceptions thrown: None. Errors are logged to console. Failures are considered non-critical +// Sets the NTFS compression flag for a directory or file. This function does not operate +// recursively. Set compressStatus to false to decompress compressed files (and do nothing +// to already decompressed files). +// +// Exceptions thrown: None. +// (Errors are logged to console. Failures are considered non-critical) +// void NTFS_CompressFile( const wxString& file, bool compressStatus ) { bool isFile = !wxDirExists( file ); diff --git a/pcsx2/windows/WinSysExec.cpp b/pcsx2/windows/WinSysExec.cpp index e5518ab20c..b21b625a7a 100644 --- a/pcsx2/windows/WinSysExec.cpp +++ b/pcsx2/windows/WinSysExec.cpp @@ -16,30 +16,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */ +#include "PrecompiledHeader.h" #include "Win32.h" + #include - #include "Common.h" -#include "VUmicro.h" -#include "iR5900.h" - -// temporary hack to keep this code compiling. -//static const char* _( const char* src ) { return src; } - - -static bool sinit = false; -bool nDisableSC = false; // screensaver - -// This instance is not modified by command line overrides so -// that command line plugins and stuff won't be saved into the -// user's conf file accidentally. -PcsxConfig winConfig; // local storage of the configuration options. - -HWND hStatusWnd = NULL; -AppData gApp; - -const char* g_pRunGSState = NULL; int SysPageFaultExceptionFilter( EXCEPTION_POINTERS* eps ) { @@ -61,45 +43,6 @@ int SysPageFaultExceptionFilter( EXCEPTION_POINTERS* eps ) return EXCEPTION_CONTINUE_EXECUTION; } -static void CreateDirs() -{ - Path::CreateDirectory(MEMCARDS_DIR); - Path::CreateDirectory(SSTATES_DIR); - Path::CreateDirectory(SNAPSHOTS_DIR); -} - -/* -bool HostGuiInit() -{ - if( sinit ) return true; - sinit = true; - - CreateDirs(); - - // Set the compression attribute on the Memcards folder. - // Memcards generally compress very well via NTFS compression. - - NTFS_CompressFile( MEMCARDS_DIR, Config.McdEnableNTFS ); - -#ifdef OLD_TESTBUILD_STUFF - if( IsDevBuild && emuLog == NULL && g_TestRun.plogname != NULL ) - emuLog = fopen(g_TestRun.plogname, "w"); -#endif - if( emuLog == NULL ) - emuLog = fopen(LOGS_DIR "\\emuLog.txt","w"); - - PCSX2_MEM_PROTECT_BEGIN(); - SysDetect(); - if( !SysAllocateMem() ) - return false; // critical memory allocation failure; - - SysAllocateDynarecs(); - PCSX2_MEM_PROTECT_END(); - - return true; -} -*/ - namespace HostSys { void *Mmap(uptr base, u32 size)