From a780d9a241093ff15b004c48623c93cb34c33ee5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Hrdli=C4=8Dka?= Date: Fri, 8 Apr 2022 00:58:38 +0200 Subject: [PATCH] Rewrite plat_init_rom_paths in Qt frontend --- src/86box.c | 5 +-- src/mac/CMakeLists.txt | 9 +++-- src/qt/qt_platform.cpp | 64 +++++++--------------------------- src/unix/CMakeLists.txt | 4 +++ src/{mac => unix}/macOSXGlue.h | 0 src/{mac => unix}/macOSXGlue.m | 0 src/unix/unix.c | 13 +++---- 7 files changed, 28 insertions(+), 67 deletions(-) rename src/{mac => unix}/macOSXGlue.h (100%) rename src/{mac => unix}/macOSXGlue.m (100%) diff --git a/src/86box.c b/src/86box.c index 4eae7ab02..5ba477fb4 100644 --- a/src/86box.c +++ b/src/86box.c @@ -37,7 +37,6 @@ #ifdef __APPLE__ #include #include -#include "mac/macOSXGlue.h" #ifdef __aarch64__ #include #endif @@ -650,9 +649,7 @@ usage: { char default_rom_path[1024] = { 0 }; -#if defined(__APPLE__) - getDefaultROMPath(default_rom_path); -#elif !defined(_WIN32) +#if !defined(_WIN32) && !defined(__APPLE__) appimage = getenv("APPIMAGE"); if (appimage && (appimage[0] != '\0')) { plat_get_dirname(default_rom_path, appimage); diff --git a/src/mac/CMakeLists.txt b/src/mac/CMakeLists.txt index ae3837f0e..2b71dd266 100644 --- a/src/mac/CMakeLists.txt +++ b/src/mac/CMakeLists.txt @@ -19,17 +19,16 @@ # Pick the bundle icon depending on the release channel if(RELEASE_BUILD) - set(APP_ICON_MACOSX icons/release/86Box.icns) + target_sources(86Box PRIVATE icons/release/86Box.icns) elseif(BETA_BUILD) - set(APP_ICON_MACOSX icons/beta/86Box.icns) + target_sources(86Box PRIVATE icons/beta/86Box.icns) elseif(ALPHA_BUILD) - set(APP_ICON_MACOSX icons/dev/86Box.icns) + target_sources(86Box PRIVATE icons/dev/86Box.icns) else() - set(APP_ICON_MACOSX icons/branch/86Box.icns) + target_sources(86Box PRIVATE icons/branch/86Box.icns) endif() target_link_libraries(86Box "-framework AppKit") -target_sources(86Box PRIVATE macOSXGlue.m ${APP_ICON_MACOSX}) # Make sure the icon is copied to the bundle set_source_files_properties(${APP_ICON_MACOSX} diff --git a/src/qt/qt_platform.cpp b/src/qt/qt_platform.cpp index e6e3256d3..1d709e3ac 100644 --- a/src/qt/qt_platform.cpp +++ b/src/qt/qt_platform.cpp @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -589,59 +590,18 @@ plat_chdir(char *path) void plat_init_rom_paths() { -#if defined __APPLE__ - QDir::root().mkpath(QStringLiteral("%1/Documents/86Box/roms/").arg(QDir::homePath())); - add_rom_path(QStringLiteral("%1/Documents/86Box/roms/").arg(QDir::homePath()).toUtf8().constData()); -#elif !defined _WIN32 - if (getenv("XDG_DATA_HOME")) { - char xdg_rom_path[1024 + 1] = { 0 }; - strncpy(xdg_rom_path, getenv("XDG_DATA_HOME"), 1024); - plat_path_slash(xdg_rom_path); - strncat(xdg_rom_path, "86Box/", 1024); + auto paths = QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation); - if (!plat_dir_check(xdg_rom_path)) - plat_dir_create(xdg_rom_path); - strcat(xdg_rom_path, "roms/"); +#ifdef _WIN32 + // HACK: The standard locations returned for GenericDataLocation include + // the EXE path and a `data` directory within it as the last two entries. - if (!plat_dir_check(xdg_rom_path)) - plat_dir_create(xdg_rom_path); - add_rom_path(xdg_rom_path); - } else { - char home_rom_path[1024] = { 0 }; - snprintf(home_rom_path, 1024, "%s/.local/share/86Box/", getenv("HOME") ? getenv("HOME") : QDir::homePath().toUtf8().constData()); - - if (!plat_dir_check(home_rom_path)) - plat_dir_create(home_rom_path); - strcat(home_rom_path, "roms/"); - - if (!plat_dir_check(home_rom_path)) - plat_dir_create(home_rom_path); - add_rom_path(home_rom_path); - } - if (getenv("XDG_DATA_DIRS")) { - char* xdg_rom_paths = strdup(getenv("XDG_DATA_DIRS")); - char* xdg_rom_paths_orig = xdg_rom_paths; - char* cur_xdg_rom_path = NULL; - if (xdg_rom_paths) { - while (xdg_rom_paths[strlen(xdg_rom_paths) - 1] == ':') { - xdg_rom_paths[strlen(xdg_rom_paths) - 1] = '\0'; - } - QStringList path_list = QString(xdg_rom_paths).split(":"); - for (auto& cur_path : path_list) { - if (cur_path.right(1) != '/') - cur_path.push_back('/'); - add_rom_path((cur_path + "86Box/roms").toUtf8().constData()); - } - } - free(xdg_rom_paths_orig); - } else { - add_rom_path("/usr/local/share/86Box/roms/"); - add_rom_path("/usr/share/86Box/roms/"); - } -#elif _WIN32 - auto appDataDir = QDir(qEnvironmentVariable("LOCALAPPDATA")); - appDataDir.mkdir("86Box"); - appDataDir.mkdir("86Box/roms"); - add_rom_path((appDataDir.path().replace("\\","/") + "/86Box/roms").toUtf8().constData()); + // Remove the entries as we don't need them. + paths.removeLast(); + paths.removeLast(); #endif + + for (auto& path : paths) { + add_rom_path(QDir(path).filePath("86Box/roms").toUtf8().constData()); + } } diff --git a/src/unix/CMakeLists.txt b/src/unix/CMakeLists.txt index 1712288d2..6d1c01a34 100644 --- a/src/unix/CMakeLists.txt +++ b/src/unix/CMakeLists.txt @@ -28,3 +28,7 @@ target_link_libraries(86Box Threads::Threads) add_library(ui OBJECT unix_sdl.c unix_cdrom.c) target_compile_definitions(ui PUBLIC _FILE_OFFSET_BITS=64) target_link_libraries(ui ${CMAKE_DL_LIBS}) + +if(APPLE) + target_sources(plat PRIVATE macOSXGlue.m) +endif() diff --git a/src/mac/macOSXGlue.h b/src/unix/macOSXGlue.h similarity index 100% rename from src/mac/macOSXGlue.h rename to src/unix/macOSXGlue.h diff --git a/src/mac/macOSXGlue.m b/src/unix/macOSXGlue.m similarity index 100% rename from src/mac/macOSXGlue.m rename to src/unix/macOSXGlue.m diff --git a/src/unix/unix.c b/src/unix/unix.c index 5f6429b89..8854be1a8 100644 --- a/src/unix/unix.c +++ b/src/unix/unix.c @@ -36,6 +36,10 @@ #include <86box/ui.h> #include <86box/gdbstub.h> +#ifdef __APPLE__ +#include "macOSXGlue.h" +#endif + static int first_use = 1; static uint64_t StartingTime; static uint64_t Frequency; @@ -797,12 +801,9 @@ plat_init_rom_paths() add_rom_path("/usr/share/86Box/roms/"); } #else - char home_rom_path[1024] = { '\0' }; - snprintf(home_rom_path, 1024, "%s/Documents/86Box/", getenv("HOME") ? getenv("HOME") : getpwuid(getuid())->pw_dir); - plat_dir_create(home_rom_path); - strcat(home_rom_path, "roms/"); - plat_dir_create(home_rom_path); - add_rom_path(home_rom_path); + char default_rom_path[1024] = { '\0 '}; + getDefaultROMPath(default_rom_path); + add_rom_path(default_rom_path); #endif }