From 3a5d1ace9171ba44e9670bc8196711c678707931 Mon Sep 17 00:00:00 2001 From: Gauvain 'GovanifY' Roussel-Tarbouriech Date: Wed, 12 May 2021 13:46:03 +0200 Subject: [PATCH] gs-merge: gui fixups, getting rid of the plugin selector --- .../Utilities/InputRecordingLogger.cpp | 7 +- pcsx2/gui/AppConfig.cpp | 75 +---------- pcsx2/gui/AppEventSources.cpp | 35 ------ pcsx2/gui/AppInit.cpp | 39 ------ pcsx2/gui/AppMain.cpp | 30 +---- pcsx2/gui/AppRes.cpp | 2 - pcsx2/gui/ConsoleLogger.cpp | 5 +- pcsx2/gui/ConsoleLogger.h | 2 +- pcsx2/gui/Dialogs/FirstTimeWizard.cpp | 21 +--- pcsx2/gui/Dialogs/GSDumpDialog.cpp | 31 +++-- pcsx2/gui/Dialogs/SysConfigDialog.cpp | 21 ---- pcsx2/gui/FrameForGS.cpp | 116 +++++++++--------- pcsx2/gui/GlobalCommands.cpp | 38 +++--- pcsx2/gui/MainFrame.cpp | 96 +-------------- pcsx2/gui/MainFrame.h | 58 +-------- pcsx2/gui/MainMenuClicks.cpp | 71 +++-------- pcsx2/gui/MemoryCardFile.cpp | 22 ++-- pcsx2/gui/MemoryCardFolder.h | 5 +- pcsx2/gui/Resources/ConfigIcon_Plugins.png | Bin 13991 -> 0 bytes 19 files changed, 133 insertions(+), 541 deletions(-) delete mode 100644 pcsx2/gui/Resources/ConfigIcon_Plugins.png diff --git a/pcsx2/Recording/Utilities/InputRecordingLogger.cpp b/pcsx2/Recording/Utilities/InputRecordingLogger.cpp index cb97907e97..0619301546 100644 --- a/pcsx2/Recording/Utilities/InputRecordingLogger.cpp +++ b/pcsx2/Recording/Utilities/InputRecordingLogger.cpp @@ -1,4 +1,4 @@ -/* PCSX2 - PS2 Emulator for PCs +/* PCSX2 - PS2 Emulator for PCs * Copyright (C) 2002-2021 PCSX2 Dev Team * * PCSX2 is free software: you can redistribute it and/or modify it under the terms @@ -27,8 +27,7 @@ namespace inputRec recordingConLog(fmt::format("[REC]: {}\n", log)); // NOTE - Color is not currently used for OSD logs - if (GSosdLog) - GSosdLog(log.c_str(), wxGetApp().GetProgramLog()->GetRGBA(ConsoleColors::Color_StrongMagenta)); + GSosdLog(log.c_str(), wxGetApp().GetProgramLog()->GetRGBA(ConsoleColors::Color_StrongMagenta)); } void consoleLog(const std::string& log) @@ -47,4 +46,4 @@ namespace inputRec recordingConLog(log); } -} // namespace inputRec \ No newline at end of file +} // namespace inputRec diff --git a/pcsx2/gui/AppConfig.cpp b/pcsx2/gui/AppConfig.cpp index fb7454b487..bc4c0d7fe1 100644 --- a/pcsx2/gui/AppConfig.cpp +++ b/pcsx2/gui/AppConfig.cpp @@ -16,7 +16,6 @@ #include "PrecompiledHeader.h" #include "App.h" #include "MainFrame.h" -#include "Plugins.h" #include "MemoryCardFile.h" @@ -221,19 +220,6 @@ namespace PathDefs return GetDocuments() + Base::MemoryCards(); } - wxDirName GetPlugins() - { - // Each linux distributions have his rules for path so we give them the possibility to - // change it with compilation flags. -- Gregory -#ifndef PLUGIN_DIR_COMPILATION - return AppRoot() + Base::Plugins(); -#else -#define xPLUGIN_DIR_str(s) PLUGIN_DIR_str(s) -#define PLUGIN_DIR_str(s) #s - return wxDirName( xPLUGIN_DIR_str(PLUGIN_DIR_COMPILATION) ); -#endif - } - wxDirName GetSettings() { return GetDocuments() + Base::Settings(); @@ -257,7 +243,6 @@ namespace PathDefs { switch( folderidx ) { - case FolderId_Plugins: return GetPlugins(); case FolderId_Settings: return GetSettings(); case FolderId_Bios: return GetBios(); case FolderId_Snapshots: return GetSnapshots(); @@ -280,7 +265,6 @@ wxDirName& AppConfig::FolderOptions::operator[]( FoldersEnum_t folderidx ) { switch( folderidx ) { - case FolderId_Plugins: return PluginsFolder; case FolderId_Settings: return SettingsFolder; case FolderId_Bios: return Bios; case FolderId_Snapshots: return Snapshots; @@ -295,7 +279,7 @@ wxDirName& AppConfig::FolderOptions::operator[]( FoldersEnum_t folderidx ) jNO_DEFAULT } - return PluginsFolder; // unreachable, but suppresses warnings. + return SettingsFolder; // unreachable, but suppresses warnings. } const wxDirName& AppConfig::FolderOptions::operator[]( FoldersEnum_t folderidx ) const @@ -307,7 +291,6 @@ bool AppConfig::FolderOptions::IsDefault( FoldersEnum_t folderidx ) const { switch( folderidx ) { - case FolderId_Plugins: return UseDefaultPluginsFolder; case FolderId_Settings: return UseDefaultSettingsFolder; case FolderId_Bios: return UseDefaultBios; case FolderId_Snapshots: return UseDefaultSnapshots; @@ -329,11 +312,6 @@ void AppConfig::FolderOptions::Set( FoldersEnum_t folderidx, const wxString& src { switch( folderidx ) { - case FolderId_Plugins: - PluginsFolder = src; - UseDefaultPluginsFolder = useDefault; - break; - case FolderId_Settings: SettingsFolder = src; UseDefaultSettingsFolder = useDefault; @@ -437,22 +415,6 @@ namespace FilenameDefs } }; -wxString AppConfig::FullpathTo( PluginsEnum_t pluginidx ) const -{ - return Path::Combine( PluginsFolder, BaseFilenames[pluginidx] ); -} - -// returns true if the filenames are quite absolutely the equivalent. Works for all -// types of filenames, relative and absolute. Very important that you use this function -// rather than any other type of more direct string comparison! -bool AppConfig::FullpathMatchTest( PluginsEnum_t pluginId, const wxString& cmpto ) const -{ - // Implementation note: wxFileName automatically normalizes things as needed in it's - // equality comparison implementations, so we can do a simple comparison as follows: - - return wxFileName(cmpto).SameAs( FullpathTo(pluginId) ); -} - static wxDirName GetResolvedFolder(FoldersEnum_t id) { return g_Conf->Folders.IsDefault(id) ? PathDefs::Get(id) : g_Conf->Folders[id]; @@ -515,7 +477,6 @@ AppConfig::AppConfig() : MainGuiPosition( wxDefaultPosition ) , SysSettingsTabName( L"Cpu" ) , McdSettingsTabName( L"none" ) - , ComponentsTabName( L"Plugins" ) , AppSettingsTabName( L"none" ) , GameDatabaseTabName( L"none" ) { @@ -585,8 +546,6 @@ void App_LoadSaveInstallSettings( IniInterface& ini ) ini.Entry( L"Install_Dir", InstallFolder, (wxDirName)(wxFileName(wxStandardPaths::Get().GetExecutablePath()).GetPath()) ); SetFullBaseDir( InstallFolder ); - //ini.Entry( L"PluginsFolder", PluginsFolder, InstallFolder + PathDefs::Base::Plugins() ); - ini.Flush(); } @@ -719,7 +678,6 @@ void AppConfig::FolderOptions::ApplyDefaults() if( UseDefaultMemoryCards ) MemoryCards = PathDefs::GetMemoryCards(); if( UseDefaultLogs ) Logs = PathDefs::GetLogs(); if( UseDefaultLangs ) Langs = PathDefs::GetLangs(); - if( UseDefaultPluginsFolder)PluginsFolder = PathDefs::GetPlugins(); if( UseDefaultCheats ) Cheats = PathDefs::GetCheats(); if( UseDefaultCheatsWS ) CheatsWS = PathDefs::GetCheatsWS(); } @@ -757,7 +715,6 @@ void AppConfig::FolderOptions::LoadSave( IniInterface& ini ) IniBitBool( UseDefaultMemoryCards ); IniBitBool( UseDefaultLogs ); IniBitBool( UseDefaultLangs ); - IniBitBool( UseDefaultPluginsFolder ); IniBitBool( UseDefaultCheats ); IniBitBool( UseDefaultCheatsWS ); @@ -773,7 +730,6 @@ void AppConfig::FolderOptions::LoadSave( IniInterface& ini ) IniEntryDirFile( Langs, rel ); IniEntryDirFile( Cheats, rel ); IniEntryDirFile( CheatsWS, rel ); - ini.Entry( L"PluginsFolder", PluginsFolder, InstallFolder + PathDefs::Base::Plugins(), rel ); IniEntryDirFile( RunIso, rel ); IniEntryDirFile( RunELF, rel ); @@ -789,12 +745,6 @@ void AppConfig::FolderOptions::LoadSave( IniInterface& ini ) } // ------------------------------------------------------------------------ -const wxFileName& AppConfig::FilenameOptions::operator[]( PluginsEnum_t pluginidx ) const -{ - IndexBoundsAssumeDev( L"Filename[Plugin]", pluginidx, PluginId_Count ); - return Plugins[pluginidx]; -} - void AppConfig::FilenameOptions::LoadSave( IniInterface& ini ) { ScopedIniGroup path( ini, L"Filenames" ); @@ -806,15 +756,6 @@ void AppConfig::FilenameOptions::LoadSave( IniInterface& ini ) //note: this will break if converting from install to portable, and custom folders are used. We can live with that. bool needRelativeName = ini.IsSaving() && IsPortable(); - for( int i=0; i conf_install; - - if (InstallationMode == InstallMode_Portable) return; - - // sApp. macro cannot be use because you need the return value of OpenInstallSettingsFile method - if( Pcsx2App* __app_ = (Pcsx2App*)wxApp::GetInstance() ) conf_install = std::unique_ptr((*__app_).OpenInstallSettingsFile()); - conf_install->SetRecordDefaults(false); - - App_SaveInstallSettings( conf_install.get() ); -} - void AppSaveSettings() { // If multiple SaveSettings messages are requested, we want to ignore most of them. @@ -1389,7 +1317,6 @@ void AppSaveSettings() SaveUiSettings(); SaveVmSettings(); - SaveRegSettings(); // save register because of PluginsFolder change isPosted = false; } diff --git a/pcsx2/gui/AppEventSources.cpp b/pcsx2/gui/AppEventSources.cpp index ae1f14278b..79908cd35b 100644 --- a/pcsx2/gui/AppEventSources.cpp +++ b/pcsx2/gui/AppEventSources.cpp @@ -19,7 +19,6 @@ #include "Utilities/EventSource.inl" template class EventSource< IEventListener_CoreThread >; -template class EventSource< IEventListener_Plugins >; template class EventSource< IEventListener_AppStatus >; AppSettingsEventInfo::AppSettingsEventInfo( IniInterface& ini, AppEventType evt_type ) @@ -54,33 +53,6 @@ void IEventListener_CoreThread::DispatchEvent( const CoreThreadStatus& status ) } } -EventListener_Plugins::EventListener_Plugins() -{ - wxGetApp().AddListener( this ); -} - -EventListener_Plugins::~EventListener_Plugins() -{ - wxGetApp().RemoveListener( this ); -} - -void IEventListener_Plugins::DispatchEvent( const PluginEventType& pevt ) -{ - switch( pevt ) - { - case CorePlugins_Loaded: CorePlugins_OnLoaded(); break; - case CorePlugins_Init: CorePlugins_OnInit(); break; - case CorePlugins_Opening: CorePlugins_OnOpening(); break; - case CorePlugins_Opened: CorePlugins_OnOpened(); break; - case CorePlugins_Closing: CorePlugins_OnClosing(); break; - case CorePlugins_Closed: CorePlugins_OnClosed(); break; - case CorePlugins_Shutdown: CorePlugins_OnShutdown(); break; - case CorePlugins_Unloaded: CorePlugins_OnUnloaded(); break; - - jNO_DEFAULT; - } -} - EventListener_AppStatus::EventListener_AppStatus() { wxGetApp().AddListener( this ); @@ -115,13 +87,6 @@ void IEventListener_AppStatus::DispatchEvent( const AppEventInfo& evtinfo ) } } - -void Pcsx2App::DispatchEvent( PluginEventType evt ) -{ - if( !AffinityAssert_AllowFrom_MainUI() ) return; - m_evtsrc_CorePluginStatus.Dispatch( evt ); -} - void Pcsx2App::DispatchEvent( AppEventType evt ) { if( !AffinityAssert_AllowFrom_MainUI() ) return; diff --git a/pcsx2/gui/AppInit.cpp b/pcsx2/gui/AppInit.cpp index f636b4092d..3475bf1877 100644 --- a/pcsx2/gui/AppInit.cpp +++ b/pcsx2/gui/AppInit.cpp @@ -57,11 +57,6 @@ void Pcsx2App::DetectCpuAndUserMode() #endif EstablishAppUserMode(); - - // force unload plugins loaded by the wizard. If we don't do this the recompilers might - // fail to allocate the memory they need to function. - ShutdownPlugins(); - UnloadPlugins(); } void Pcsx2App::OpenMainFrame() @@ -196,8 +191,6 @@ void Pcsx2App::AllocateCoreStuffs() pxIssueConfirmation(exconf, MsgButtons().OK()); } } - - LoadPluginsPassive(); } @@ -240,11 +233,6 @@ void Pcsx2App::OnInitCmdLine(wxCmdLineParser& parser) parser.AddSwitch(wxEmptyString, L"profiling", _("update options to ease profiling (debug)")); - ForPlugins([&](const PluginInfo* pi) { - parser.AddOption(wxEmptyString, pi->GetShortname().Lower(), - pxsFmt(_("specify the file to use as the %s plugin"), WX_STR(pi->GetShortname()))); - }); - parser.SetSwitchChars(L"-"); } @@ -286,33 +274,6 @@ bool Pcsx2App::ParseOverrides(wxCmdLineParser& parser) if (parser.Found(L"windowed")) Overrides.GsWindowMode = GsWinMode_Windowed; - ForPlugins([&](const PluginInfo* pi) { - if (parser.Found(pi->GetShortname().Lower(), &dest)) - { - if (wxFileExists(dest)) - Console.Warning(pi->GetShortname() + L" override: " + dest); - else - { - wxDialogWithHelpers okcan(NULL, AddAppName(_("Plugin Override Error - %s"))); - - okcan += okcan.Heading(wxsFormat( - _("%s Plugin Override Error! The following file does not exist or is not a valid %s plugin:\n\n"), - pi->GetShortname().c_str(), pi->GetShortname().c_str())); - - okcan += okcan.GetCharHeight(); - okcan += okcan.Text(dest); - okcan += okcan.GetCharHeight(); - okcan += okcan.Heading(AddAppName(_("Press OK to use the default configured plugin, or Cancel to close %s."))); - - if (wxID_CANCEL == pxIssueConfirmation(okcan, MsgButtons().OKCancel())) - parsed = false; - } - - if (parsed) - Overrides.Filenames.Plugins[pi->id] = dest; - } - }); - return parsed; } diff --git a/pcsx2/gui/AppMain.cpp b/pcsx2/gui/AppMain.cpp index 6d839b1167..2a7195ebfb 100644 --- a/pcsx2/gui/AppMain.cpp +++ b/pcsx2/gui/AppMain.cpp @@ -27,7 +27,6 @@ #include "PAD/Linux/PAD.h" #endif -#include "Plugins.h" #include "ps2/BiosTools.h" #include "Dialogs/ModalPopups.h" @@ -495,9 +494,7 @@ void Pcsx2App::LogicalVsync() renderswitch_delay >>= 1; - // Only call PADupdate here if we're using GSopen2. Legacy GSopen plugins have the - // GS window belonging to the MTGS thread. - if( (GSopen2 != NULL) && (wxGetApp().GetGsFramePtr() != NULL) ) + if( (wxGetApp().GetGsFramePtr() != NULL) ) PADupdate(0); while( const keyEvent* ev = PADkeyEvent() ) @@ -506,9 +503,7 @@ void Pcsx2App::LogicalVsync() // Give plugins first try to handle keys. If none of them handles the key, it will // be passed to the main user interface. - - if( !GetCorePlugins().KeyEvent( *ev ) ) - PadKeyDispatch( *ev ); + PadKeyDispatch( *ev ); } } @@ -725,8 +720,6 @@ void Pcsx2App::resetDebugger() dlg->reset(); } -// NOTE: Plugins are *not* applied by this function. Changes to plugins need to handled -// manually. The PluginSelectorPanel does this, for example. void AppApplySettings( const AppConfig* oldconf ) { AffinityAssert_AllowFrom_MainUI(); @@ -735,8 +728,8 @@ void AppApplySettings( const AppConfig* oldconf ) g_Conf->Folders.ApplyDefaults(); - // Ensure existence of necessary documents folders. Plugins and other parts - // of PCSX2 rely on them. + // Ensure existence of necessary documents folders. + // Other parts of PCSX2 rely on them. g_Conf->Folders.MemoryCards.Mkdir(); g_Conf->Folders.Savestates.Mkdir(); @@ -753,8 +746,6 @@ void AppApplySettings( const AppConfig* oldconf ) wxDoNotLogInThisScope please; i18n_SetLanguage( g_Conf->LanguageId, g_Conf->LanguageCode ); } - - CorePlugins.SetSettingsFolder( GetSettingsFolder().ToString() ); // Update the compression attribute on the Memcards folder. // Memcards generally compress very well via NTFS compression. @@ -874,8 +865,8 @@ void Pcsx2App::OpenGsPanel() gsFrame->SetSize( newsize ); gsFrame->SetSize( oldsize ); } - - pxAssertDev( !GetCorePlugins().IsOpen( PluginId_GS ), "GS Plugin must be closed prior to opening a new Gs Panel!" ); + + //TODO: MAKE SURE GS IS CLOSED HERE #ifdef __WXGTK__ // The x window/display are actually very deeper in the widget. You need both display and window @@ -928,13 +919,6 @@ void Pcsx2App::CloseGsPanel() { if (AppRpc_TryInvoke(&Pcsx2App::CloseGsPanel)) return; - - if (CloseViewportWithPlugins) - { - if (GSFrame* gsFrame = GetGsFramePtr()) - if (GSPanel* woot = gsFrame->GetViewport()) - woot->Destroy(); - } } void Pcsx2App::OnGsFrameClosed(wxWindowID id) @@ -1029,8 +1013,6 @@ protected: // if something unloaded plugins since this messages was queued then it's best to ignore // it, because apparently too much stuff is going on and the emulation states are wonky. - if( !CorePlugins.AreLoaded() ) return; - DbgCon.WriteLn( Color_Gray, "(SysExecute) received." ); CoreThread.ResetQuick(); diff --git a/pcsx2/gui/AppRes.cpp b/pcsx2/gui/AppRes.cpp index b5430ea45f..41bffd036d 100644 --- a/pcsx2/gui/AppRes.cpp +++ b/pcsx2/gui/AppRes.cpp @@ -33,7 +33,6 @@ #include "Resources/ConfigIcon_Speedhacks.h" #include "Resources/ConfigIcon_Gamefixes.h" #include "Resources/ConfigIcon_Paths.h" -#include "Resources/ConfigIcon_Plugins.h" #include "Resources/ConfigIcon_MemoryCard.h" #include "Resources/AppIcon16.h" @@ -147,7 +146,6 @@ wxImageList& Pcsx2App::GetImgList_Config() } FancyLoadMacro(Paths); - FancyLoadMacro(Plugins); FancyLoadMacro(Gamefixes); FancyLoadMacro(Speedhacks); FancyLoadMacro(MemoryCard); diff --git a/pcsx2/gui/ConsoleLogger.cpp b/pcsx2/gui/ConsoleLogger.cpp index 68cdc438e3..252efd5ee2 100644 --- a/pcsx2/gui/ConsoleLogger.cpp +++ b/pcsx2/gui/ConsoleLogger.cpp @@ -1265,16 +1265,13 @@ void Pcsx2App::DisableWindowLogging() const void OSDlog(ConsoleColors color, bool console, const std::string& str) { - if (GSosdLog) - GSosdLog(str.c_str(), wxGetApp().GetProgramLog()->GetRGBA(color)); + GSosdLog(str.c_str(), wxGetApp().GetProgramLog()->GetRGBA(color)); if (console) Console.WriteLn(color, str.c_str()); } void OSDmonitor(ConsoleColors color, const std::string key, const std::string value) { - if(!GSosdMonitor) return; - GSosdMonitor(wxString(key).utf8_str(), wxString(value).utf8_str(), wxGetApp().GetProgramLog()->GetRGBA(color)); } diff --git a/pcsx2/gui/ConsoleLogger.h b/pcsx2/gui/ConsoleLogger.h index 6cec648b26..b0544a0bd9 100644 --- a/pcsx2/gui/ConsoleLogger.h +++ b/pcsx2/gui/ConsoleLogger.h @@ -235,7 +235,7 @@ void OSDlog(ConsoleColors color, bool console, const std::string& str); template void OSDlog(ConsoleColors color, bool console, const std::string& format, Args ... args) { - if (!GSosdLog && !console) return; + if (!console) return; size_t size = snprintf( nullptr, 0, format.c_str(), args ... ) + 1; // Extra space for '\0' std::vector buf(size); diff --git a/pcsx2/gui/Dialogs/FirstTimeWizard.cpp b/pcsx2/gui/Dialogs/FirstTimeWizard.cpp index 3f11d899e5..4c40250ce8 100644 --- a/pcsx2/gui/Dialogs/FirstTimeWizard.cpp +++ b/pcsx2/gui/Dialogs/FirstTimeWizard.cpp @@ -15,7 +15,6 @@ #include "PrecompiledHeader.h" #include "System.h" -#include "Plugins.h" #include "MSWstuff.h" #include "ModalPopups.h" @@ -122,10 +121,8 @@ FirstTimeWizard::FirstTimeWizard( wxWindow* parent ) , m_page_bios ( *new ApplicableWizardPage( this, &m_page_plugins ) ) , m_panel_Intro ( *new FirstTimeIntroPanel( &m_page_intro )) - , m_panel_PluginSel ( *new PluginSelectorPanel( &m_page_plugins ) ) , m_panel_BiosSel ( *new BiosSelectorPanel( &m_page_bios ) ) { - // Page 2 - Plugins Panel // Page 3 - Bios Panel m_page_intro. SetSizer( new wxBoxSizer( wxVERTICAL ) ); @@ -133,7 +130,6 @@ FirstTimeWizard::FirstTimeWizard( wxWindow* parent ) m_page_bios. SetSizer( new wxBoxSizer( wxVERTICAL ) ); m_page_intro += m_panel_Intro | StdExpand(); - m_page_plugins += m_panel_PluginSel | StdExpand(); m_page_bios += m_panel_BiosSel | StdExpand(); // Temporary tutorial message for the BIOS, needs proof-reading!! @@ -232,25 +228,10 @@ void FirstTimeWizard::OnPageChanging( wxWizardEvent& evt ) } } } - else - { - // Moving Backward: - // Some specific panels need per-init actions canceled. - - if( page == 1 ) - { - m_panel_PluginSel.CancelRefresh(); - } - } } void FirstTimeWizard::OnPageChanged( wxWizardEvent& evt ) { - // Plugin Selector needs a special OnShow hack, because Wizard child panels don't - // receive any Show events >_< - if( (sptr)evt.GetPage() == (sptr)&m_page_plugins ) - m_panel_PluginSel.OnShown(); - - else if( (sptr)evt.GetPage() == (sptr)&m_page_bios ) + if( (sptr)evt.GetPage() == (sptr)&m_page_bios ) m_panel_BiosSel.OnShown(); } diff --git a/pcsx2/gui/Dialogs/GSDumpDialog.cpp b/pcsx2/gui/Dialogs/GSDumpDialog.cpp index 31c0018b63..b08cf0ac17 100644 --- a/pcsx2/gui/Dialogs/GSDumpDialog.cpp +++ b/pcsx2/gui/Dialogs/GSDumpDialog.cpp @@ -27,7 +27,6 @@ #include "PathDefs.h" #include "AppConfig.h" -#include "Plugins.h" #include "GSFrame.h" #include "Counters.h" @@ -275,7 +274,7 @@ void Dialogs::GSDumpDialog::ToVSync(wxCommandEvent& event) void Dialogs::GSDumpDialog::OpenSettings(wxCommandEvent& event) { - GetCorePlugins().Configure(PluginId_GS); + GSconfigure(); } void Dialogs::GSDumpDialog::ToStart(wxCommandEvent& event) @@ -632,17 +631,17 @@ void Dialogs::GSDumpDialog::ProcessDumpEvent(const GSData& event, char* regs) std::unique_ptr data(new char[16384]); int addr = 16384 - event.length; memcpy(data.get(), event.data.get() + addr, event.length); - GSgifTransfer1((u32*)data.get(), addr); + GSgifTransfer1((u8*)data.get(), addr); break; } case Path1New: - GSgifTransfer((u32*)event.data.get(), event.length / 16); + GSgifTransfer((u8*)event.data.get(), event.length / 16); break; case Path2: - GSgifTransfer2((u32*)event.data.get(), event.length / 16); + GSgifTransfer2((u8*)event.data.get(), event.length / 16); break; case Path3: - GSgifTransfer3((u32*)event.data.get(), event.length / 16); + GSgifTransfer3((u8*)event.data.get(), event.length / 16); break; default: break; @@ -661,7 +660,7 @@ void Dialogs::GSDumpDialog::ProcessDumpEvent(const GSData& event, char* regs) case ReadFIFO2: { std::unique_ptr arr(new char[*((int*)event.data.get())]); - GSreadFIFO2((u64*)arr.get(), *((int*)event.data.get())); + GSreadFIFO2((u8*)arr.get(), *((int*)event.data.get())); break; } case Registers: @@ -730,7 +729,7 @@ void Dialogs::GSDumpDialog::GSThread::ExecuteTaskInThread() m_dump_file->Read(state_data.get(), ss); m_dump_file->Read(®s, 8192); - freezeData fd = {(int)ss, (s8*)state_data.get()}; + GSFreezeData fd = {(int)ss, (u8*)state_data.get()}; m_root_window->m_dump_packets.clear(); while (m_dump_file->Tell() < m_dump_file->Length()) @@ -760,7 +759,7 @@ void Dialogs::GSDumpDialog::GSThread::ExecuteTaskInThread() m_root_window->m_dump_packets.push_back({id, std::move(data), size, id_transfer}); } - GetCorePlugins().Init(); + GSinit(); sApp.OpenGsPanel(); // to gather the gs frame object we have to be a bit hacky since sApp is not syntax complete @@ -773,8 +772,8 @@ void Dialogs::GSDumpDialog::GSThread::ExecuteTaskInThread() g_FrameCount = 0; } - GSsetBaseMem((void*)regs); - if (GSopen2((void*)pDsp, (renderer_override<<24)) != 0) + GSsetBaseMem((u8*)regs); + if (GSopen2((void**)pDsp, (renderer_override<<24)) != 0) { OnStop(); return; @@ -782,12 +781,12 @@ void Dialogs::GSDumpDialog::GSThread::ExecuteTaskInThread() GSsetGameCRC((int)crc, 0); - if (!GetCorePlugins().DoFreeze(PluginId_GS, 0, &fd, true)) + if (!GSfreeze(0, &fd)) GSDump::isRunning = false; GSvsync(1); GSreset(); - GSsetBaseMem((void*)regs); - GetCorePlugins().DoFreeze(PluginId_GS, 0, &fd, true); + GSsetBaseMem((u8*)regs); + GSfreeze(0, &fd); size_t i = 0; m_debug_index = 0; @@ -855,8 +854,8 @@ void Dialogs::GSDumpDialog::GSThread::ExecuteTaskInThread() { if (!window->IsShown()) { - GetCorePlugins().Close(); - GetCorePlugins().Shutdown(); + GSclose(); + GSshutdown(); sApp.CloseGsPanel(); GSDump::isRunning = false; } diff --git a/pcsx2/gui/Dialogs/SysConfigDialog.cpp b/pcsx2/gui/Dialogs/SysConfigDialog.cpp index 7f919e8346..c9b3c9aa3a 100644 --- a/pcsx2/gui/Dialogs/SysConfigDialog.cpp +++ b/pcsx2/gui/Dialogs/SysConfigDialog.cpp @@ -43,23 +43,6 @@ static void CheckHacksOverrides() pxIssueConfirmation( dialog, MsgButtons().OK(), L"Dialog.SysConfig.Overrides" ); } -static void CheckPluginsOverrides() -{ - if( !wxGetApp().Overrides.HasPluginsOverride() ) return; - - // The user has commandline overrides enabled, so the options they see here and/or apply won't match - // the commandline overrides. Let them know! - - wxDialogWithHelpers dialog( NULL, _("Components Overrides Warning") ); - - dialog += dialog.Text( pxEt( L"Warning! You are running PCSX2 with command line options that override your configured plugin and/or folder settings. These command line options will not be reflected in the settings dialog, and will be disabled when you apply settings changes here." - )); - - // [TODO] : List command line option overrides in action? - - pxIssueConfirmation( dialog, MsgButtons().OK(), L"Dialog.ComponentsConfig.Overrides" ); -} - //Behavior when unchecking 'Presets' is to keep the GUI settings at the last preset (even if not yet applied). // //Alternative possible behavior when unchecking 'Presets' (currently not implemented) is to set the GUI to @@ -243,7 +226,6 @@ Dialogs::ComponentsConfigDialog::ComponentsConfigDialog(wxWindow* parent) CreateListbook( wxGetApp().GetImgList_Config() ); const AppImageIds::ConfigIds& cfgid( wxGetApp().GetImgId().Config ); - AddPage ( pxL("Plugins"), cfgid.Plugins ); AddPage ( pxL("BIOS"), cfgid.Cpu ); AddPage ( pxL("Folders"), cfgid.Paths ); @@ -251,9 +233,6 @@ Dialogs::ComponentsConfigDialog::ComponentsConfigDialog(wxWindow* parent) AddOkCancel(); SetSizerAndFit(GetSizer()); - - if( wxGetApp().Overrides.HasPluginsOverride() ) - wxGetApp().PostMethod( CheckPluginsOverrides ); } Dialogs::InterfaceLanguageDialog::InterfaceLanguageDialog(wxWindow* parent) diff --git a/pcsx2/gui/FrameForGS.cpp b/pcsx2/gui/FrameForGS.cpp index 0dc9d9b2be..7af22ef2ec 100644 --- a/pcsx2/gui/FrameForGS.cpp +++ b/pcsx2/gui/FrameForGS.cpp @@ -328,46 +328,50 @@ void GSPanel::OnMouseEvent( wxMouseEvent& evt ) #if defined(__unix__) // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // the event before the pad see it. So you send key event directly to the pad. - if( (GSopen2 != NULL) ) { - keyEvent event; - // FIXME how to handle double click ??? - if (evt.ButtonDown()) { - event.evt = 4; // X equivalent of ButtonPress - event.key = evt.GetButton(); - } else if (evt.ButtonUp()) { - event.evt = 5; // X equivalent of ButtonRelease - event.key = evt.GetButton(); - } else if (evt.Moving() || evt.Dragging()) { - event.evt = 6; // X equivalent of MotionNotify - long x,y; - evt.GetPosition(&x, &y); - - wxCoord w, h; - wxWindowDC dc( this ); - dc.GetSize(&w, &h); - - // Special case to allow continuous mouvement near the border - if (x < 10) - x = 0; - else if (x > (w-10)) - x = 0xFFFF; - - if (y < 10) - y = 0; - else if (y > (w-10)) - y = 0xFFFF; - - // For compatibility purpose with the existing structure. I decide to reduce - // the position to 16 bits. - event.key = ((y & 0xFFFF) << 16) | (x & 0xFFFF); - - } else { - event.key = 0; - event.evt = 0; - } - - PADWriteEvent(event); + keyEvent event; + // FIXME how to handle double click ??? + if (evt.ButtonDown()) + { + event.evt = 4; // X equivalent of ButtonPress + event.key = evt.GetButton(); } + else if (evt.ButtonUp()) + { + event.evt = 5; // X equivalent of ButtonRelease + event.key = evt.GetButton(); + } + else if (evt.Moving() || evt.Dragging()) + { + event.evt = 6; // X equivalent of MotionNotify + long x, y; + evt.GetPosition(&x, &y); + + wxCoord w, h; + wxWindowDC dc(this); + dc.GetSize(&w, &h); + + // Special case to allow continuous mouvement near the border + if (x < 10) + x = 0; + else if (x > (w - 10)) + x = 0xFFFF; + + if (y < 10) + y = 0; + else if (y > (w - 10)) + y = 0xFFFF; + + // For compatibility purpose with the existing structure. I decide to reduce + // the position to 16 bits. + event.key = ((y & 0xFFFF) << 16) | (x & 0xFFFF); + } + else + { + event.key = 0; + event.evt = 0; + } + + PADWriteEvent(event); #endif } @@ -391,18 +395,16 @@ void GSPanel::OnKeyDownOrUp( wxKeyEvent& evt ) #if defined(__unix__) // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // the event before the pad see it. So you send key event directly to the pad. - if( (GSopen2 != NULL) ) { - keyEvent event; - event.key = evt.GetRawKeyCode(); - if (evt.GetEventType() == wxEVT_KEY_UP) - event.evt = 3; // X equivalent of KEYRELEASE; - else if (evt.GetEventType() == wxEVT_KEY_DOWN) - event.evt = 2; // X equivalent of KEYPRESS; - else - event.evt = 0; + keyEvent event; + event.key = evt.GetRawKeyCode(); + if (evt.GetEventType() == wxEVT_KEY_UP) + event.evt = 3; // X equivalent of KEYRELEASE; + else if (evt.GetEventType() == wxEVT_KEY_DOWN) + event.evt = 2; // X equivalent of KEYPRESS; + else + event.evt = 0; - PADWriteEvent(event); - } + PADWriteEvent(event); #endif #ifdef __WXMSW__ @@ -476,10 +478,8 @@ void GSPanel::OnFocus( wxFocusEvent& evt ) #if defined(__unix__) // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // the event before the pad see it. So you send key event directly to the pad. - if((GSopen2 != NULL) ) { - keyEvent event = {0, 9}; // X equivalent of FocusIn; - PADWriteEvent(event); - } + keyEvent event = {0, 9}; // X equivalent of FocusIn; + PADWriteEvent(event); #endif //Console.Warning("GS frame > focus set"); @@ -494,10 +494,8 @@ void GSPanel::OnFocusLost( wxFocusEvent& evt ) #if defined(__unix__) // HACK2: In gsopen2 there is one event buffer read by both wx/gui and pad plugin. Wx deletes // the event before the pad see it. So you send key event directly to the pad. - if((GSopen2 != NULL) ) { - keyEvent event = {0, 10}; // X equivalent of FocusOut - PADWriteEvent(event); - } + keyEvent event = {0, 10}; // X equivalent of FocusOut + PADWriteEvent(event); #endif //Console.Warning("GS frame > focus lost"); @@ -690,7 +688,7 @@ void GSFrame::AppStatusEvent_OnSettingsApplied() if( g_Conf->GSWindow.CloseOnEsc ) { - if( IsShown() && !CorePlugins.IsOpen(PluginId_GS) ) + if (IsShown() /*&& TODO: CHECK IS GS IS CLOSED */) Show( false ); } } diff --git a/pcsx2/gui/GlobalCommands.cpp b/pcsx2/gui/GlobalCommands.cpp index a690a31fd0..9f3c760433 100644 --- a/pcsx2/gui/GlobalCommands.cpp +++ b/pcsx2/gui/GlobalCommands.cpp @@ -390,7 +390,7 @@ namespace Implementations void Sys_TakeSnapshot() { - if (GSmakeSnapshot(g_Conf->Folders.Snapshots.ToUTF8())) + if (GSmakeSnapshot(g_Conf->Folders.Snapshots.ToUTF8().data())) OSDlog(ConsoleColors::Color_Black, true, "Snapshot taken"); } @@ -400,10 +400,12 @@ namespace Implementations return; if (renderswitch_delay == 0) { - ScopedCoreThreadPause paused_core(new SysExecEvent_SaveSinglePlugin(PluginId_GS)); - renderswitch = !renderswitch; - paused_core.AllowResume(); - renderswitch_delay = -1; + /* TODO: reimplement this: + * ScopedCoreThreadPause paused_core(new SysExecEvent_SaveSinglePlugin(PluginId_GS)); + * renderswitch = !renderswitch; + * paused_core.AllowResume(); + * renderswitch_delay = -1; + */ } } @@ -474,33 +476,23 @@ namespace Implementations GetMainFramePtr()->Disable(); } - if (GSsetupRecording) + // GSsetupRecording can be aborted/canceled by the user. Don't go on to record the audio if that happens. + std::string filename; + if (GSsetupRecording(filename)) { - // GSsetupRecording can be aborted/canceled by the user. Don't go on to record the audio if that happens. - std::string filename; - if (GSsetupRecording(filename)) + if (g_Conf->AudioCapture.EnableAudio && !SPU2setupRecording(&filename)) { - if (g_Conf->AudioCapture.EnableAudio && !SPU2setupRecording(&filename)) - { - GSendRecording(); - g_Pcsx2Recording = false; - } - } - else // recording dialog canceled by the user. align our state + GSendRecording(); g_Pcsx2Recording = false; + } } - // the GS doesn't support recording - else if (!g_Conf->AudioCapture.EnableAudio || !SPU2setupRecording(nullptr)) + else // recording dialog canceled by the user. align our state g_Pcsx2Recording = false; - - if (GetMainFramePtr() && needsMainFrameEnable) - GetMainFramePtr()->Enable(); } else { // stop recording - if (GSendRecording) - GSendRecording(); + GSendRecording(); if (g_Conf->AudioCapture.EnableAudio) SPU2endRecording(); } diff --git a/pcsx2/gui/MainFrame.cpp b/pcsx2/gui/MainFrame.cpp index d598e61f79..d4ed3b86e6 100644 --- a/pcsx2/gui/MainFrame.cpp +++ b/pcsx2/gui/MainFrame.cpp @@ -272,7 +272,7 @@ void MainEmuFrame::ConnectMenus() // Config Bind(wxEVT_MENU, &MainEmuFrame::Menu_SysSettings_Click, this, MenuId_Config_SysSettings); Bind(wxEVT_MENU, &MainEmuFrame::Menu_McdSettings_Click, this, MenuId_Config_McdSettings); - Bind(wxEVT_MENU, &MainEmuFrame::Menu_SelectPluginsBios_Click, this, MenuId_Config_BIOS); + Bind(wxEVT_MENU, &MainEmuFrame::Menu_SelectBios_Click, this, MenuId_Config_BIOS); Bind(wxEVT_MENU, &MainEmuFrame::Menu_AudioSettings_Click, this, MenuId_Config_SPU2); Bind(wxEVT_MENU, &MainEmuFrame::Menu_NetworkSettings_Click, this, MenuId_Config_DEV9); Bind(wxEVT_MENU, &MainEmuFrame::Menu_USBSettings_Click, this, MenuId_Config_USB); @@ -280,8 +280,6 @@ void MainEmuFrame::ConnectMenus() Bind(wxEVT_MENU, &MainEmuFrame::Menu_GSSettings_Click, this, MenuId_Video_CoreSettings); Bind(wxEVT_MENU, &MainEmuFrame::Menu_WindowSettings_Click, this, MenuId_Video_WindowSettings); - for (int i = 0; i < PluginId_Count; ++i) - Bind(wxEVT_MENU, &MainEmuFrame::Menu_ConfigPlugin_Click, this, MenuId_PluginBase_Settings + i * PluginMenuId_Interval); Bind(wxEVT_MENU, &MainEmuFrame::Menu_MultitapToggle_Click, this, MenuId_Config_Multitap0Toggle); Bind(wxEVT_MENU, &MainEmuFrame::Menu_MultitapToggle_Click, this, MenuId_Config_Multitap1Toggle); @@ -344,25 +342,6 @@ void MainEmuFrame::InitLogBoxPosition(AppConfig::ConsoleLogOptions& conf) } } -void MainEmuFrame::DispatchEvent(const PluginEventType& plugin_evt) -{ - if (!pxAssertMsg(GetMenuBar() != NULL, "Mainframe menu bar is NULL!")) - return; - - //ApplyCoreStatus(); - - if (plugin_evt == CorePlugins_Unloaded) - { - for (int i = 0; i < PluginId_Count; ++i) - m_PluginMenuPacks[i].OnUnloaded(); - } - else if (plugin_evt == CorePlugins_Loaded) - { - for (int i = 0; i < PluginId_Count; ++i) - m_PluginMenuPacks[i].OnLoaded(); - } -} - void MainEmuFrame::DispatchEvent(const CoreThreadStatus& status) { if (!pxAssertMsg(GetMenuBar() != NULL, "Mainframe menu bar is NULL!")) @@ -375,16 +354,6 @@ void MainEmuFrame::AppStatusEvent_OnSettingsApplied() ApplySettings(); } -int GetPluginMenuId_Settings(PluginsEnum_t pid) -{ - return MenuId_PluginBase_Settings + ((int)pid * PluginMenuId_Interval); -} - -static int GetPluginMenuId_Name(PluginsEnum_t pid) -{ - return MenuId_PluginBase_Name + ((int)pid * PluginMenuId_Interval); -} - void MainEmuFrame::CreatePcsx2Menu() { // ------------------------------------------------------------------------ @@ -473,7 +442,7 @@ void MainEmuFrame::CreateConfigMenu() { m_menuConfig.Append(MenuId_Config_SysSettings, _("Emulation &Settings...")); m_menuConfig.Append(MenuId_Config_McdSettings, _("&Memory Cards...")); - m_menuConfig.Append(MenuId_Config_BIOS, _("&Plugin/BIOS Selector...")); + m_menuConfig.Append(MenuId_Config_BIOS, _("&BIOS Selector...")); m_menuConfig.Append(MenuId_Config_SPU2, _("&Audio Settings...")); m_menuConfig.Append(MenuId_Config_DEV9, _("&Network and HDD Settings...")); m_menuConfig.Append(MenuId_Config_USB, _("&USB Settings...")); @@ -606,9 +575,6 @@ MainEmuFrame::MainEmuFrame(wxWindow* parent, const wxString& title) m_RestartEmuOnDelete = false; m_capturingVideo = false; - for (int i = 0; i < PluginId_Count; ++i) - m_PluginMenuPacks[i].Populate((PluginsEnum_t)i); - // ------------------------------------------------------------------------ // Initial menubar setup. This needs to be done first so that the menu bar's visible size // can be factored into the window size (which ends up being background+status+menus) @@ -900,61 +866,3 @@ void MainEmuFrame::enableRecordingMenuItem(MenuIdentifiers menuId, bool enable) item.Enable(enable); } #endif - -// ------------------------------------------------------------------------ -// "Extensible" Plugin Menus -// ------------------------------------------------------------------------ - -void PerPluginMenuInfo::Populate(PluginsEnum_t pid) -{ - if (!pxAssert(pid < PluginId_Count)) - return; - - PluginId = pid; - - MyMenu.Append(GetPluginMenuId_Name(PluginId), _("No plugins loaded."))->Enable(false); - MyMenu.AppendSeparator(); - - if (PluginId == PluginId_GS) - { - MyMenu.Append(MenuId_Video_CoreSettings, _("&Core GS Settings..."), - _("Modify hardware emulation settings regulated by the PCSX2 core virtual machine.")); - - MyMenu.Append(MenuId_Video_WindowSettings, _("&Window Settings..."), - _("Modify window and appearance options, including aspect ratio.")); - - MyMenu.AppendSeparator(); - } - - // Populate options from the plugin here. - - MyMenu.Append(GetPluginMenuId_Settings(PluginId), _("&Plugin Settings..."), - wxsFormat(_("Opens the %s plugin's advanced settings dialog."), tbl_PluginInfo[pid].GetShortname().c_str())); -} - -// deletes menu items belonging to (created by) the plugin. Leaves menu items created -// by the PCSX2 core intact. -void PerPluginMenuInfo::OnUnloaded() -{ - // Delete any menu options added by plugins (typically a plugin will have already - // done its own proper cleanup when the plugin was shutdown or unloaded, but lets - // not trust them, shall we?) - - MenuItemAddonList& curlist(m_PluginMenuItems); - for (uint mx = 0; mx < curlist.size(); ++mx) - MyMenu.Delete(curlist[mx].Item); - - curlist.clear(); - - MyMenu.SetLabel(GetPluginMenuId_Name(PluginId), _("No plugin loaded")); - MyMenu.Enable(GetPluginMenuId_Settings(PluginId), false); -} - -void PerPluginMenuInfo::OnLoaded() -{ - if (!CorePlugins.IsLoaded(PluginId)) - return; - MyMenu.SetLabel(GetPluginMenuId_Name(PluginId), - CorePlugins.GetName(PluginId) + L" " + CorePlugins.GetVersion(PluginId)); - MyMenu.Enable(GetPluginMenuId_Settings(PluginId), true); -} diff --git a/pcsx2/gui/MainFrame.h b/pcsx2/gui/MainFrame.h index c7a3186f05..d9f0a685b3 100644 --- a/pcsx2/gui/MainFrame.h +++ b/pcsx2/gui/MainFrame.h @@ -21,53 +21,6 @@ #include #include -struct PluginMenuAddition -{ - wxString Text; - wxString HelpText; - PS2E_MenuItemStyle Flags; - - wxMenuItem* Item; - int ItemId; - - // Optional user data pointer (or typecast integer value) - void* UserPtr; - - void(PS2E_CALLBACK* OnClicked)(PS2E_THISPTR* thisptr, void* userptr); -}; - -// -------------------------------------------------------------------------------------- -// PerPluginMenuInfo -// -------------------------------------------------------------------------------------- -class PerPluginMenuInfo -{ -protected: - typedef std::vector MenuItemAddonList; - - // A list of menu items belonging to this plugin's menu. - MenuItemAddonList m_PluginMenuItems; - -public: - wxMenu& MyMenu; - PluginsEnum_t PluginId; - -public: - PerPluginMenuInfo() - : MyMenu(*new wxMenu()) - , PluginId(PluginId_Count) - { - } - - virtual ~PerPluginMenuInfo() = default; - - void Populate(PluginsEnum_t pid); - void OnUnloaded(); - void OnLoaded(); - - operator wxMenu*() { return &MyMenu; } - operator const wxMenu*() const { return &MyMenu; } -}; - // -------------------------------------------------------------------------------------- // InvokeMenuCommand_OnSysStateUnlocked // -------------------------------------------------------------------------------------- @@ -96,7 +49,6 @@ public: // MainEmuFrame // -------------------------------------------------------------------------------------- class MainEmuFrame : public wxFrame, - public EventListener_Plugins, public EventListener_CoreThread, public EventListener_AppStatus { @@ -137,11 +89,8 @@ protected: wxMenuItem& m_MenuItem_Console_Stdio; #endif - PerPluginMenuInfo m_PluginMenuPacks[PluginId_Count]; - bool m_capturingVideo; - virtual void DispatchEvent(const PluginEventType& plugin_evt); virtual void DispatchEvent(const CoreThreadStatus& status); virtual void AppStatusEvent_OnSettingsApplied(); @@ -157,7 +106,6 @@ public: void EnableMenuItem(int id, bool enable); void CheckMenuItem(int id, bool checked); void SetMenuItemLabel(int id, wxString str); - void EnableCdvdPluginSubmenu(bool isEnable = true); void CreateCdvdMenu(); void CreatePcsx2Menu(); @@ -207,7 +155,7 @@ protected: void Menu_McdSettings_Click(wxCommandEvent& event); void Menu_WindowSettings_Click(wxCommandEvent& event); void Menu_GSSettings_Click(wxCommandEvent& event); - void Menu_SelectPluginsBios_Click(wxCommandEvent& event); + void Menu_SelectBios_Click(wxCommandEvent& event); void Menu_ResetAllSettings_Click(wxCommandEvent& event); void Menu_IsoBrowse_Click(wxCommandEvent& event); @@ -237,8 +185,6 @@ protected: void Menu_SuspendResume_Click(wxCommandEvent& event); void Menu_SysShutdown_Click(wxCommandEvent& event); - void Menu_ConfigPlugin_Click(wxCommandEvent& event); - void Menu_MultitapToggle_Click(wxCommandEvent& event); void Menu_Debug_Open_Click(wxCommandEvent& event); @@ -290,5 +236,3 @@ protected: friend class Pcsx2App; }; - -extern int GetPluginMenuId_Settings(PluginsEnum_t pid); diff --git a/pcsx2/gui/MainMenuClicks.cpp b/pcsx2/gui/MainMenuClicks.cpp index 286c788b60..4e9c3d0163 100644 --- a/pcsx2/gui/MainMenuClicks.cpp +++ b/pcsx2/gui/MainMenuClicks.cpp @@ -102,7 +102,7 @@ void MainEmuFrame::Menu_GSSettings_Click(wxCommandEvent& event) AppOpenDialog(this)->GetEventHandler()->ProcessEvent(evt); } -void MainEmuFrame::Menu_SelectPluginsBios_Click(wxCommandEvent& event) +void MainEmuFrame::Menu_SelectBios_Click(wxCommandEvent& event) { AppOpenDialog(this); } @@ -844,30 +844,6 @@ void MainEmuFrame::Menu_SysShutdown_Click(wxCommandEvent& event) } } -void MainEmuFrame::Menu_ConfigPlugin_Click(wxCommandEvent& event) -{ - if (GSDump::isRunning) - { - wxMessageBox("Please open the settings window from the main GS Debugger window", _("GS Debugger"), wxICON_ERROR); - return; - } - const int eventId = event.GetId() - MenuId_PluginBase_Settings; - - PluginsEnum_t pid = (PluginsEnum_t)(eventId / PluginMenuId_Interval); - - // Don't try to call the Patches config dialog until we write one. - if (event.GetId() == MenuId_Config_Patches) - return; - - if (!pxAssertDev((eventId >= 0) || (pid < PluginId_Count), "Invalid plugin identifier passed to ConfigPlugin event handler.")) - return; - - wxWindowDisabler disabler; - ScopedCoreThreadPause paused_core(new SysExecEvent_SaveSinglePlugin(pid)); - - GetCorePlugins().Configure(pid); -} - void MainEmuFrame::Menu_Debug_Open_Click(wxCommandEvent& event) { DisassemblyDialog* dlg = wxGetApp().GetDisassemblyPtr(); @@ -969,45 +945,32 @@ void MainEmuFrame::VideoCaptureToggle() Disable(); } - if (GSsetupRecording) + // GSsetupRecording can be aborted/canceled by the user. Don't go on to record the audio if that happens + std::string filename; + if (GSsetupRecording(filename)) { - // GSsetupRecording can be aborted/canceled by the user. Don't go on to record the audio if that happens - std::string filename; - if (GSsetupRecording(filename)) + if (!g_Conf->AudioCapture.EnableAudio || SPU2setupRecording(&filename)) { - if (!g_Conf->AudioCapture.EnableAudio || SPU2setupRecording(&filename)) - { - m_submenuVideoCapture.Enable(MenuId_Capture_Video_Record, false); - m_submenuVideoCapture.Enable(MenuId_Capture_Video_Stop, true); - m_submenuVideoCapture.Enable(MenuId_Capture_Video_IncludeAudio, false); - } - else - { - GSendRecording(); - m_capturingVideo = false; - } + m_submenuVideoCapture.Enable(MenuId_Capture_Video_Record, false); + m_submenuVideoCapture.Enable(MenuId_Capture_Video_Stop, true); + m_submenuVideoCapture.Enable(MenuId_Capture_Video_IncludeAudio, false); } - else // recording dialog canceled by the user. align our state + else + { + GSendRecording(); m_capturingVideo = false; + } } - // the GS doesn't support recording - else if (g_Conf->AudioCapture.EnableAudio && SPU2setupRecording(nullptr)) - { - m_submenuVideoCapture.Enable(MenuId_Capture_Video_Record, false); - m_submenuVideoCapture.Enable(MenuId_Capture_Video_Stop, true); - m_submenuVideoCapture.Enable(MenuId_Capture_Video_IncludeAudio, false); - } - else + else // recording dialog canceled by the user. align our state m_capturingVideo = false; - + if (needsMainFrameEnable) Enable(); } else { // stop recording - if (GSendRecording) - GSendRecording(); + GSendRecording(); if (g_Conf->AudioCapture.EnableAudio) SPU2endRecording(); m_submenuVideoCapture.Enable(MenuId_Capture_Video_Record, true); @@ -1022,7 +985,7 @@ void MainEmuFrame::Menu_Capture_Screenshot_Screenshot_Click(wxCommandEvent& even { return; } - GSmakeSnapshot(g_Conf->Folders.Snapshots.ToAscii()); + GSmakeSnapshot(g_Conf->Folders.Snapshots.ToString().char_str()); } void MainEmuFrame::Menu_Capture_Screenshot_Screenshot_As_Click(wxCommandEvent& event) @@ -1038,7 +1001,7 @@ void MainEmuFrame::Menu_Capture_Screenshot_Screenshot_As_Click(wxCommandEvent& e wxFileDialog fileDialog(this, _("Select a file"), g_Conf->Folders.Snapshots.ToAscii(), wxEmptyString, "PNG files (*.png)|*.png", wxFD_SAVE | wxFD_OVERWRITE_PROMPT); if (fileDialog.ShowModal() == wxID_OK) - GSmakeSnapshot(fileDialog.GetPath().c_str()); + GSmakeSnapshot((char*)fileDialog.GetPath().char_str()); // Resume emulation if (!wasPaused) diff --git a/pcsx2/gui/MemoryCardFile.cpp b/pcsx2/gui/MemoryCardFile.cpp index de198b82be..05d6a7fe0e 100644 --- a/pcsx2/gui/MemoryCardFile.cpp +++ b/pcsx2/gui/MemoryCardFile.cpp @@ -599,7 +599,7 @@ uint FileMcd_ConvertToSlot(uint port, uint slot) return slot + 4; // multitap 2 } -static void FileMcd_EmuOpen() +void FileMcd_EmuOpen() { // detect inserted memory card types for (uint slot = 0; slot < 8; ++slot) @@ -627,13 +627,13 @@ static void FileMcd_EmuOpen() Component_FileMcd->implFolder.Open(); } -static void FileMcd_EmuClose() +void FileMcd_EmuClose() { Component_FileMcd->implFolder.Close(); Component_FileMcd->impl.Close(); } -static s32 FileMcd_IsPresent(uint port, uint slot) +s32 FileMcd_IsPresent(uint port, uint slot) { const uint combinedSlot = FileMcd_ConvertToSlot(port, slot); switch (g_Conf->Mcd[combinedSlot].Type) @@ -647,7 +647,7 @@ static s32 FileMcd_IsPresent(uint port, uint slot) } } -static void FileMcd_GetSizeInfo(uint port, uint slot, McdSizeInfo* outways) +void FileMcd_GetSizeInfo(uint port, uint slot, McdSizeInfo* outways) { const uint combinedSlot = FileMcd_ConvertToSlot(port, slot); switch (g_Conf->Mcd[combinedSlot].Type) @@ -663,7 +663,7 @@ static void FileMcd_GetSizeInfo(uint port, uint slot, McdSizeInfo* outways) } } -static bool FileMcd_IsPSX(uint port, uint slot) +bool FileMcd_IsPSX(uint port, uint slot) { const uint combinedSlot = FileMcd_ConvertToSlot(port, slot); switch (g_Conf->Mcd[combinedSlot].Type) @@ -677,7 +677,7 @@ static bool FileMcd_IsPSX(uint port, uint slot) } } -static s32 FileMcd_Read(uint port, uint slot, u8* dest, u32 adr, int size) +s32 FileMcd_Read(uint port, uint slot, u8* dest, u32 adr, int size) { const uint combinedSlot = FileMcd_ConvertToSlot(port, slot); switch (g_Conf->Mcd[combinedSlot].Type) @@ -691,7 +691,7 @@ static s32 FileMcd_Read(uint port, uint slot, u8* dest, u32 adr, int size) } } -static s32 FileMcd_Save(uint port, uint slot, const u8* src, u32 adr, int size) +s32 FileMcd_Save(uint port, uint slot, const u8* src, u32 adr, int size) { const uint combinedSlot = FileMcd_ConvertToSlot(port, slot); switch (g_Conf->Mcd[combinedSlot].Type) @@ -705,7 +705,7 @@ static s32 FileMcd_Save(uint port, uint slot, const u8* src, u32 adr, int size) } } -static s32 FileMcd_EraseBlock(uint port, uint slot, u32 adr) +s32 FileMcd_EraseBlock(uint port, uint slot, u32 adr) { const uint combinedSlot = FileMcd_ConvertToSlot(port, slot); switch (g_Conf->Mcd[combinedSlot].Type) @@ -719,7 +719,7 @@ static s32 FileMcd_EraseBlock(uint port, uint slot, u32 adr) } } -static u64 FileMcd_GetCRC(uint port, uint slot) +u64 FileMcd_GetCRC(uint port, uint slot) { const uint combinedSlot = FileMcd_ConvertToSlot(port, slot); switch (g_Conf->Mcd[combinedSlot].Type) @@ -733,7 +733,7 @@ static u64 FileMcd_GetCRC(uint port, uint slot) } } -static void FileMcd_NextFrame(uint port, uint slot) +void FileMcd_NextFrame(uint port, uint slot) { const uint combinedSlot = FileMcd_ConvertToSlot(port, slot); switch (g_Conf->Mcd[combinedSlot].Type) @@ -749,7 +749,7 @@ static void FileMcd_NextFrame(uint port, uint slot) } } -static bool FileMcd_ReIndex(uint port, uint slot, const wxString& filter) +bool FileMcd_ReIndex(uint port, uint slot, const wxString& filter) { const uint combinedSlot = FileMcd_ConvertToSlot(port, slot); switch (g_Conf->Mcd[combinedSlot].Type) diff --git a/pcsx2/gui/MemoryCardFolder.h b/pcsx2/gui/MemoryCardFolder.h index 73867305ee..9b33660572 100644 --- a/pcsx2/gui/MemoryCardFolder.h +++ b/pcsx2/gui/MemoryCardFolder.h @@ -21,7 +21,6 @@ #include #include -#include "PluginCallbacks.h" #include "AppConfig.h" //#define DEBUG_WRITE_FOLDER_CARD_IN_MEMORY_TO_FILE_ON_CHANGE @@ -390,7 +389,7 @@ public: bool ReIndex(bool enableFiltering, const wxString& filter); s32 IsPresent() const; - void GetSizeInfo(PS2E_McdSizeInfo& outways) const; + void GetSizeInfo(McdSizeInfo& outways) const; bool IsPSX() const; s32 Read(u8* dest, u32 adr, int size); s32 Save(const u8* src, u32 adr, int size); @@ -619,7 +618,7 @@ public: void SetFiltering(const bool enableFiltering); s32 IsPresent(uint slot); - void GetSizeInfo(uint slot, PS2E_McdSizeInfo& outways); + void GetSizeInfo(uint slot, McdSizeInfo& outways); bool IsPSX(uint slot); s32 Read(uint slot, u8* dest, u32 adr, int size); s32 Save(uint slot, const u8* src, u32 adr, int size); diff --git a/pcsx2/gui/Resources/ConfigIcon_Plugins.png b/pcsx2/gui/Resources/ConfigIcon_Plugins.png deleted file mode 100644 index 7c3af3b16b2bfb398a08db3b666c4c5c3a5a4e56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13991 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 N002ovPDHLkV1ib1L)8EP