mirror of https://github.com/PCSX2/pcsx2.git
wxgui: Improved threading model used by the log window, plus a few minor fixes to main window startup/shutdown code.
git-svn-id: http://pcsx2.googlecode.com/svn/branches/wxgui@1572 96395faa-99c1-11dd-bbfe-3dabce05a288
This commit is contained in:
parent
3751c928d3
commit
6566f6a018
|
@ -52,7 +52,10 @@ public:
|
||||||
wxPoint DisplayPosition;
|
wxPoint DisplayPosition;
|
||||||
wxSize DisplaySize;
|
wxSize DisplaySize;
|
||||||
|
|
||||||
void LoadSave( IniInterface& conf );
|
// Size of the font in points.
|
||||||
|
int FontSize;
|
||||||
|
|
||||||
|
void LoadSave( IniInterface& conf, const wxChar* title );
|
||||||
};
|
};
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
@ -213,7 +216,8 @@ public:
|
||||||
SpeedhackOptions Speedhacks;
|
SpeedhackOptions Speedhacks;
|
||||||
GamefixOptions Gamefixes;
|
GamefixOptions Gamefixes;
|
||||||
VideoOptions Video;
|
VideoOptions Video;
|
||||||
ConsoleLogOptions ConLogBox;
|
ConsoleLogOptions ProgLogBox;
|
||||||
|
ConsoleLogOptions Ps2ConBox;
|
||||||
FolderOptions Folders;
|
FolderOptions Folders;
|
||||||
FilenameOptions BaseFilenames;
|
FilenameOptions BaseFilenames;
|
||||||
McdSysOptions MemoryCards;
|
McdSysOptions MemoryCards;
|
||||||
|
|
|
@ -203,13 +203,6 @@ DEV9handler dev9Handler;
|
||||||
USBhandler usbHandler;
|
USBhandler usbHandler;
|
||||||
uptr pDsp;
|
uptr pDsp;
|
||||||
|
|
||||||
|
|
||||||
void PopulateListCtrls( const wxString& plugpath )
|
|
||||||
{
|
|
||||||
//if( CheckVersion( "GS", PS2E_LT_GS, PS2E_GS_VERSION ) )
|
|
||||||
// AddPlugin(hWC_GS, winConfig.GS);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
int OpenPlugins(const char* pTitleFilename)
|
int OpenPlugins(const char* pTitleFilename)
|
||||||
{
|
{
|
||||||
|
|
|
@ -29,44 +29,85 @@ using namespace Threading;
|
||||||
|
|
||||||
class MainEmuFrame;
|
class MainEmuFrame;
|
||||||
class IniInterface;
|
class IniInterface;
|
||||||
|
class LogWriteEvent;
|
||||||
|
|
||||||
extern wxFileHistory* g_RecentIsoList;
|
extern wxFileHistory* g_RecentIsoList;
|
||||||
|
|
||||||
class LogWriteEvent;
|
|
||||||
|
|
||||||
DECLARE_EVENT_TYPE(wxEVT_DockConsole, -1);
|
DECLARE_EVENT_TYPE(wxEVT_DockConsole, -1);
|
||||||
|
|
||||||
|
extern wxRect wxGetDisplayArea();
|
||||||
|
extern bool pxIsValidWindowPosition( const wxWindow& window, const wxPoint& windowPos );
|
||||||
|
|
||||||
|
static const bool EnableThreadedLoggingTest = true;
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
// ConsoleThreadTest -- useful class for unit testing the thread safety and general performance
|
||||||
|
// of the console logger.
|
||||||
|
//
|
||||||
|
class ConsoleTestThread : public Thread
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
volatile bool m_done;
|
||||||
|
int Callback();
|
||||||
|
|
||||||
|
public:
|
||||||
|
ConsoleTestThread() :
|
||||||
|
m_done( false )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
~ConsoleTestThread()
|
||||||
|
{
|
||||||
|
m_done = true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
class ConsoleLogFrame : public wxFrame, public NoncopyableObject
|
class ConsoleLogFrame : public wxFrame, public NoncopyableObject
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
typedef AppConfig::ConsoleLogOptions ConLogConfig;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
class ColorArray : public NoncopyableObject
|
class ColorArray : public NoncopyableObject
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
SafeArray<wxTextAttr> m_table;
|
SafeArray<wxTextAttr> m_table;
|
||||||
wxTextAttr m_color_default;
|
wxTextAttr m_color_default;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ColorArray();
|
virtual ~ColorArray();
|
||||||
|
ColorArray( int fontsize=8 );
|
||||||
|
|
||||||
|
void Create( int fontsize );
|
||||||
|
void Cleanup();
|
||||||
|
|
||||||
|
void SetFont( const wxFont& font );
|
||||||
|
void SetFont( int fontsize );
|
||||||
|
|
||||||
const wxTextAttr& operator[]( Console::Colors coloridx ) const
|
const wxTextAttr& operator[]( Console::Colors coloridx ) const
|
||||||
{
|
{
|
||||||
return m_table[(int)coloridx];
|
return m_table[(int)coloridx];
|
||||||
}
|
}
|
||||||
|
|
||||||
void SetFont( const wxFont& font );
|
|
||||||
const wxTextAttr& Default() { return m_table[0]; }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
wxTextCtrl& m_TextCtrl;
|
ConLogConfig m_conf;
|
||||||
ColorArray m_ColorTable;
|
wxTextCtrl& m_TextCtrl;
|
||||||
Console::Colors m_curcolor;
|
ColorArray m_ColorTable;
|
||||||
volatile long m_msgcounter; // used to track queued messages and throttle load placed on the gui message pump
|
Console::Colors m_curcolor;
|
||||||
|
volatile long m_msgcounter; // used to track queued messages and throttle load placed on the gui message pump
|
||||||
|
|
||||||
|
Semaphore m_semaphore;
|
||||||
|
|
||||||
|
// Threaded log spammer, useful for testing console logging performance.
|
||||||
|
ConsoleTestThread* m_threadlogger;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
// ctor & dtor
|
// ctor & dtor
|
||||||
ConsoleLogFrame( MainEmuFrame *pParent, const wxString& szTitle, const AppConfig::ConsoleLogOptions& options );
|
ConsoleLogFrame( MainEmuFrame *pParent, const wxString& szTitle, const ConLogConfig& options );
|
||||||
virtual ~ConsoleLogFrame();
|
virtual ~ConsoleLogFrame();
|
||||||
|
|
||||||
virtual void Write( const wxString& text );
|
virtual void Write( const wxString& text );
|
||||||
|
@ -74,6 +115,10 @@ public:
|
||||||
virtual void ClearColor();
|
virtual void ClearColor();
|
||||||
virtual void DockedMove();
|
virtual void DockedMove();
|
||||||
|
|
||||||
|
// Retreives the current configuration options settings for this box.
|
||||||
|
// (settings change if the user moves the window or changes the font size)
|
||||||
|
const ConLogConfig& GetConfig() const { return m_conf; }
|
||||||
|
|
||||||
void Write( Console::Colors color, const wxString& text );
|
void Write( Console::Colors color, const wxString& text );
|
||||||
void Newline();
|
void Newline();
|
||||||
void CountMessage();
|
void CountMessage();
|
||||||
|
@ -86,12 +131,16 @@ protected:
|
||||||
virtual void OnClose(wxMenuEvent& event);
|
virtual void OnClose(wxMenuEvent& event);
|
||||||
virtual void OnSave (wxMenuEvent& event);
|
virtual void OnSave (wxMenuEvent& event);
|
||||||
virtual void OnClear(wxMenuEvent& event);
|
virtual void OnClear(wxMenuEvent& event);
|
||||||
|
|
||||||
|
void OnFontSize(wxMenuEvent& event);
|
||||||
|
|
||||||
virtual void OnCloseWindow(wxCloseEvent& event);
|
virtual void OnCloseWindow(wxCloseEvent& event);
|
||||||
|
|
||||||
void OnWrite( wxCommandEvent& event );
|
void OnWrite( wxCommandEvent& event );
|
||||||
void OnNewline( wxCommandEvent& event );
|
void OnNewline( wxCommandEvent& event );
|
||||||
void OnSetTitle( wxCommandEvent& event );
|
void OnSetTitle( wxCommandEvent& event );
|
||||||
void OnDockedMove( wxCommandEvent& event );
|
void OnDockedMove( wxCommandEvent& event );
|
||||||
|
void OnSemaphoreWait( wxCommandEvent& event );
|
||||||
|
|
||||||
// common part of OnClose() and OnCloseWindow()
|
// common part of OnClose() and OnCloseWindow()
|
||||||
virtual void DoClose();
|
virtual void DoClose();
|
||||||
|
@ -169,6 +218,8 @@ public:
|
||||||
void OnInitCmdLine( wxCmdLineParser& parser );
|
void OnInitCmdLine( wxCmdLineParser& parser );
|
||||||
bool OnCmdLineParsed( wxCmdLineParser& parser );
|
bool OnCmdLineParsed( wxCmdLineParser& parser );
|
||||||
|
|
||||||
|
bool PrepForExit();
|
||||||
|
|
||||||
const wxBitmap& GetLogoBitmap();
|
const wxBitmap& GetLogoBitmap();
|
||||||
wxImageList& GetImgList_Config();
|
wxImageList& GetImgList_Config();
|
||||||
wxImageList& GetImgList_Toolbars();
|
wxImageList& GetImgList_Toolbars();
|
||||||
|
@ -191,6 +242,14 @@ public:
|
||||||
return m_Ps2ConLogBox;
|
return m_Ps2ConLogBox;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CloseProgramLog()
|
||||||
|
{
|
||||||
|
m_ProgramLogBox->Close();
|
||||||
|
|
||||||
|
// disable future console log messages from being sent to the window.
|
||||||
|
m_ProgramLogBox = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void ProgramLog_CountMsg()
|
void ProgramLog_CountMsg()
|
||||||
{
|
{
|
||||||
if( m_ProgramLogBox == NULL ) return;
|
if( m_ProgramLogBox == NULL ) return;
|
||||||
|
|
|
@ -349,9 +349,9 @@ wxString AppConfig::FullpathToMcd( uint mcdidx ) const { return Path::Combine( F
|
||||||
// GCC Note: wxT() macro is required when using string token pasting. For some reason L generates
|
// GCC Note: wxT() macro is required when using string token pasting. For some reason L generates
|
||||||
// syntax errors. >_<
|
// syntax errors. >_<
|
||||||
//
|
//
|
||||||
#define IniEntry( varname, defval ) ini.Entry( wxT(#varname), varname, defval )
|
#define IniEntry( varname, defval ) ini.Entry( wxT(#varname), varname, defval )
|
||||||
#define IniBitfield( varname, defval ) varname = ini.EntryBitfield( wxT(#varname), varname, defval )
|
#define IniBitfield( varname, defval ) varname = ini.EntryBitfield( wxT(#varname), varname, defval )
|
||||||
#define IniBitBool( varname, defval ) varname = ini.EntryBitBool( wxT(#varname), varname, defval )
|
#define IniBitBool( varname, defval ) varname = ini.EntryBitBool( wxT(#varname), !!varname, defval )
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
void AppConfig::LoadSaveUserMode( IniInterface& ini )
|
void AppConfig::LoadSaveUserMode( IniInterface& ini )
|
||||||
|
@ -376,7 +376,9 @@ void AppConfig::LoadSave( IniInterface& ini )
|
||||||
IniEntry( CdvdVerboseReads, false );
|
IniEntry( CdvdVerboseReads, false );
|
||||||
|
|
||||||
// Process various sub-components:
|
// Process various sub-components:
|
||||||
ConLogBox.LoadSave( ini );
|
ProgLogBox.LoadSave( ini, L"ProgramLog" );
|
||||||
|
Ps2ConBox.LoadSave( ini, L"Ps2Console" );
|
||||||
|
|
||||||
Speedhacks.LoadSave( ini );
|
Speedhacks.LoadSave( ini );
|
||||||
Folders.LoadSave( ini );
|
Folders.LoadSave( ini );
|
||||||
BaseFilenames.LoadSave( ini );
|
BaseFilenames.LoadSave( ini );
|
||||||
|
@ -450,14 +452,15 @@ void AppConfig::Save()
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
void AppConfig::ConsoleLogOptions::LoadSave( IniInterface& ini )
|
void AppConfig::ConsoleLogOptions::LoadSave( IniInterface& ini, const wxChar* logger )
|
||||||
{
|
{
|
||||||
ini.SetPath( L"ConsoleLog" );
|
ini.SetPath( logger );
|
||||||
|
|
||||||
IniEntry( Visible, false );
|
IniEntry( Visible, false );
|
||||||
IniEntry( AutoDock, true );
|
IniEntry( AutoDock, true );
|
||||||
IniEntry( DisplayPosition, wxDefaultPosition );
|
IniEntry( DisplayPosition, wxDefaultPosition );
|
||||||
IniEntry( DisplaySize, wxSize( 540, 540 ) );
|
IniEntry( DisplaySize, wxSize( 540, 540 ) );
|
||||||
|
IniEntry( FontSize, 8 );
|
||||||
|
|
||||||
ini.SetPath( L".." );
|
ini.SetPath( L".." );
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,15 +34,33 @@
|
||||||
DECLARE_EVENT_TYPE(wxEVT_LOG_Write, -1)
|
DECLARE_EVENT_TYPE(wxEVT_LOG_Write, -1)
|
||||||
DECLARE_EVENT_TYPE(wxEVT_LOG_Newline, -1)
|
DECLARE_EVENT_TYPE(wxEVT_LOG_Newline, -1)
|
||||||
DECLARE_EVENT_TYPE(wxEVT_SetTitleText, -1)
|
DECLARE_EVENT_TYPE(wxEVT_SetTitleText, -1)
|
||||||
|
DECLARE_EVENT_TYPE(wxEVT_SemaphoreWait, -1);
|
||||||
|
|
||||||
DEFINE_EVENT_TYPE(wxEVT_LOG_Write)
|
DEFINE_EVENT_TYPE(wxEVT_LOG_Write)
|
||||||
DEFINE_EVENT_TYPE(wxEVT_LOG_Newline)
|
DEFINE_EVENT_TYPE(wxEVT_LOG_Newline)
|
||||||
DEFINE_EVENT_TYPE(wxEVT_SetTitleText)
|
DEFINE_EVENT_TYPE(wxEVT_SetTitleText)
|
||||||
DEFINE_EVENT_TYPE(wxEVT_DockConsole)
|
DEFINE_EVENT_TYPE(wxEVT_DockConsole)
|
||||||
|
DEFINE_EVENT_TYPE(wxEVT_SemaphoreWait);
|
||||||
|
|
||||||
using Console::Colors;
|
using Console::Colors;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
// ----------------------------------------------------------------------------
|
||||||
|
int ConsoleTestThread::Callback()
|
||||||
|
{
|
||||||
|
static int numtrack = 0;
|
||||||
|
|
||||||
|
while( !m_done )
|
||||||
|
{
|
||||||
|
// Two lines, both formatted, and varied colors. This makes for a fairly realistic
|
||||||
|
// worst case scenario (without being entirely unrealistic).
|
||||||
|
Console::WriteLn( wxsFormat( L"This is a threaded logging test. Something bad could happen... %d", ++numtrack ) );
|
||||||
|
Console::Status( wxsFormat( L"Testing high stress loads %s", L"(multi-color)" ) );
|
||||||
|
Sleep( 0 );
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
// pass an uninitialized file object, the function will ask the user for the
|
// pass an uninitialized file object, the function will ask the user for the
|
||||||
// filename and try to open it, returns true on success (file was opened),
|
// filename and try to open it, returns true on success (file was opened),
|
||||||
// false if file couldn't be opened/created and -1 if the file selection
|
// false if file couldn't be opened/created and -1 if the file selection
|
||||||
|
@ -86,11 +104,24 @@ static bool OpenLogFile(wxFile& file, wxString& filename, wxWindow *parent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
ConsoleLogFrame::ColorArray::ColorArray() :
|
// fontsize - size of the font specified in points.
|
||||||
|
// (actual font used is the system-selected fixed-width font)
|
||||||
|
//
|
||||||
|
ConsoleLogFrame::ColorArray::ColorArray( int fontsize ) :
|
||||||
m_table( 8 )
|
m_table( 8 )
|
||||||
{
|
{
|
||||||
wxFont fixed( 8, wxMODERN, wxNORMAL, wxNORMAL );
|
Create( fontsize );
|
||||||
wxFont fixedB( 8, wxMODERN, wxNORMAL, wxBOLD );
|
}
|
||||||
|
|
||||||
|
ConsoleLogFrame::ColorArray::~ColorArray()
|
||||||
|
{
|
||||||
|
Cleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleLogFrame::ColorArray::Create( int fontsize )
|
||||||
|
{
|
||||||
|
wxFont fixed( fontsize, wxMODERN, wxNORMAL, wxNORMAL );
|
||||||
|
wxFont fixedB( fontsize, wxMODERN, wxNORMAL, wxBOLD );
|
||||||
|
|
||||||
// Standard R, G, B format:
|
// Standard R, G, B format:
|
||||||
new (&m_table[Color_Black]) wxTextAttr( wxColor( 0, 0, 0 ), wxNullColour, fixed );
|
new (&m_table[Color_Black]) wxTextAttr( wxColor( 0, 0, 0 ), wxNullColour, fixed );
|
||||||
|
@ -103,65 +134,187 @@ ConsoleLogFrame::ColorArray::ColorArray() :
|
||||||
new (&m_table[Color_White]) wxTextAttr( wxColor( 128, 128, 128 ), wxNullColour, fixed );
|
new (&m_table[Color_White]) wxTextAttr( wxColor( 128, 128, 128 ), wxNullColour, fixed );
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
void ConsoleLogFrame::ColorArray::Cleanup()
|
||||||
// Threading: this function may employ the use of GDI objects in Win32, which means it's
|
{
|
||||||
// not safe to be clled from anything but the main gUI thread.
|
// The contents of m_table were created with placement new, and must be
|
||||||
//
|
// disposed of manually:
|
||||||
|
|
||||||
|
for( int i=0; i<8; ++i )
|
||||||
|
m_table[i].~wxTextAttr();
|
||||||
|
}
|
||||||
|
|
||||||
|
// fixme - not implemented yet.
|
||||||
void ConsoleLogFrame::ColorArray::SetFont( const wxFont& font )
|
void ConsoleLogFrame::ColorArray::SetFont( const wxFont& font )
|
||||||
{
|
{
|
||||||
for( int i=0; i<8; ++i )
|
//for( int i=0; i<8; ++i )
|
||||||
m_table[i].SetFont( font );
|
// m_table[i].SetFont( font );
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleLogFrame::ColorArray::SetFont( int fontsize )
|
||||||
|
{
|
||||||
|
Cleanup();
|
||||||
|
Create( fontsize );
|
||||||
}
|
}
|
||||||
|
|
||||||
static const Console::Colors DefaultConsoleColor = Color_White;
|
static const Console::Colors DefaultConsoleColor = Color_White;
|
||||||
|
|
||||||
|
enum MenuIDs_t
|
||||||
|
{
|
||||||
|
MenuID_FontSize_Small = 0x10,
|
||||||
|
MenuID_FontSize_Normal,
|
||||||
|
MenuID_FontSize_Large,
|
||||||
|
MenuID_FontSize_Huge,
|
||||||
|
};
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
ConsoleLogFrame::ConsoleLogFrame( MainEmuFrame *parent, const wxString& title, const AppConfig::ConsoleLogOptions& options ) :
|
ConsoleLogFrame::ConsoleLogFrame( MainEmuFrame *parent, const wxString& title, const AppConfig::ConsoleLogOptions& options ) :
|
||||||
wxFrame(parent, wxID_ANY, title)
|
wxFrame(parent, wxID_ANY, title)
|
||||||
|
, m_conf( options )
|
||||||
, m_TextCtrl( *new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize,
|
, m_TextCtrl( *new wxTextCtrl(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize,
|
||||||
wxTE_MULTILINE | wxHSCROLL | wxTE_READONLY | wxTE_RICH2 ) )
|
wxTE_MULTILINE | wxHSCROLL | wxTE_READONLY | wxTE_RICH2 ) )
|
||||||
, m_ColorTable()
|
, m_ColorTable( options.FontSize )
|
||||||
, m_curcolor( DefaultConsoleColor )
|
, m_curcolor( DefaultConsoleColor )
|
||||||
, m_msgcounter( 0 )
|
, m_msgcounter( 0 )
|
||||||
|
, m_threadlogger( EnableThreadedLoggingTest ? new ConsoleTestThread() : NULL )
|
||||||
{
|
{
|
||||||
m_TextCtrl.SetBackgroundColour( wxColor( 230, 235, 242 ) );
|
m_TextCtrl.SetBackgroundColour( wxColor( 230, 235, 242 ) );
|
||||||
|
|
||||||
// create menu
|
// create Log menu (contains most options)
|
||||||
wxMenuBar *pMenuBar = new wxMenuBar;
|
wxMenuBar *pMenuBar = new wxMenuBar();
|
||||||
wxMenu *pMenu = new wxMenu;
|
wxMenu& menuLog = *new wxMenu();
|
||||||
pMenu->Append(wxID_SAVE, L"&Save...", _("Save log contents to file"));
|
menuLog.Append(wxID_SAVE, _("&Save..."), _("Save log contents to file"));
|
||||||
pMenu->Append(wxID_CLEAR, L"C&lear", _("Clear the log contents"));
|
menuLog.Append(wxID_CLEAR, _("C&lear"), _("Clear the log window contents"));
|
||||||
pMenu->AppendSeparator();
|
menuLog.AppendSeparator();
|
||||||
pMenu->Append(wxID_CLOSE, L"&Close", _("Close this window"));
|
menuLog.Append(wxID_CLOSE, _("&Close"), _("Close this log window; contents are preserved"));
|
||||||
|
|
||||||
pMenuBar->Append(pMenu, L"&Log");
|
// create Appearance menu and submenus
|
||||||
SetMenuBar(pMenuBar);
|
|
||||||
|
|
||||||
// status bar for menu prompts
|
wxMenu& menuFontSizes = *new wxMenu();
|
||||||
CreateStatusBar();
|
menuFontSizes.Append( MenuID_FontSize_Small, _("Small"), _("Fits a lot of log in a microcosmically small area."),
|
||||||
ClearColor();
|
wxITEM_RADIO )->Check( options.FontSize == 7 );
|
||||||
|
menuFontSizes.Append( MenuID_FontSize_Normal, _("Normal"),_("It's what I use (the programmer guy)."),
|
||||||
|
wxITEM_RADIO )->Check( options.FontSize == 8 );
|
||||||
|
menuFontSizes.Append( MenuID_FontSize_Large, _("Large"), _("Its nice and readable."),
|
||||||
|
wxITEM_RADIO )->Check( options.FontSize == 10 );
|
||||||
|
menuFontSizes.Append( MenuID_FontSize_Huge, _("Huge"), _("In case you have a really high res display."),
|
||||||
|
wxITEM_RADIO )->Check( options.FontSize == 12 );
|
||||||
|
|
||||||
|
wxMenu& menuAppear = *new wxMenu();
|
||||||
|
menuAppear.Append( wxID_ANY, _("Always on Top"),
|
||||||
|
_("When checked the log window will be visible over other foreground windows."), wxITEM_CHECK );
|
||||||
|
menuAppear.Append( wxID_ANY, _("Font Size"), &menuFontSizes );
|
||||||
|
|
||||||
|
pMenuBar->Append(&menuLog, _("&Log"));
|
||||||
|
pMenuBar->Append(&menuAppear, _("&Appearance"));
|
||||||
|
SetMenuBar(pMenuBar);
|
||||||
|
|
||||||
|
// status bar for menu prompts
|
||||||
|
CreateStatusBar();
|
||||||
|
ClearColor();
|
||||||
|
|
||||||
SetSize( wxRect( options.DisplayPosition, options.DisplaySize ) );
|
SetSize( wxRect( options.DisplayPosition, options.DisplaySize ) );
|
||||||
Show( options.Visible );
|
Show( options.Visible );
|
||||||
|
|
||||||
// Bind Events:
|
// Bind Events:
|
||||||
|
|
||||||
Connect( wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, wxMenuEventHandler( ConsoleLogFrame::OnOpen ) );
|
Connect( wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, wxMenuEventHandler(ConsoleLogFrame::OnOpen) );
|
||||||
Connect( wxID_CLOSE, wxEVT_COMMAND_MENU_SELECTED, wxMenuEventHandler( ConsoleLogFrame::OnClose ) );
|
Connect( wxID_CLOSE, wxEVT_COMMAND_MENU_SELECTED, wxMenuEventHandler(ConsoleLogFrame::OnClose) );
|
||||||
Connect( wxID_SAVE, wxEVT_COMMAND_MENU_SELECTED, wxMenuEventHandler( ConsoleLogFrame::OnSave ) );
|
Connect( wxID_SAVE, wxEVT_COMMAND_MENU_SELECTED, wxMenuEventHandler(ConsoleLogFrame::OnSave) );
|
||||||
Connect( wxID_CLEAR, wxEVT_COMMAND_MENU_SELECTED, wxMenuEventHandler( ConsoleLogFrame::OnClear ) );
|
Connect( wxID_CLEAR, wxEVT_COMMAND_MENU_SELECTED, wxMenuEventHandler(ConsoleLogFrame::OnClear) );
|
||||||
|
|
||||||
Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler(ConsoleLogFrame::OnCloseWindow) );
|
Connect( MenuID_FontSize_Small, MenuID_FontSize_Huge, wxEVT_COMMAND_MENU_SELECTED, wxMenuEventHandler( ConsoleLogFrame::OnFontSize ) );
|
||||||
Connect( wxEVT_MOVE, wxMoveEventHandler(ConsoleLogFrame::OnMoveAround) );
|
|
||||||
Connect( wxEVT_SIZE, wxSizeEventHandler(ConsoleLogFrame::OnResize) );
|
|
||||||
|
|
||||||
Connect( wxEVT_LOG_Write, wxCommandEventHandler(ConsoleLogFrame::OnWrite) );
|
Connect( wxEVT_CLOSE_WINDOW, wxCloseEventHandler(ConsoleLogFrame::OnCloseWindow) );
|
||||||
Connect( wxEVT_LOG_Newline, wxCommandEventHandler(ConsoleLogFrame::OnNewline) );
|
Connect( wxEVT_MOVE, wxMoveEventHandler(ConsoleLogFrame::OnMoveAround) );
|
||||||
Connect( wxEVT_SetTitleText,wxCommandEventHandler(ConsoleLogFrame::OnSetTitle) );
|
Connect( wxEVT_SIZE, wxSizeEventHandler(ConsoleLogFrame::OnResize) );
|
||||||
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) );
|
||||||
|
Connect( wxEVT_SemaphoreWait, wxCommandEventHandler(ConsoleLogFrame::OnSemaphoreWait) );
|
||||||
|
|
||||||
|
if( m_threadlogger != NULL )
|
||||||
|
m_threadlogger->Start();
|
||||||
}
|
}
|
||||||
|
|
||||||
ConsoleLogFrame::~ConsoleLogFrame() { }
|
ConsoleLogFrame::~ConsoleLogFrame()
|
||||||
|
{
|
||||||
|
safe_delete( m_threadlogger );
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleLogFrame::SetColor( Colors color )
|
||||||
|
{
|
||||||
|
if( color != m_curcolor )
|
||||||
|
m_TextCtrl.SetDefaultStyle( m_ColorTable[m_curcolor=color] );
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleLogFrame::ClearColor()
|
||||||
|
{
|
||||||
|
if( DefaultConsoleColor != m_curcolor )
|
||||||
|
m_TextCtrl.SetDefaultStyle( m_ColorTable[m_curcolor=DefaultConsoleColor] );
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleLogFrame::Write( const wxString& text )
|
||||||
|
{
|
||||||
|
// remove selection (WriteText is in fact ReplaceSelection)
|
||||||
|
// TODO : Optimize this to only replaceslection if some selection
|
||||||
|
// messages have been recieved since the last write.
|
||||||
|
|
||||||
|
#ifdef __WXMSW__
|
||||||
|
wxTextPos nLen = m_TextCtrl.GetLastPosition();
|
||||||
|
m_TextCtrl.SetSelection(nLen, nLen);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
m_TextCtrl.AppendText( text );
|
||||||
|
|
||||||
|
// cap at 256k for now...
|
||||||
|
// fixme - 256k runs well on win32 but appears to be very sluggish on linux. Might
|
||||||
|
// need platform dependent defaults here. - air
|
||||||
|
if( m_TextCtrl.GetLastPosition() > 0x40000 )
|
||||||
|
{
|
||||||
|
m_TextCtrl.Remove( 0, 0x10000 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Implementation note: Calls SetColor and Write( text ). Override those virtuals
|
||||||
|
// and this one will magically follow suite. :)
|
||||||
|
void ConsoleLogFrame::Write( Colors color, const wxString& text )
|
||||||
|
{
|
||||||
|
SetColor( color );
|
||||||
|
Write( text );
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleLogFrame::Newline()
|
||||||
|
{
|
||||||
|
Write( L"\n" );
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleLogFrame::DoClose()
|
||||||
|
{
|
||||||
|
// instead of closing just hide the window to be able to Show() it later
|
||||||
|
Show(false);
|
||||||
|
if( wxFrame* main = wxGetApp().GetMainWindow() )
|
||||||
|
wxStaticCast( main, MainEmuFrame )->OnLogBoxHidden();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleLogFrame::DockedMove()
|
||||||
|
{
|
||||||
|
SetPosition( m_conf.DisplayPosition );
|
||||||
|
}
|
||||||
|
|
||||||
|
// =================================================================================
|
||||||
|
// Section : Event Handlers
|
||||||
|
// * Misc Window Events (Move, Resize,etc)
|
||||||
|
// * Menu Events
|
||||||
|
// * Logging Events
|
||||||
|
// =================================================================================
|
||||||
|
|
||||||
|
// Special event recieved from a window we're docked against.
|
||||||
|
void ConsoleLogFrame::OnDockedMove( wxCommandEvent& event )
|
||||||
|
{
|
||||||
|
DockedMove();
|
||||||
|
}
|
||||||
|
|
||||||
void ConsoleLogFrame::OnMoveAround( wxMoveEvent& evt )
|
void ConsoleLogFrame::OnMoveAround( wxMoveEvent& evt )
|
||||||
{
|
{
|
||||||
|
@ -173,30 +326,33 @@ void ConsoleLogFrame::OnMoveAround( wxMoveEvent& evt )
|
||||||
wxPoint topright( main->GetRect().GetTopRight() );
|
wxPoint topright( main->GetRect().GetTopRight() );
|
||||||
wxRect snapzone( topright - wxSize( 8,8 ), wxSize( 16,16 ) );
|
wxRect snapzone( topright - wxSize( 8,8 ), wxSize( 16,16 ) );
|
||||||
|
|
||||||
g_Conf->ConLogBox.AutoDock = snapzone.Contains( GetPosition() );
|
m_conf.AutoDock = snapzone.Contains( GetPosition() );
|
||||||
//Console::WriteLn( "DockCheck: %d", params g_Conf->ConLogBox.AutoDock );
|
//Console::WriteLn( "DockCheck: %d", params g_Conf->ConLogBox.AutoDock );
|
||||||
if( g_Conf->ConLogBox.AutoDock )
|
if( m_conf.AutoDock )
|
||||||
{
|
{
|
||||||
SetPosition( topright + wxSize( 1,0 ) );
|
SetPosition( topright + wxSize( 1,0 ) );
|
||||||
g_Conf->ConLogBox.AutoDock = true;
|
m_conf.AutoDock = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
g_Conf->ConLogBox.DisplayPosition = GetPosition();
|
m_conf.DisplayPosition = GetPosition();
|
||||||
evt.Skip();
|
evt.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConsoleLogFrame::OnResize( wxSizeEvent& evt )
|
void ConsoleLogFrame::OnResize( wxSizeEvent& evt )
|
||||||
{
|
{
|
||||||
g_Conf->ConLogBox.DisplaySize = GetSize();
|
m_conf.DisplaySize = GetSize();
|
||||||
evt.Skip();
|
evt.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConsoleLogFrame::DoClose()
|
void ConsoleLogFrame::OnCloseWindow(wxCloseEvent& event)
|
||||||
{
|
{
|
||||||
// instead of closing just hide the window to be able to Show() it later
|
if( event.CanVeto() )
|
||||||
Show(false);
|
DoClose();
|
||||||
if( wxFrame* main = wxGetApp().GetMainWindow() )
|
else
|
||||||
wxStaticCast( main, MainEmuFrame )->OnLogBoxHidden();
|
{
|
||||||
|
safe_delete( m_threadlogger );
|
||||||
|
event.Skip();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConsoleLogFrame::OnOpen(wxMenuEvent& WXUNUSED(event))
|
void ConsoleLogFrame::OnOpen(wxMenuEvent& WXUNUSED(event))
|
||||||
|
@ -209,14 +365,6 @@ void ConsoleLogFrame::OnClose( wxMenuEvent& event )
|
||||||
DoClose();
|
DoClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConsoleLogFrame::OnCloseWindow(wxCloseEvent& event)
|
|
||||||
{
|
|
||||||
if( event.CanVeto() )
|
|
||||||
DoClose();
|
|
||||||
else
|
|
||||||
event.Skip();
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConsoleLogFrame::OnSave(wxMenuEvent& WXUNUSED(event))
|
void ConsoleLogFrame::OnSave(wxMenuEvent& WXUNUSED(event))
|
||||||
{
|
{
|
||||||
wxString filename;
|
wxString filename;
|
||||||
|
@ -248,17 +396,32 @@ void ConsoleLogFrame::OnClear(wxMenuEvent& WXUNUSED(event))
|
||||||
m_TextCtrl.Clear();
|
m_TextCtrl.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConsoleLogFrame::SetColor( Colors color )
|
void ConsoleLogFrame::OnFontSize(wxMenuEvent& evt )
|
||||||
{
|
{
|
||||||
if( color != m_curcolor )
|
int ptsize = 8;
|
||||||
m_TextCtrl.SetDefaultStyle( m_ColorTable[m_curcolor=color] );
|
switch( evt.GetId() )
|
||||||
|
{
|
||||||
|
case MenuID_FontSize_Small: ptsize = 7; break;
|
||||||
|
case MenuID_FontSize_Normal: ptsize = 8; break;
|
||||||
|
case MenuID_FontSize_Large: ptsize = 10; break;
|
||||||
|
case MenuID_FontSize_Huge: ptsize = 12; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ptsize == m_conf.FontSize ) return;
|
||||||
|
|
||||||
|
m_conf.FontSize = ptsize;
|
||||||
|
m_ColorTable.SetFont( ptsize );
|
||||||
|
m_TextCtrl.SetDefaultStyle( m_ColorTable[m_curcolor] );
|
||||||
|
|
||||||
|
// TODO: Process the attributes of each character and upgrade the font size,
|
||||||
|
// while still retaining color and bold settings... (might be slow but then
|
||||||
|
// it hardly matters being a once-in-a-bluemoon action).
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConsoleLogFrame::ClearColor()
|
// ----------------------------------------------------------------------------
|
||||||
{
|
// Logging Events (typically recieved from Console class interfaces)
|
||||||
if( DefaultConsoleColor != m_curcolor )
|
// ----------------------------------------------------------------------------
|
||||||
m_TextCtrl.SetDefaultStyle( m_ColorTable[m_curcolor=DefaultConsoleColor] );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConsoleLogFrame::OnWrite( wxCommandEvent& event )
|
void ConsoleLogFrame::OnWrite( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
|
@ -277,48 +440,9 @@ void ConsoleLogFrame::OnSetTitle( wxCommandEvent& event )
|
||||||
SetTitle( event.GetString() );
|
SetTitle( event.GetString() );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConsoleLogFrame::OnDockedMove( wxCommandEvent& event )
|
void ConsoleLogFrame::OnSemaphoreWait( wxCommandEvent& event )
|
||||||
{
|
{
|
||||||
DockedMove();
|
m_semaphore.Post();
|
||||||
}
|
|
||||||
|
|
||||||
void ConsoleLogFrame::DockedMove()
|
|
||||||
{
|
|
||||||
if( g_Conf != NULL )
|
|
||||||
SetPosition( g_Conf->ConLogBox.DisplayPosition );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConsoleLogFrame::Write( const wxString& text )
|
|
||||||
{
|
|
||||||
// remove selection (WriteText is in fact ReplaceSelection)
|
|
||||||
|
|
||||||
#ifdef __WXMSW__
|
|
||||||
wxTextPos nLen = m_TextCtrl.GetLastPosition();
|
|
||||||
m_TextCtrl.SetSelection(nLen, nLen);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
m_TextCtrl.AppendText( text );
|
|
||||||
|
|
||||||
// cap at 256k for now...
|
|
||||||
// fixme - 256k runs well on win32 but appears to be very sluggish on linux. Might
|
|
||||||
// need platform dependent defaults here. - air
|
|
||||||
if( m_TextCtrl.GetLastPosition() > 0x40000 )
|
|
||||||
{
|
|
||||||
m_TextCtrl.Remove( 0, 0x10000 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Implementation note: Calls SetColor and Write( text ). Override those virtuals
|
|
||||||
// and this one will magically follow suite. :)
|
|
||||||
void ConsoleLogFrame::Write( Colors color, const wxString& text )
|
|
||||||
{
|
|
||||||
SetColor( color );
|
|
||||||
Write( text );
|
|
||||||
}
|
|
||||||
|
|
||||||
void ConsoleLogFrame::Newline()
|
|
||||||
{
|
|
||||||
Write( L"\n" );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
@ -330,32 +454,43 @@ void ConsoleLogFrame::Newline()
|
||||||
// catch up.
|
// catch up.
|
||||||
void ConsoleLogFrame::CountMessage()
|
void ConsoleLogFrame::CountMessage()
|
||||||
{
|
{
|
||||||
_InterlockedIncrement( &m_msgcounter );
|
long result = _InterlockedIncrement( &m_msgcounter );
|
||||||
|
|
||||||
if( m_msgcounter > 0x10 ) // 0x10 -- arbitrary value that seems to work well on my C2Q 3.2ghz
|
if( result > 0x20 ) // 0x20 -- arbitrary value that seems to work well (tested on P4 and C2D)
|
||||||
{
|
{
|
||||||
if( !wxThread::IsMain() )
|
if( !wxThread::IsMain() )
|
||||||
{
|
{
|
||||||
// fixme : It'd be swell if this could be replaced with something that uses
|
// Append an event that'll post up our semaphore. It'll get run "in
|
||||||
// pthreads semaphores instead of Sleep, but I haven't been able to conjure up
|
// order" which means when it posts all queued messages will have been
|
||||||
// such an alternative yet.
|
// processed.
|
||||||
|
|
||||||
while( m_msgcounter > 1 ) { Sleep(1); }
|
wxCommandEvent evt( wxEVT_SemaphoreWait );
|
||||||
Sleep(0); // give the main thread more time to catch up. :|
|
GetEventHandler()->AddPendingEvent( evt );
|
||||||
|
m_semaphore.Wait();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Thread Safety note: This function expects to be called from the Main GUI thread
|
||||||
|
// only. If called from a thread other than Main, it will generate an assertion failure.
|
||||||
|
//
|
||||||
void ConsoleLogFrame::DoMessage()
|
void ConsoleLogFrame::DoMessage()
|
||||||
{
|
{
|
||||||
|
wxASSERT_MSG( wxThread::IsMain(), L"DoMessage must only be called from the main gui thread!" );
|
||||||
|
|
||||||
int cur = _InterlockedDecrement( &m_msgcounter );
|
int cur = _InterlockedDecrement( &m_msgcounter );
|
||||||
|
|
||||||
|
// We need to freeze the control if there are more than 2 pending messages,
|
||||||
|
// otherwise the redraw of the console will prevent it from ever being able to
|
||||||
|
// catch up with the rate the queue is being filled, and the whole app could
|
||||||
|
// deadlock. >_<
|
||||||
|
|
||||||
if( m_TextCtrl.IsFrozen() )
|
if( m_TextCtrl.IsFrozen() )
|
||||||
{
|
{
|
||||||
if( cur <= 1 && wxThread::IsMain() )
|
if( cur < 1 )
|
||||||
m_TextCtrl.Thaw();
|
m_TextCtrl.Thaw();
|
||||||
}
|
}
|
||||||
else if( cur >= 4 && wxThread::IsMain() )
|
else if( cur >= 3 )
|
||||||
{
|
{
|
||||||
m_TextCtrl.Freeze();
|
m_TextCtrl.Freeze();
|
||||||
}
|
}
|
||||||
|
@ -391,9 +526,9 @@ namespace Console
|
||||||
if( emuLog != NULL )
|
if( emuLog != NULL )
|
||||||
fputs( "\n", emuLog );
|
fputs( "\n", emuLog );
|
||||||
|
|
||||||
wxGetApp().ProgramLog_CountMsg();
|
|
||||||
wxCommandEvent evt( wxEVT_LOG_Newline );
|
wxCommandEvent evt( wxEVT_LOG_Newline );
|
||||||
wxGetApp().ProgramLog_PostEvent( evt );
|
wxGetApp().ProgramLog_PostEvent( evt );
|
||||||
|
wxGetApp().ProgramLog_CountMsg();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -403,12 +538,11 @@ namespace Console
|
||||||
if( emuLog != NULL )
|
if( emuLog != NULL )
|
||||||
fputs( fmt, emuLog );
|
fputs( fmt, emuLog );
|
||||||
|
|
||||||
wxGetApp().ProgramLog_CountMsg();
|
|
||||||
|
|
||||||
wxCommandEvent evt( wxEVT_LOG_Write );
|
wxCommandEvent evt( wxEVT_LOG_Write );
|
||||||
evt.SetString( wxString::FromAscii( fmt ) );
|
evt.SetString( wxString::FromAscii( fmt ) );
|
||||||
evt.SetExtraLong( th_CurrentColor );
|
evt.SetExtraLong( th_CurrentColor );
|
||||||
wxGetApp().ProgramLog_PostEvent( evt );
|
wxGetApp().ProgramLog_PostEvent( evt );
|
||||||
|
wxGetApp().ProgramLog_CountMsg();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -418,12 +552,11 @@ namespace Console
|
||||||
if( emuLog != NULL )
|
if( emuLog != NULL )
|
||||||
fputs( fmt.ToAscii().data(), emuLog );
|
fputs( fmt.ToAscii().data(), emuLog );
|
||||||
|
|
||||||
wxGetApp().ProgramLog_CountMsg();
|
|
||||||
|
|
||||||
wxCommandEvent evt( wxEVT_LOG_Write );
|
wxCommandEvent evt( wxEVT_LOG_Write );
|
||||||
evt.SetString( fmt );
|
evt.SetString( fmt );
|
||||||
evt.SetExtraLong( th_CurrentColor );
|
evt.SetExtraLong( th_CurrentColor );
|
||||||
wxGetApp().ProgramLog_PostEvent( evt );
|
wxGetApp().ProgramLog_PostEvent( evt );
|
||||||
|
wxGetApp().ProgramLog_CountMsg();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -439,12 +572,11 @@ namespace Console
|
||||||
fputs( "\n", emuLog );
|
fputs( "\n", emuLog );
|
||||||
}
|
}
|
||||||
|
|
||||||
wxGetApp().ProgramLog_CountMsg();
|
|
||||||
|
|
||||||
wxCommandEvent evt( wxEVT_LOG_Write );
|
wxCommandEvent evt( wxEVT_LOG_Write );
|
||||||
evt.SetString( wxString::FromAscii( fmt ) + L"\n" );
|
evt.SetString( wxString::FromAscii( fmt ) + L"\n" );
|
||||||
evt.SetExtraLong( th_CurrentColor );
|
evt.SetExtraLong( th_CurrentColor );
|
||||||
wxGetApp().ProgramLog_PostEvent( evt );
|
wxGetApp().ProgramLog_PostEvent( evt );
|
||||||
|
wxGetApp().ProgramLog_CountMsg();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -460,12 +592,11 @@ namespace Console
|
||||||
fputs( "\n", emuLog );
|
fputs( "\n", emuLog );
|
||||||
}
|
}
|
||||||
|
|
||||||
wxGetApp().ProgramLog_CountMsg();
|
|
||||||
|
|
||||||
wxCommandEvent evt( wxEVT_LOG_Write );
|
wxCommandEvent evt( wxEVT_LOG_Write );
|
||||||
evt.SetString( fmt + L"\n" );
|
evt.SetString( fmt + L"\n" );
|
||||||
evt.SetExtraLong( th_CurrentColor );
|
evt.SetExtraLong( th_CurrentColor );
|
||||||
wxGetApp().ProgramLog_PostEvent( evt );
|
wxGetApp().ProgramLog_PostEvent( evt );
|
||||||
|
wxGetApp().ProgramLog_CountMsg();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,22 +110,23 @@ void MainEmuFrame::PopulatePadMenu()
|
||||||
//
|
//
|
||||||
void MainEmuFrame::OnCloseWindow(wxCloseEvent& evt)
|
void MainEmuFrame::OnCloseWindow(wxCloseEvent& evt)
|
||||||
{
|
{
|
||||||
wxCloseEvent conevt( wxEVT_CLOSE_WINDOW );
|
// Note Closure Veting would be handled here (user prompt confirmation
|
||||||
conevt.SetCanVeto( false ); // tells the console to close rather than hide
|
// of closing the app)
|
||||||
wxGetApp().ProgramLog_PostEvent( conevt );
|
|
||||||
|
wxGetApp().PrepForExit();
|
||||||
evt.Skip();
|
evt.Skip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainEmuFrame::OnMoveAround( wxMoveEvent& evt )
|
void MainEmuFrame::OnMoveAround( wxMoveEvent& evt )
|
||||||
{
|
{
|
||||||
// Uncomment this when going logger stress testing (and them move the window around)
|
// Uncomment this when doing logger stress testing (and then move the window around
|
||||||
|
// while the logger spams itself)
|
||||||
// ... makes for a good test of the message pump's responsiveness.
|
// ... makes for a good test of the message pump's responsiveness.
|
||||||
//Console::Notice( "Mess o' crashiness? It can't be!" );
|
Console::Notice( "Mess o' crashiness? It can't be!" );
|
||||||
|
|
||||||
// evt.GetPosition() returns the client area position, not the window frame position.
|
// evt.GetPosition() returns the client area position, not the window frame position.
|
||||||
// So read the window position directly... hope there's no problem with this too. :| --air
|
// So read the window's screen-relative position directly.
|
||||||
|
g_Conf->MainGuiPosition = GetScreenPosition();
|
||||||
g_Conf->MainGuiPosition = GetPosition();
|
|
||||||
|
|
||||||
// wxGTK note: X sends gratuitous amounts of OnMove messages for various crap actions
|
// wxGTK note: X sends gratuitous amounts of OnMove messages for various crap actions
|
||||||
// like selecting or deselecting a window, which muck up docking logic. We filter them
|
// like selecting or deselecting a window, which muck up docking logic. We filter them
|
||||||
|
@ -135,11 +136,10 @@ void MainEmuFrame::OnMoveAround( wxMoveEvent& evt )
|
||||||
if( lastpos == evt.GetPosition() ) return;
|
if( lastpos == evt.GetPosition() ) return;
|
||||||
lastpos = evt.GetPosition();
|
lastpos = evt.GetPosition();
|
||||||
|
|
||||||
if( g_Conf->ConLogBox.AutoDock )
|
if( g_Conf->ProgLogBox.AutoDock )
|
||||||
{
|
{
|
||||||
g_Conf->ConLogBox.DisplayPosition = GetRect().GetTopRight();
|
g_Conf->ProgLogBox.DisplayPosition = GetRect().GetTopRight();
|
||||||
wxCommandEvent conevt( wxEVT_DockConsole );
|
wxGetApp().GetProgramLog()->SetPosition( g_Conf->ProgLogBox.DisplayPosition );
|
||||||
wxGetApp().ProgramLog_PostEvent( conevt );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//evt.Skip();
|
//evt.Skip();
|
||||||
|
@ -147,7 +147,7 @@ void MainEmuFrame::OnMoveAround( wxMoveEvent& evt )
|
||||||
|
|
||||||
void MainEmuFrame::OnLogBoxHidden()
|
void MainEmuFrame::OnLogBoxHidden()
|
||||||
{
|
{
|
||||||
g_Conf->ConLogBox.Visible = false;
|
g_Conf->ProgLogBox.Visible = false;
|
||||||
m_MenuItem_Console.Check( false );
|
m_MenuItem_Console.Check( false );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,6 +182,24 @@ void MainEmuFrame::ConnectMenus()
|
||||||
ConnectMenu( Menu_About, Menu_ShowAboutBox );
|
ConnectMenu( Menu_About, Menu_ShowAboutBox );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void MainEmuFrame::InitLogBoxPosition( AppConfig::ConsoleLogOptions& conf )
|
||||||
|
{
|
||||||
|
conf.DisplaySize.Set(
|
||||||
|
std::min( std::max( conf.DisplaySize.GetWidth(), 160 ), wxGetDisplayArea().GetWidth() ),
|
||||||
|
std::min( std::max( conf.DisplaySize.GetHeight(), 160 ), wxGetDisplayArea().GetHeight() )
|
||||||
|
);
|
||||||
|
|
||||||
|
if( conf.AutoDock )
|
||||||
|
{
|
||||||
|
conf.DisplayPosition = GetScreenPosition() + wxSize( GetSize().x, 0 );
|
||||||
|
}
|
||||||
|
else if( conf.DisplayPosition != wxDefaultPosition )
|
||||||
|
{
|
||||||
|
if( !wxGetDisplayArea().Contains( wxRect( conf.DisplayPosition, conf.DisplaySize ) ) )
|
||||||
|
conf.DisplayPosition = wxDefaultPosition;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
MainEmuFrame::MainEmuFrame(wxWindow* parent, const wxString& title):
|
MainEmuFrame::MainEmuFrame(wxWindow* parent, const wxString& title):
|
||||||
wxFrame(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE & ~(wxMAXIMIZE_BOX | wxRESIZE_BORDER) ),
|
wxFrame(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE & ~(wxMAXIMIZE_BOX | wxRESIZE_BORDER) ),
|
||||||
|
@ -239,36 +257,18 @@ MainEmuFrame::MainEmuFrame(wxWindow* parent, const wxString& title):
|
||||||
joe.Add( &m_background );
|
joe.Add( &m_background );
|
||||||
SetSizerAndFit( &joe );
|
SetSizerAndFit( &joe );
|
||||||
|
|
||||||
// Valid zone for window positioning.
|
|
||||||
// Top/Left boundaries are fairly strict, since any more offscreen and the window titlebar
|
|
||||||
// would be obscured from being grabbable.
|
|
||||||
|
|
||||||
wxRect screenzone( wxPoint(), wxGetDisplaySize() );
|
|
||||||
|
|
||||||
// Use default window position if the configured windowpos is invalid (partially offscreen)
|
// Use default window position if the configured windowpos is invalid (partially offscreen)
|
||||||
if( g_Conf->MainGuiPosition == wxDefaultPosition || !screenzone.Contains( wxRect( g_Conf->MainGuiPosition, GetSize() ) ) )
|
if( g_Conf->MainGuiPosition == wxDefaultPosition || !pxIsValidWindowPosition( *this, g_Conf->MainGuiPosition) )
|
||||||
g_Conf->MainGuiPosition = GetPosition();
|
g_Conf->MainGuiPosition = GetScreenPosition();
|
||||||
else
|
else
|
||||||
SetPosition( g_Conf->MainGuiPosition );
|
SetPosition( g_Conf->MainGuiPosition );
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// Updating console log positions after the main window has been fitted to its sizer ensures
|
||||||
// Sort out the console log window position (must be done after fitting the window
|
// proper docked positioning, since the main window's size is invalid until after the sizer
|
||||||
// sizer, to ensure correct 'docked mode' positioning).
|
// has been set/fit.
|
||||||
|
|
||||||
g_Conf->ConLogBox.DisplaySize.Set(
|
InitLogBoxPosition( g_Conf->ProgLogBox );
|
||||||
std::min( std::max( g_Conf->ConLogBox.DisplaySize.GetWidth(), 160 ), screenzone.GetWidth() ),
|
InitLogBoxPosition( g_Conf->Ps2ConBox );
|
||||||
std::min( std::max( g_Conf->ConLogBox.DisplaySize.GetHeight(), 160 ), screenzone.GetHeight() )
|
|
||||||
);
|
|
||||||
|
|
||||||
if( g_Conf->ConLogBox.AutoDock )
|
|
||||||
{
|
|
||||||
g_Conf->ConLogBox.DisplayPosition = GetPosition() + wxSize( GetSize().x, 0 );
|
|
||||||
}
|
|
||||||
else if( g_Conf->ConLogBox.DisplayPosition != wxDefaultPosition )
|
|
||||||
{
|
|
||||||
if( !screenzone.Contains( wxRect( g_Conf->ConLogBox.DisplayPosition, wxSize( 75, 150 ) ) ) )
|
|
||||||
g_Conf->ConLogBox.DisplayPosition = wxDefaultPosition;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
@ -330,7 +330,7 @@ MainEmuFrame::MainEmuFrame(wxWindow* parent, const wxString& title):
|
||||||
m_menuDebug.Append(Menu_Debug_MemoryDump, _("Memory Dump..."), wxEmptyString);
|
m_menuDebug.Append(Menu_Debug_MemoryDump, _("Memory Dump..."), wxEmptyString);
|
||||||
m_menuDebug.Append(Menu_Debug_Logging, _("Logging..."), wxEmptyString);
|
m_menuDebug.Append(Menu_Debug_Logging, _("Logging..."), wxEmptyString);
|
||||||
|
|
||||||
m_MenuItem_Console.Check( g_Conf->ConLogBox.Visible );
|
m_MenuItem_Console.Check( g_Conf->ProgLogBox.Visible );
|
||||||
|
|
||||||
ConnectMenus();
|
ConnectMenus();
|
||||||
Connect( wxEVT_MOVE, wxMoveEventHandler (MainEmuFrame::OnMoveAround) );
|
Connect( wxEVT_MOVE, wxMoveEventHandler (MainEmuFrame::OnMoveAround) );
|
||||||
|
|
|
@ -28,12 +28,10 @@
|
||||||
//
|
//
|
||||||
class MainEmuFrame: public wxFrame
|
class MainEmuFrame: public wxFrame
|
||||||
{
|
{
|
||||||
public:
|
|
||||||
MainEmuFrame(wxWindow* parent, const wxString& title);
|
|
||||||
|
|
||||||
void OnLogBoxHidden();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// All Menu Options for the Main Window! :D
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
enum Identifiers
|
enum Identifiers
|
||||||
{
|
{
|
||||||
|
@ -112,17 +110,9 @@ protected:
|
||||||
Menu_Language_Start = 1000
|
Menu_Language_Start = 1000
|
||||||
};
|
};
|
||||||
|
|
||||||
wxMenu* MakeStatesSubMenu( int baseid ) const;
|
// ------------------------------------------------------------------------
|
||||||
wxMenu* MakeStatesMenu();
|
// MainEmuFrame Protected Variables
|
||||||
wxMenu* MakeLanguagesMenu() const;
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
wxMenu* MakeIsoMenu();
|
|
||||||
wxMenu* MakeCdvdMenu();
|
|
||||||
|
|
||||||
void PopulateVideoMenu();
|
|
||||||
void PopulateAudioMenu();
|
|
||||||
void PopulatePadMenu();
|
|
||||||
void ConnectMenus();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
wxStatusBar& m_statusbar;
|
wxStatusBar& m_statusbar;
|
||||||
|
@ -144,10 +134,17 @@ protected:
|
||||||
|
|
||||||
wxMenuItem& m_MenuItem_Console;
|
wxMenuItem& m_MenuItem_Console;
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
// ------------------------------------------------------------------------
|
||||||
// Menu Options for the Main Window! :D
|
// MainEmuFrame Constructors and Member Methods
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
public:
|
||||||
|
MainEmuFrame(wxWindow* parent, const wxString& title);
|
||||||
|
void OnLogBoxHidden();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
void InitLogBoxPosition( AppConfig::ConsoleLogOptions& conf );
|
||||||
|
|
||||||
void OnCloseWindow(wxCloseEvent& evt);
|
void OnCloseWindow(wxCloseEvent& evt);
|
||||||
void OnMoveAround( wxMoveEvent& evt );
|
void OnMoveAround( wxMoveEvent& evt );
|
||||||
|
|
||||||
|
@ -173,5 +170,20 @@ protected:
|
||||||
|
|
||||||
void Menu_ShowConsole(wxCommandEvent &event);
|
void Menu_ShowConsole(wxCommandEvent &event);
|
||||||
void Menu_ShowAboutBox(wxCommandEvent &event);
|
void Menu_ShowAboutBox(wxCommandEvent &event);
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
// MainEmuFram Internal API for Populating Main Menu Contents
|
||||||
|
// ------------------------------------------------------------------------
|
||||||
|
|
||||||
|
wxMenu* MakeStatesSubMenu( int baseid ) const;
|
||||||
|
wxMenu* MakeStatesMenu();
|
||||||
|
wxMenu* MakeLanguagesMenu() const;
|
||||||
|
wxMenu* MakeIsoMenu();
|
||||||
|
wxMenu* MakeCdvdMenu();
|
||||||
|
|
||||||
|
void PopulateVideoMenu();
|
||||||
|
void PopulateAudioMenu();
|
||||||
|
void PopulatePadMenu();
|
||||||
|
void ConnectMenus();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -101,8 +101,8 @@ void MainEmuFrame::Menu_ShowConsole(wxCommandEvent &event)
|
||||||
{
|
{
|
||||||
// Use messages to relay open/close commands (thread-safe)
|
// Use messages to relay open/close commands (thread-safe)
|
||||||
|
|
||||||
g_Conf->ConLogBox.Visible = event.IsChecked();
|
g_Conf->ProgLogBox.Visible = event.IsChecked();
|
||||||
wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED, g_Conf->ConLogBox.Visible ? wxID_OPEN : wxID_CLOSE );
|
wxCommandEvent evt( wxEVT_COMMAND_MENU_SELECTED, g_Conf->ProgLogBox.Visible ? wxID_OPEN : wxID_CLOSE );
|
||||||
wxGetApp().ProgramLog_PostEvent( evt );
|
wxGetApp().ProgramLog_PostEvent( evt );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,8 +28,8 @@
|
||||||
|
|
||||||
IMPLEMENT_APP(Pcsx2App)
|
IMPLEMENT_APP(Pcsx2App)
|
||||||
|
|
||||||
AppConfig* g_Conf = NULL;
|
AppConfig* g_Conf = NULL;
|
||||||
wxFileHistory* g_RecentIsoList = NULL;
|
wxFileHistory* g_RecentIsoList = NULL;
|
||||||
|
|
||||||
namespace Exception
|
namespace Exception
|
||||||
{
|
{
|
||||||
|
@ -159,27 +159,6 @@ bool Pcsx2App::OnCmdLineParsed(wxCmdLineParser& parser)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////////
|
|
||||||
// ConsoleThreadTest -- useful class for unit testing the thread safety and general performance
|
|
||||||
// of the console logger.
|
|
||||||
//
|
|
||||||
class ConsoleTestThread : public Thread
|
|
||||||
{
|
|
||||||
int Callback()
|
|
||||||
{
|
|
||||||
static int numtrack = 0;
|
|
||||||
|
|
||||||
while( true )
|
|
||||||
{
|
|
||||||
// Two lines, both formatted, and varied colors. This makes for a fairly realistic
|
|
||||||
// worst case scenario (without being entirely unrealistic).
|
|
||||||
Console::WriteLn( wxsFormat( L"This is a threaded logging test. Something bad could happen... %d", ++numtrack ) );
|
|
||||||
Console::Status( wxsFormat( L"Testing high stress loads %s", L"(multi-color)" ) );
|
|
||||||
Sleep( 0 );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
bool Pcsx2App::OnInit()
|
bool Pcsx2App::OnInit()
|
||||||
{
|
{
|
||||||
|
@ -218,10 +197,16 @@ bool Pcsx2App::OnInit()
|
||||||
|
|
||||||
g_Conf->Folders.Logs.Mkdir();
|
g_Conf->Folders.Logs.Mkdir();
|
||||||
|
|
||||||
m_ProgramLogBox = new ConsoleLogFrame( NULL, L"PCSX2 Program Log", g_Conf->ConLogBox );
|
m_MainFrame = new MainEmuFrame( NULL, L"PCSX2" );
|
||||||
m_Ps2ConLogBox = m_ProgramLogBox; // just use a single logger for now.
|
m_ProgramLogBox = new ConsoleLogFrame( m_MainFrame, L"PCSX2 Program Log", g_Conf->ProgLogBox );
|
||||||
|
m_Ps2ConLogBox = m_ProgramLogBox; // just use a single logger for now.
|
||||||
//m_Ps2ConLogBox = new ConsoleLogFrame( NULL, L"PS2 Console Log" );
|
//m_Ps2ConLogBox = new ConsoleLogFrame( NULL, L"PS2 Console Log" );
|
||||||
|
|
||||||
|
|
||||||
|
SetTopWindow( m_MainFrame ); // not really needed...
|
||||||
|
SetExitOnFrameDelete( true ); // but being explicit doesn't hurt...
|
||||||
|
m_MainFrame->Show();
|
||||||
|
|
||||||
SysInit();
|
SysInit();
|
||||||
}
|
}
|
||||||
catch( Exception::StartupAborted& )
|
catch( Exception::StartupAborted& )
|
||||||
|
@ -229,15 +214,6 @@ bool Pcsx2App::OnInit()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_MainFrame = new MainEmuFrame( NULL, L"PCSX2" );
|
|
||||||
SetTopWindow( m_MainFrame );
|
|
||||||
SetExitOnFrameDelete( true );
|
|
||||||
m_MainFrame->Show();
|
|
||||||
|
|
||||||
// Logger Stress Test: See ConsoleTestThread defined above for details
|
|
||||||
//ConsoleTestThread* woo = new ConsoleTestThread();
|
|
||||||
//woo->Start();
|
|
||||||
|
|
||||||
// Check to see if the user needs to perform initial setup:
|
// Check to see if the user needs to perform initial setup:
|
||||||
|
|
||||||
/*bool needsConfigured = false;
|
/*bool needsConfigured = false;
|
||||||
|
@ -259,6 +235,14 @@ bool Pcsx2App::OnInit()
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Common exit handler which can be called from any event (though really it should
|
||||||
|
// be called only from CloseWindow handlers since that's the more appropriate way
|
||||||
|
// to handle window closures)
|
||||||
|
bool Pcsx2App::PrepForExit()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
int Pcsx2App::OnExit()
|
int Pcsx2App::OnExit()
|
||||||
{
|
{
|
||||||
g_Conf->Save();
|
g_Conf->Save();
|
||||||
|
|
|
@ -25,6 +25,27 @@
|
||||||
# include <wx/tooltip.h>
|
# include <wx/tooltip.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Retrieves the area of the screen, which can be used to enforce a valid zone for
|
||||||
|
// window positioning. (top/left coords are almost always (0,0) and bottom/right
|
||||||
|
// is the resolution of the desktop).
|
||||||
|
wxRect wxGetDisplayArea()
|
||||||
|
{
|
||||||
|
return wxRect( wxPoint(), wxGetDisplaySize() );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns FALSE if the window position is considered invalid, which means that it's title
|
||||||
|
// bar is most likely not easily grabble. Such a window should be moved to a valid or
|
||||||
|
// default position.
|
||||||
|
bool pxIsValidWindowPosition( const wxWindow& window, const wxPoint& windowPos )
|
||||||
|
{
|
||||||
|
// The height of the window is only revlevant to the height of a title bar, which is
|
||||||
|
// all we need visible for the user to be able to drag the window into view. But
|
||||||
|
// there's no way to get that info from wx, so we'll just have to guesstimate...
|
||||||
|
|
||||||
|
wxSize sizeMatters( window.GetSize().GetWidth(), 32 ); // if some gui has 32 pixels of undraggable title bar, the user deserves to suffer.
|
||||||
|
return wxGetDisplayArea().Contains( wxRect( windowPos, sizeMatters ) );
|
||||||
|
}
|
||||||
|
|
||||||
namespace wxHelpers
|
namespace wxHelpers
|
||||||
{
|
{
|
||||||
// ------------------------------------------------------------------------
|
// ------------------------------------------------------------------------
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
#include <wx/wx.h>
|
#include <wx/wx.h>
|
||||||
#include <wx/filepicker.h>
|
#include <wx/filepicker.h>
|
||||||
|
|
||||||
|
|
||||||
namespace wxHelpers
|
namespace wxHelpers
|
||||||
{
|
{
|
||||||
extern wxCheckBox& AddCheckBoxTo( wxWindow* parent, wxSizer& sizer, const wxString& label, const wxString& subtext=wxEmptyString, const wxString& tooltip=wxEmptyString, int wrapLen=wxDefaultCoord );
|
extern wxCheckBox& AddCheckBoxTo( wxWindow* parent, wxSizer& sizer, const wxString& label, const wxString& subtext=wxEmptyString, const wxString& tooltip=wxEmptyString, int wrapLen=wxDefaultCoord );
|
||||||
|
|
|
@ -88,6 +88,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Include", "Include", "{0FAD
|
||||||
common\include\Pcsx2Config.h = common\include\Pcsx2Config.h
|
common\include\Pcsx2Config.h = common\include\Pcsx2Config.h
|
||||||
common\include\Pcsx2Defs.h = common\include\Pcsx2Defs.h
|
common\include\Pcsx2Defs.h = common\include\Pcsx2Defs.h
|
||||||
common\include\Pcsx2Types.h = common\include\Pcsx2Types.h
|
common\include\Pcsx2Types.h = common\include\Pcsx2Types.h
|
||||||
|
common\include\PluginCallbacks.h = common\include\PluginCallbacks.h
|
||||||
common\include\PS2Edefs.h = common\include\PS2Edefs.h
|
common\include\PS2Edefs.h = common\include\PS2Edefs.h
|
||||||
common\include\PS2Etypes.h = common\include\PS2Etypes.h
|
common\include\PS2Etypes.h = common\include\PS2Etypes.h
|
||||||
EndProjectSection
|
EndProjectSection
|
||||||
|
|
Loading…
Reference in New Issue