From 1e9326bf85e011da2b631848bebd0908cbc4cb7f Mon Sep 17 00:00:00 2001 From: Arisotura Date: Mon, 27 May 2024 00:56:22 +0200 Subject: [PATCH] move emuDirectory to main.cpp, and make it a QString. remove more Platform shit. --- src/Platform.h | 8 -- src/frontend/qt_sdl/AudioSettingsDialog.cpp | 4 +- src/frontend/qt_sdl/CameraSettingsDialog.cpp | 4 +- src/frontend/qt_sdl/CheatsDialog.cpp | 2 - src/frontend/qt_sdl/PathSettingsDialog.cpp | 7 +- src/frontend/qt_sdl/Platform.cpp | 122 +------------------ src/frontend/qt_sdl/TitleManagerDialog.cpp | 12 +- src/frontend/qt_sdl/main.cpp | 41 ++++++- src/frontend/qt_sdl/main.h | 1 + 9 files changed, 50 insertions(+), 151 deletions(-) diff --git a/src/Platform.h b/src/Platform.h index ce98ef29..548d0dad 100644 --- a/src/Platform.h +++ b/src/Platform.h @@ -31,14 +31,6 @@ class Firmware; namespace Platform { -void Init(int argc, char** argv); - -/** - * Frees all resources that were allocated in \c Init - * or by any other \c Platform function. - */ -void DeInit(); - enum StopReason { /** * The emulator stopped for some unspecified reason. diff --git a/src/frontend/qt_sdl/AudioSettingsDialog.cpp b/src/frontend/qt_sdl/AudioSettingsDialog.cpp index 4a101c38..a3230f4d 100644 --- a/src/frontend/qt_sdl/AudioSettingsDialog.cpp +++ b/src/frontend/qt_sdl/AudioSettingsDialog.cpp @@ -32,8 +32,6 @@ using namespace melonDS; AudioSettingsDialog* AudioSettingsDialog::currentDlg = nullptr; -extern std::string EmuDirectory; - AudioSettingsDialog::AudioSettingsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::AudioSettingsDialog) { @@ -262,7 +260,7 @@ void AudioSettingsDialog::on_btnMicWavBrowse_clicked() { QString file = QFileDialog::getOpenFileName(this, "Select WAV file...", - QString::fromStdString(EmuDirectory), + emuDirectory, "WAV files (*.wav);;Any file (*.*)"); if (file.isEmpty()) return; diff --git a/src/frontend/qt_sdl/CameraSettingsDialog.cpp b/src/frontend/qt_sdl/CameraSettingsDialog.cpp index e9955453..cefb7e93 100644 --- a/src/frontend/qt_sdl/CameraSettingsDialog.cpp +++ b/src/frontend/qt_sdl/CameraSettingsDialog.cpp @@ -31,8 +31,6 @@ using namespace melonDS; CameraSettingsDialog* CameraSettingsDialog::currentDlg = nullptr; -extern std::string EmuDirectory; - extern CameraManager* camManager[2]; @@ -253,7 +251,7 @@ void CameraSettingsDialog::on_btnSrcImageBrowse_clicked() { QString file = QFileDialog::getOpenFileName(this, "Select image file...", - QString::fromStdString(EmuDirectory), + emuDirectory, "Image files (*.png *.jpg *.jpeg *.bmp);;Any file (*.*)"); if (file.isEmpty()) return; diff --git a/src/frontend/qt_sdl/CheatsDialog.cpp b/src/frontend/qt_sdl/CheatsDialog.cpp index 7873db0a..462eb051 100644 --- a/src/frontend/qt_sdl/CheatsDialog.cpp +++ b/src/frontend/qt_sdl/CheatsDialog.cpp @@ -35,8 +35,6 @@ using Platform::LogLevel; CheatsDialog* CheatsDialog::currentDlg = nullptr; -extern std::string EmuDirectory; - CheatsDialog::CheatsDialog(QWidget* parent) : QDialog(parent), ui(new Ui::CheatsDialog) { diff --git a/src/frontend/qt_sdl/PathSettingsDialog.cpp b/src/frontend/qt_sdl/PathSettingsDialog.cpp index f1561082..c9c4d0df 100644 --- a/src/frontend/qt_sdl/PathSettingsDialog.cpp +++ b/src/frontend/qt_sdl/PathSettingsDialog.cpp @@ -34,7 +34,6 @@ namespace Platform = melonDS::Platform; PathSettingsDialog* PathSettingsDialog::currentDlg = nullptr; -extern std::string EmuDirectory; extern bool RunningSomething; bool PathSettingsDialog::needsReset = false; @@ -124,7 +123,7 @@ void PathSettingsDialog::on_btnSaveFileBrowse_clicked() { QString dir = QFileDialog::getExistingDirectory(this, "Select save files path...", - QString::fromStdString(EmuDirectory)); + emuDirectory); if (dir.isEmpty()) return; @@ -141,7 +140,7 @@ void PathSettingsDialog::on_btnSavestateBrowse_clicked() { QString dir = QFileDialog::getExistingDirectory(this, "Select savestates path...", - QString::fromStdString(EmuDirectory)); + emuDirectory); if (dir.isEmpty()) return; @@ -158,7 +157,7 @@ void PathSettingsDialog::on_btnCheatFileBrowse_clicked() { QString dir = QFileDialog::getExistingDirectory(this, "Select cheat files path...", - QString::fromStdString(EmuDirectory)); + emuDirectory); if (dir.isEmpty()) return; diff --git a/src/frontend/qt_sdl/Platform.cpp b/src/frontend/qt_sdl/Platform.cpp index aa09dd7e..a32086b6 100644 --- a/src/frontend/qt_sdl/Platform.cpp +++ b/src/frontend/qt_sdl/Platform.cpp @@ -48,8 +48,6 @@ #define ftell _ftelli64 #endif // __WIN32__ -std::string EmuDirectory; - extern CameraManager* camManager[2]; // REMOVE ME @@ -65,124 +63,6 @@ void emuStop(); namespace melonDS::Platform { -void PathInit(int argc, char** argv) -{ - // First, check for the portable directory next to the executable. - QString appdirpath = QCoreApplication::applicationDirPath(); - QString portablepath = appdirpath + QDir::separator() + "portable"; - -#if defined(__APPLE__) - // On Apple platforms we may need to navigate outside an app bundle. - // The executable directory would be "melonDS.app/Contents/MacOS", so we need to go a total of three steps up. - QDir bundledir(appdirpath); - if (bundledir.cd("..") && bundledir.cd("..") && bundledir.dirName().endsWith(".app") && bundledir.cd("..")) - { - portablepath = bundledir.absolutePath() + QDir::separator() + "portable"; - } -#endif - - QDir portabledir(portablepath); - if (portabledir.exists()) - { - EmuDirectory = portabledir.absolutePath().toStdString(); - } - else - { - // If no overrides are specified, use the default path. -#if defined(__WIN32__) && defined(WIN32_PORTABLE) - EmuDirectory = appdirpath.toStdString(); -#else - QString confdir; - QDir config(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)); - config.mkdir("melonDS"); - confdir = config.absolutePath() + QDir::separator() + "melonDS"; - EmuDirectory = confdir.toStdString(); -#endif - } -} - -QSharedMemory* IPCBuffer = nullptr; -int IPCInstanceID; - -void IPCInit() -{ - IPCInstanceID = 0; - - IPCBuffer = new QSharedMemory("melonIPC"); - -#if !defined(Q_OS_WINDOWS) - // QSharedMemory instances can be left over from crashed processes on UNIX platforms. - // To prevent melonDS thinking there's another instance, we attach and then immediately detach from the - // shared memory. If no other process was actually using it, it'll be destroyed and we'll have a clean - // shared memory buffer after creating it again below. - if (IPCBuffer->attach()) - { - IPCBuffer->detach(); - delete IPCBuffer; - IPCBuffer = new QSharedMemory("melonIPC"); - } -#endif - - if (!IPCBuffer->attach()) - { - Log(LogLevel::Info, "IPC sharedmem doesn't exist. creating\n"); - if (!IPCBuffer->create(1024)) - { - Log(LogLevel::Error, "IPC sharedmem create failed: %s\n", IPCBuffer->errorString().toStdString().c_str()); - delete IPCBuffer; - IPCBuffer = nullptr; - return; - } - - IPCBuffer->lock(); - memset(IPCBuffer->data(), 0, IPCBuffer->size()); - IPCBuffer->unlock(); - } - - IPCBuffer->lock(); - u8* data = (u8*)IPCBuffer->data(); - u16 mask = *(u16*)&data[0]; - for (int i = 0; i < 16; i++) - { - if (!(mask & (1<unlock(); - - Log(LogLevel::Info, "IPC: instance ID %d\n", IPCInstanceID); -} - -void IPCDeInit() -{ - if (IPCBuffer) - { - IPCBuffer->lock(); - u8* data = (u8*)IPCBuffer->data(); - *(u16*)&data[0] &= ~(1<unlock(); - - IPCBuffer->detach(); - delete IPCBuffer; - } - IPCBuffer = nullptr; -} - - -void Init(int argc, char** argv) -{ - PathInit(argc, argv); - IPCInit(); -} - -void DeInit() -{ - IPCDeInit(); -} - void SignalStop(StopReason reason) { emuStop(); @@ -309,7 +189,7 @@ std::string GetLocalFilePath(const std::string& filename) } else { - fullpath = QString::fromStdString(EmuDirectory) + QDir::separator() + qpath; + fullpath = emuDirectory + QDir::separator() + qpath; } return fullpath.toStdString(); diff --git a/src/frontend/qt_sdl/TitleManagerDialog.cpp b/src/frontend/qt_sdl/TitleManagerDialog.cpp index d303ca3a..70c4ecd3 100644 --- a/src/frontend/qt_sdl/TitleManagerDialog.cpp +++ b/src/frontend/qt_sdl/TitleManagerDialog.cpp @@ -23,7 +23,7 @@ #include "types.h" #include "Platform.h" #include "Config.h" -#include "EmuInstance.h" +#include "main.h" #include "DSi_NAND.h" #include "TitleManagerDialog.h" @@ -36,8 +36,6 @@ using namespace melonDS::Platform; std::unique_ptr TitleManagerDialog::nand = nullptr; TitleManagerDialog* TitleManagerDialog::currentDlg = nullptr; -extern std::string EmuDirectory; - TitleManagerDialog::TitleManagerDialog(QWidget* parent, DSi_NAND::NANDImage& image) : QDialog(parent), ui(new Ui::TitleManagerDialog), nandmount(image) { @@ -300,7 +298,7 @@ void TitleManagerDialog::onImportTitleData() QString file = QFileDialog::getOpenFileName(this, "Select file to import...", - QString::fromStdString(EmuDirectory), + emuDirectory, "Title data files (" + extensions + ");;Any file (*.*)"); if (file.isEmpty()) return; @@ -374,7 +372,7 @@ void TitleManagerDialog::onExportTitleData() QString file = QFileDialog::getSaveFileName(this, "Select path to export to...", - QString::fromStdString(EmuDirectory) + exportname, + emuDirectory + exportname, "Title data files (" + extensions + ");;Any file (*.*)"); if (file.isEmpty()) return; @@ -547,7 +545,7 @@ void TitleImportDialog::on_btnAppBrowse_clicked() { QString file = QFileDialog::getOpenFileName(this, "Select title executable...", - QString::fromStdString(EmuDirectory), + emuDirectory, "DSiWare executables (*.app *.nds *.dsi *.srl);;Any file (*.*)"); if (file.isEmpty()) return; @@ -559,7 +557,7 @@ void TitleImportDialog::on_btnTmdBrowse_clicked() { QString file = QFileDialog::getOpenFileName(this, "Select title metadata...", - QString::fromStdString(EmuDirectory), + emuDirectory, "DSiWare metadata (*.tmd);;Any file (*.*)"); if (file.isEmpty()) return; diff --git a/src/frontend/qt_sdl/main.cpp b/src/frontend/qt_sdl/main.cpp index 10cebe5b..e23fe0ec 100644 --- a/src/frontend/qt_sdl/main.cpp +++ b/src/frontend/qt_sdl/main.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #ifndef _WIN32 #include #include @@ -128,6 +129,7 @@ QStringList ArchiveExtensions #endif }; +QString emuDirectory; bool RunningSomething; @@ -215,6 +217,41 @@ static bool FileIsSupportedFiletype(const QString& filename, bool insideArchive +void pathInit() +{ + // First, check for the portable directory next to the executable. + QString appdirpath = QCoreApplication::applicationDirPath(); + QString portablepath = appdirpath + QDir::separator() + "portable"; + +#if defined(__APPLE__) + // On Apple platforms we may need to navigate outside an app bundle. + // The executable directory would be "melonDS.app/Contents/MacOS", so we need to go a total of three steps up. + QDir bundledir(appdirpath); + if (bundledir.cd("..") && bundledir.cd("..") && bundledir.dirName().endsWith(".app") && bundledir.cd("..")) + { + portablepath = bundledir.absolutePath() + QDir::separator() + "portable"; + } +#endif + + QDir portabledir(portablepath); + if (portabledir.exists()) + { + emuDirectory = portabledir.absolutePath(); + } + else + { + // If no overrides are specified, use the default path. +#if defined(__WIN32__) && defined(WIN32_PORTABLE) + emuDirectory = appdirpath; +#else + QString confdir; + QDir config(QStandardPaths::writableLocation(QStandardPaths::ConfigLocation)); + config.mkdir("melonDS"); + confdir = config.absolutePath() + QDir::separator() + "melonDS"; + emuDirectory = confdir; +#endif + } +} void emuStop() @@ -269,8 +306,7 @@ int main(int argc, char** argv) printf("did you just call me a derp???\n"); MelonApplication melon(argc, argv); - - Platform::Init(argc, argv); + pathInit(); CLI::CommandLineOptions* options = CLI::ManageArgs(melon); @@ -378,7 +414,6 @@ int main(int argc, char** argv) Config::Save(); SDL_Quit(); - Platform::DeInit(); return ret; } diff --git a/src/frontend/qt_sdl/main.h b/src/frontend/qt_sdl/main.h index c91dc64b..00f190ea 100644 --- a/src/frontend/qt_sdl/main.h +++ b/src/frontend/qt_sdl/main.h @@ -46,5 +46,6 @@ public: }; extern QString* systemThemeName; +extern QString emuDirectory; #endif // MAIN_H