* Major bugfix to the startup/user path settings code (should fix issues some people were having when trying to run multiple copies of pcsx2 from different folders).
 * Various bugfixes to panel appearances
 * Win32: "stdio" console output now redirects to theVisual Studio Debug Output window, since Stdout is generally useless on windows.

Emulation:
 * Removed the IOP SIF hack since it never did what I was hoping it would do anyway.

git-svn-id: http://pcsx2.googlecode.com/svn/trunk@3176 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
Jake.Stine 2010-06-06 04:17:43 +00:00
parent 6632f857bd
commit 6fdb282c81
10 changed files with 84 additions and 94 deletions

View File

@ -17,6 +17,8 @@
#include "Threading.h" #include "Threading.h"
#include "TlsVariable.inl" #include "TlsVariable.inl"
#include "RedtapeWindows.h"
using namespace Threading; using namespace Threading;
// thread-local console indentation setting. // thread-local console indentation setting.
@ -135,18 +137,30 @@ static __forceinline const wxChar* GetLinuxConsoleColor(ConsoleColors color)
// One possible default write action at startup and shutdown is to use the stdout. // One possible default write action at startup and shutdown is to use the stdout.
static void __concall ConsoleStdout_DoWrite( const wxString& fmt ) static void __concall ConsoleStdout_DoWrite( const wxString& fmt )
{ {
#ifdef __WXMSW__
OutputDebugString( fmt );
#else
wxPrintf( fmt ); wxPrintf( fmt );
#endif
} }
// Default write action at startup and shutdown is to use the stdout. // Default write action at startup and shutdown is to use the stdout.
static void __concall ConsoleStdout_DoWriteLn( const wxString& fmt ) static void __concall ConsoleStdout_DoWriteLn( const wxString& fmt )
{ {
#ifdef __WXMSW__
OutputDebugString( fmt + L"\n" );
#else
wxPrintf( fmt + L"\n" ); wxPrintf( fmt + L"\n" );
#endif
} }
static void __concall ConsoleStdout_Newline() static void __concall ConsoleStdout_Newline()
{ {
#ifdef __WXMSW__
OutputDebugString( L"\n" );
#else
wxPrintf( L"\n" ); wxPrintf( L"\n" );
#endif
} }
static void __concall ConsoleStdout_DoSetColor( ConsoleColors color ) static void __concall ConsoleStdout_DoSetColor( ConsoleColors color )
@ -170,10 +184,9 @@ const IConsoleWriter ConsoleWriter_Stdout =
ConsoleStdout_DoWriteLn, ConsoleStdout_DoWriteLn,
ConsoleStdout_DoSetColor, ConsoleStdout_DoSetColor,
ConsoleNull_DoWrite, // writes from stdout are ignored here, lest we create infinite loop hell >_< ConsoleNull_DoWrite, // writes from re-piped stdout are ignored here, lest we create infinite loop hell >_<
ConsoleStdout_Newline, ConsoleStdout_Newline,
ConsoleStdout_SetTitle, ConsoleStdout_SetTitle,
0, // instance-level indentation (should always be 0) 0, // instance-level indentation (should always be 0)
}; };
@ -531,7 +544,7 @@ bool IConsoleWriter::WriteFromStdout( ConsoleColors color, const char* fmt, ...
va_list args; va_list args;
va_start(args,fmt); va_start(args,fmt);
ConsoleColorScope cs( color ); ConsoleColorScope cs( color );
DoWrite( FastFormatString_Ascii(fmt, args) ); DoWriteFromStdout( FastFormatString_Ascii(fmt, args) );
va_end(args); va_end(args);
return false; return false;
@ -541,16 +554,8 @@ bool IConsoleWriter::WriteFromStdout( ConsoleColors color, const char* fmt, ...
// -------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------
// Default Writer for C++ init / startup: // Default Writer for C++ init / startup:
// -------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------
// In GUI modes under Windows I default to Assert, because windows lacks a qualified universal
// program console. In console mode I use Stdio instead, since the program is pretty well
// promised a valid console in any platform (except maybe Macs, which probably consider consoles
// a fundamental design flaw or something).
#if wxUSE_GUI && defined(__WXMSW__) #define _DefaultWriter_ ConsoleWriter_Stdout
# define _DefaultWriter_ ConsoleWriter_Assert
#else
# define _DefaultWriter_ ConsoleWriter_Stdout
#endif
// Important! Only Assert and Null console loggers are allowed for initial console targeting. // Important! Only Assert and Null console loggers are allowed for initial console targeting.
// Other log targets rely on the static buffer and a threaded mutex lock, which are only valid // Other log targets rely on the static buffer and a threaded mutex lock, which are only valid

View File

@ -80,7 +80,7 @@ void pxRadioPanel::Realize()
{ {
m_objects[i].SubTextObj = NULL; m_objects[i].SubTextObj = NULL;
if( m_buttonStrings[i].SubText.IsEmpty() ) continue; if( m_buttonStrings[i].SubText.IsEmpty() ) continue;
m_objects[i].SubTextObj = new pxStaticText( this, m_buttonStrings[i].SubText ); m_objects[i].SubTextObj = new pxStaticText( this, m_buttonStrings[i].SubText, wxALIGN_LEFT );
} }
pxAssert( GetSizer() != NULL ); pxAssert( GetSizer() != NULL );

View File

@ -159,10 +159,10 @@ wxSize pxStaticText::GetBestWrappedSize( const wxClientDC& dc ) const
if( idealWidth <= 0 ) if( idealWidth <= 0 )
{ {
// FIXME: The minimum size of this control is unknown, so let's just pick a guess based on some // FIXME: The minimum size of this control is unknown, so let's just pick a guess based on
// heuristics of the string content.. maybe? For now I just return 360. It's round. And happy. // the size of the user's display area.
idealWidth = 360; idealWidth = (int)(wxGetDisplaySize().GetWidth() * 0.66) - (parentalAdjust*2);
} }
wxString label(GetLabel()); wxString label(GetLabel());

View File

@ -621,8 +621,5 @@ TraceLogFilters& SetTraceConfig();
// commented, so this is for development purposes only. // commented, so this is for development purposes only.
#define ENABLE_LOADING_PS1_GAMES 0 #define ENABLE_LOADING_PS1_GAMES 0
// Change to 1 to enable SIF wakeup hack:
#define IOP_ENABLE_SIF_HACK 0
// Change to 1 to cause all logs to be written to the console. (Very slow) // Change to 1 to cause all logs to be written to the console. (Very slow)
#define LOG_TO_CONSOLE 0 #define LOG_TO_CONSOLE 0

View File

@ -195,10 +195,6 @@ static __forceinline void _psxTestInterrupts()
#endif #endif
IopTestEvent(IopEvt_CdvdRead, cdvdReadInterrupt); IopTestEvent(IopEvt_CdvdRead, cdvdReadInterrupt);
#if IOP_ENABLE_SIF_HACK
IopTestEvent(IopEvt_SIFhack, sifHackInterrupt);
#endif
// Profile-guided Optimization (sorta) // Profile-guided Optimization (sorta)
// The following ints are rarely called. Encasing them in a conditional // The following ints are rarely called. Encasing them in a conditional
// as follows helps speed up most games. // as follows helps speed up most games.
@ -250,20 +246,6 @@ __releaseinline void psxBranchTest()
psxRegs.interrupt &= ~IopEvt_SIFhack; psxRegs.interrupt &= ~IopEvt_SIFhack;
} }
} }
if( IOP_ENABLE_SIF_HACK && !iopBranchAction && !(psxRegs.interrupt & IopEvt_SIFhack) )
{
// Safeguard: since we're not executing an exception vector, we should schedule a SIF wakeup
// just in case. (and don't reschedule it if it's already scheduled, since that would just
// delay the previously scheduled one, and we don't want that)
// (TODO: The endless loop in question is a branch instruction that branches to itself endlessly,
// waiting for SIF to wake it up via any cpuException. We could check for that instruction
// location and only schedule a SIF fix when it's detected... But for now this is easy and gives
// us good control over testing parameters...)
PSX_INT( IopEvt_SIFhack, 96 );
}
} }
void iopTestIntc() void iopTestIntc()

View File

@ -107,7 +107,7 @@ TraceLogFilters& SetTraceConfig()
// This function should be called once during program execution. // This function should be called once during program execution.
void SysLogMachineCaps() void SysLogMachineCaps()
{ {
Console.WriteLn( Color_StrongGreen, "PCSX2 %d.%d.%d.r%d %s - compiled on " __DATE__, PCSX2_VersionHi, PCSX2_VersionMid, PCSX2_VersionLo, Console.WriteLn( Color_StrongGreen, "PCSX2 %u.%u.%u.r%d %s - compiled on " __DATE__, PCSX2_VersionHi, PCSX2_VersionMid, PCSX2_VersionLo,
SVN_REV, SVN_MODS ? "(modded)" : "" SVN_REV, SVN_MODS ? "(modded)" : ""
); );

View File

@ -557,7 +557,7 @@ public:
ConsoleLogFrame* GetProgramLog(); ConsoleLogFrame* GetProgramLog();
const ConsoleLogFrame* GetProgramLog() const; const ConsoleLogFrame* GetProgramLog() const;
void ProgramLog_PostEvent( wxEvent& evt ); void ProgramLog_PostEvent( wxEvent& evt );
void EnableAllLogging() const; void EnableAllLogging();
void DisableWindowLogging() const; void DisableWindowLogging() const;
void DisableDiskLogging() const; void DisableDiskLogging() const;
void OnProgramLogClosed( wxWindowID id ); void OnProgramLogClosed( wxWindowID id );

View File

@ -26,6 +26,8 @@
#include <wx/intl.h> #include <wx/intl.h>
#include <wx/stdpaths.h> #include <wx/stdpaths.h>
using namespace pxSizerFlags;
static bool m_ForceWizard = false; static bool m_ForceWizard = false;
static void CpuCheckSSE2() static void CpuCheckSSE2()
@ -59,7 +61,7 @@ void Pcsx2App::WipeUserModeSettings()
if( !usrlocaldir.Exists() ) return; if( !usrlocaldir.Exists() ) return;
wxString cwd( Path::Normalize( wxGetCwd() ) ); wxString cwd( Path::Normalize( wxGetCwd() ) );
u32 hashres = HashTools::Hash( (char*)cwd.c_str(), cwd.Length() ); u32 hashres = HashTools::Hash( (char*)cwd.c_str(), cwd.Length()*sizeof(wxChar) );
wxFileName usermodefile( FilenameDefs::GetUsermodeConfig() ); wxFileName usermodefile( FilenameDefs::GetUsermodeConfig() );
usermodefile.SetPath( usrlocaldir.ToString() ); usermodefile.SetPath( usrlocaldir.ToString() );
@ -89,7 +91,7 @@ void Pcsx2App::ReadUserModeSettings()
} }
wxString cwd( Path::Normalize( wxGetCwd() ) ); wxString cwd( Path::Normalize( wxGetCwd() ) );
u32 hashres = HashTools::Hash( (char*)cwd.c_str(), cwd.Length() ); u32 hashres = HashTools::Hash( (char*)cwd.c_str(), cwd.Length()*sizeof(wxChar) );
wxFileName usermodefile( FilenameDefs::GetUsermodeConfig() ); wxFileName usermodefile( FilenameDefs::GetUsermodeConfig() );
usermodefile.SetPath( usrlocaldir.ToString() ); usermodefile.SetPath( usrlocaldir.ToString() );
@ -97,20 +99,6 @@ void Pcsx2App::ReadUserModeSettings()
wxString groupname( wxsFormat( L"CWD.%08x", hashres ) ); wxString groupname( wxsFormat( L"CWD.%08x", hashres ) );
if (IOP_ENABLE_SIF_HACK == 1)
{
wxDialogWithHelpers hackedVersion( NULL, _("It will devour your young! - PCSX2 Shub-Niggurath edition") );
hackedVersion.SetMinWidth( 520 );
hackedVersion += hackedVersion.Text(
L"NOTICE!! This is a version of Pcsx2 with hacks enabled meant for developers only. "
L"It will likely crash on all games, devour your young, and make you an object of shame and disgrace among your family and friends. "
L"Do not report any bugs with this version if you received this popup. \n\nYou have been warned. "
);
hackedVersion += new wxButton( &hackedVersion, wxID_OK ) | pxSizerFlags::StdCenter();
hackedVersion.ShowModal();
}
bool hasGroup = conf_usermode->HasGroup( groupname ); bool hasGroup = conf_usermode->HasGroup( groupname );
bool forceWiz = m_ForceWizard || !hasGroup; bool forceWiz = m_ForceWizard || !hasGroup;
@ -124,20 +112,21 @@ void Pcsx2App::ReadUserModeSettings()
if( forceWiz ) if( forceWiz )
{ {
// Beta Warning! // Beta Warning!
#if 0
if( !hasGroup ) if( !hasGroup )
{ {
wxDialogWithHelpers beta( NULL, _("PCSX2 0.9.7 Beta") ); wxDialogWithHelpers beta( NULL, wxsFormat(_("Welcome to PCSX2 %u.%u.%u (r%u)")), PCSX2_VersionHi, PCSX2_VersionMid, PCSX2_VersionLo, SVN_REV );
beta.SetMinWidth(480);
beta += new pxStaticText( &beta, beta += beta.Heading(
L"This is a *Beta* build of PCSX2 0.9.7. We are in the middle of major rewrites of the " L"a work-in-progress. We are in the middle of major rewrites of the user interface, and some parts "
L"user interface, and some parts of the program have *NOT* been implemented yet. Options will be missing. " L"of the program have *NOT* been re-implemented yet. Options will be missing or disabled. Horrible crashes might be present. Enjoy!"
L"Some things may crash or hang without warning.", wxALIGN_CENTER ) | StdExpand();
);
beta += new wxButton( &beta, wxID_OK ) | pxSizerFlags::StdCenter(); beta += new wxButton( &beta, wxID_OK ) | StdCenter();
beta.ShowModal(); beta.ShowModal();
} }
#endif
// first time startup, so give the user the choice of user mode: // first time startup, so give the user the choice of user mode:
FirstTimeWizard wiz( NULL ); FirstTimeWizard wiz( NULL );
@ -200,10 +189,6 @@ void Pcsx2App::DetectCpuAndUserMode()
ReadUserModeSettings(); ReadUserModeSettings();
AppConfig_OnChangedSettingsFolder(); AppConfig_OnChangedSettingsFolder();
PostAppMethod( &Pcsx2App::OpenMainFrame );
PostAppMethod( &Pcsx2App::OpenProgramLog );
PostAppMethod( &Pcsx2App::AllocateCoreStuffs );
} }
void Pcsx2App::OpenMainFrame() void Pcsx2App::OpenMainFrame()
@ -411,26 +396,25 @@ typedef void (wxEvtHandler::*pxStuckThreadEventHandler)(pxMessageBoxEvent&);
bool Pcsx2App::OnInit() bool Pcsx2App::OnInit()
{ {
EnableAllLogging();
Console.WriteLn("Interface is initializing. Entering Pcsx2App::OnInit!");
InitCPUTicks(); InitCPUTicks();
pxDoAssert = AppDoAssert;
g_Conf = new AppConfig();
wxInitAllImageHandlers();
Console.WriteLn("Begin parsing commandline...");
if( !_parent::OnInit() ) return false;
wxLocale::AddCatalogLookupPathPrefix( wxGetCwd() );
#define pxAppMethodEventHandler(func) \ #define pxAppMethodEventHandler(func) \
(wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(pxInvokeAppMethodEventFunction, &func ) (wxObjectEventFunction)(wxEventFunction)wxStaticCastEvent(pxInvokeAppMethodEventFunction, &func )
pxDoAssert = AppDoAssert; Connect( pxID_PadHandler_Keydown, wxEVT_KEY_DOWN, wxKeyEventHandler (Pcsx2App::OnEmuKeyDown) );
Connect( wxEVT_DESTROY, wxWindowDestroyEventHandler (Pcsx2App::OnDestroyWindow) );
g_Conf = new AppConfig();
EnableAllLogging();
wxInitAllImageHandlers();
if( !_parent::OnInit() ) return false;
m_StdoutRedirHandle = NewPipeRedir(stdout);
m_StderrRedirHandle = NewPipeRedir(stderr);
wxLocale::AddCatalogLookupPathPrefix( wxGetCwd() );
Connect( pxID_PadHandler_Keydown, wxEVT_KEY_DOWN, wxKeyEventHandler (Pcsx2App::OnEmuKeyDown) );
Connect( wxEVT_DESTROY, wxWindowDestroyEventHandler (Pcsx2App::OnDestroyWindow) );
// User/Admin Mode Dual Setup: // User/Admin Mode Dual Setup:
// PCSX2 now supports two fundamental modes of operation. The default is Classic mode, // PCSX2 now supports two fundamental modes of operation. The default is Classic mode,
@ -453,9 +437,12 @@ bool Pcsx2App::OnInit()
#ifdef __WXMSW__ #ifdef __WXMSW__
pxDwm_Load(); pxDwm_Load();
#endif #endif
SysExecutorThread.Start(); SysExecutorThread.Start();
DetectCpuAndUserMode(); DetectCpuAndUserMode();
PostAppMethod( &Pcsx2App::OpenMainFrame );
PostAppMethod( &Pcsx2App::OpenProgramLog );
PostAppMethod( &Pcsx2App::AllocateCoreStuffs );
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
catch( Exception::StartupAborted& ex ) // user-aborted, no popups needed. catch( Exception::StartupAborted& ex ) // user-aborted, no popups needed.

View File

@ -821,13 +821,13 @@ typedef void __concall DoWriteFn(const wxString&);
static const IConsoleWriter ConsoleWriter_Window = static const IConsoleWriter ConsoleWriter_Window =
{ {
ConsoleToWindow_DoWrite<ConsoleWriter_Null>, ConsoleToWindow_DoWrite<ConsoleWriter_Stdout>,
ConsoleToWindow_DoWriteLn<ConsoleWriter_Null>, ConsoleToWindow_DoWriteLn<ConsoleWriter_Stdout>,
ConsoleToWindow_DoSetColor<ConsoleWriter_Null>, ConsoleToWindow_DoSetColor<ConsoleWriter_Stdout>,
ConsoleToWindow_DoWrite<ConsoleWriter_Null>, ConsoleToWindow_DoWrite<ConsoleWriter_Stdout>,
ConsoleToWindow_Newline<ConsoleWriter_Null>, ConsoleToWindow_Newline<ConsoleWriter_Stdout>,
ConsoleToWindow_SetTitle<ConsoleWriter_Null>, ConsoleToWindow_SetTitle<ConsoleWriter_Stdout>,
}; };
static const IConsoleWriter ConsoleWriter_WindowAndFile = static const IConsoleWriter ConsoleWriter_WindowAndFile =
@ -841,14 +841,29 @@ static const IConsoleWriter ConsoleWriter_WindowAndFile =
ConsoleToWindow_SetTitle<ConsoleWriter_File>, ConsoleToWindow_SetTitle<ConsoleWriter_File>,
}; };
void Pcsx2App::EnableAllLogging() const void Pcsx2App::EnableAllLogging()
{ {
const bool logBoxOpen = (GetProgramLog() != NULL); const bool logBoxOpen = (GetProgramLog() != NULL);
const IConsoleWriter* newHandler = NULL;
if( emuLog ) if( emuLog )
Console_SetActiveHandler( logBoxOpen ? (IConsoleWriter&)ConsoleWriter_WindowAndFile : (IConsoleWriter&)ConsoleWriter_File ); {
if( !m_StdoutRedirHandle ) m_StdoutRedirHandle = NewPipeRedir(stdout);
if( !m_StderrRedirHandle ) m_StderrRedirHandle = NewPipeRedir(stderr);
newHandler = logBoxOpen ? (IConsoleWriter*)&ConsoleWriter_WindowAndFile : (IConsoleWriter*)&ConsoleWriter_File;
}
else else
Console_SetActiveHandler( logBoxOpen ? (IConsoleWriter&)ConsoleWriter_Window : (IConsoleWriter&)ConsoleWriter_Stdout ); {
if( logBoxOpen )
{
if( !m_StdoutRedirHandle ) m_StdoutRedirHandle = NewPipeRedir(stdout);
if( !m_StderrRedirHandle ) m_StderrRedirHandle = NewPipeRedir(stderr);
newHandler = &ConsoleWriter_Window;
}
else
newHandler = &ConsoleWriter_Stdout;
}
Console_SetActiveHandler( *newHandler );
} }
// Used to disable the emuLog disk logger, typically used when disabling or re-initializing the // Used to disable the emuLog disk logger, typically used when disabling or re-initializing the

View File

@ -61,6 +61,7 @@ Panels::DocsFolderPickerPanel::DocsFolderPickerPanel( wxWindow* parent, bool isF
m_radio_UserMode = new pxRadioPanel( this, UsermodeOptions ); m_radio_UserMode = new pxRadioPanel( this, UsermodeOptions );
m_radio_UserMode->SetPaddingHoriz( m_radio_UserMode->GetPaddingVert() + 4 ); m_radio_UserMode->SetPaddingHoriz( m_radio_UserMode->GetPaddingVert() + 4 );
m_radio_UserMode->Realize(); m_radio_UserMode->Realize();
if( pxStaticText* woot = m_radio_UserMode->GetSubText(0) ) woot->Unwrapped(); // wrapping sucks for path names!
m_dirpicker_custom = new DirPickerPanel( this, FolderId_Documents, _("Select a document root for PCSX2") ); m_dirpicker_custom = new DirPickerPanel( this, FolderId_Documents, _("Select a document root for PCSX2") );
@ -96,7 +97,10 @@ void Panels::DocsFolderPickerPanel::OnRadioChanged( wxCommandEvent& evt )
if( !m_radio_UserMode ) return; if( !m_radio_UserMode ) return;
if( m_dirpicker_custom ) if( m_dirpicker_custom )
m_dirpicker_custom->Enable( m_radio_UserMode->GetSelection() == (int)DocsFolder_Custom ); m_dirpicker_custom->Enable( m_radio_UserMode->GetSelection() == (int)DocsFolder_Custom );
if( pxStaticText* woot = m_radio_UserMode->GetSubText(0) )
woot->Enable( m_radio_UserMode->GetSelection() == (int)DocsFolder_User );
} }
// -------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------