From ca4d62abbdd52f6699529bdc96ac28239f120dd1 Mon Sep 17 00:00:00 2001 From: JakobDev Date: Tue, 17 Oct 2023 10:50:28 +0200 Subject: [PATCH] Better Linux Desktop Integration (#291) * Better Linux Desktop Integration * Don't install from subprojects --- external/CMakeLists.txt | 2 + src/platform/qt/CMakeLists.txt | 12 +- .../io.github.nba_emuNanoBoyAdvance.desktop | 12 ++ ....github.nba_emuNanoBoyAdvance.metainfo.xml | 118 ++++++++++++++++++ .../qt/rc/io.github.nba_emuNanoBoyAdvance.png | Bin 0 -> 11882 bytes src/platform/qt/src/config.hpp | 22 +++- src/platform/qt/src/main.cpp | 1 + 7 files changed, 164 insertions(+), 3 deletions(-) create mode 100644 src/platform/qt/rc/io.github.nba_emuNanoBoyAdvance.desktop create mode 100644 src/platform/qt/rc/io.github.nba_emuNanoBoyAdvance.metainfo.xml create mode 100644 src/platform/qt/rc/io.github.nba_emuNanoBoyAdvance.png diff --git a/external/CMakeLists.txt b/external/CMakeLists.txt index a43489dc6..f87e91209 100644 --- a/external/CMakeLists.txt +++ b/external/CMakeLists.txt @@ -1,5 +1,7 @@ set(toml11_BUILD_TEST OFF CACHE BOOL "Build toml tests" FORCE) +set(CMAKE_SKIP_INSTALL_RULES YES) + add_subdirectory(fmtlib) add_subdirectory(toml11) diff --git a/src/platform/qt/CMakeLists.txt b/src/platform/qt/CMakeLists.txt index 24f2b4e6d..2abe9f7d2 100644 --- a/src/platform/qt/CMakeLists.txt +++ b/src/platform/qt/CMakeLists.txt @@ -37,6 +37,7 @@ set(RESOURCES set(CMAKE_AUTOMOC ON) option(USE_QT6 "Use Qt 6" OFF) +option(PORTABLE_MODE "Portable Mode" ON) if (USE_QT6) find_package(Qt6 COMPONENTS Core Gui Widgets OpenGL OpenGLWidgets REQUIRED) @@ -46,6 +47,10 @@ else() set(QT_DEPS Qt5::Core Qt5::Gui Qt5::Widgets Qt5::OpenGL) endif() +if (PORTABLE_MODE) + add_compile_definitions(PORTABLE_MODE) +endif() + # Append application resources (icon and manifest) on Win32. if(WIN32) list(APPEND RESOURCES ${CMAKE_CURRENT_BINARY_DIR}/app.rc) @@ -54,7 +59,7 @@ if(WIN32) set(CMAKE_RC_COMPILER_INIT windres) enable_language(RC) set(CMAKE_RC_COMPILE_OBJECT " -i -o ") - endif() + endif() endif() if (APPLE) @@ -118,3 +123,8 @@ if(WIN32 AND PLATFORM_QT_STATIC) set(CMAKE_FIND_LIBRARY_SUFFIXES .a) target_link_libraries(NanoBoyAdvance-Qt -static z zstd gcc stdc++ winpthread winmm version Imm32 Setupapi) endif() + +install(TARGETS NanoBoyAdvance-Qt DESTINATION bin) +install(FILES rc/io.github.nba_emuNanoBoyAdvance.png DESTINATION share/icons/hicolor/128x128/apps) +install(FILES rc/io.github.nba_emuNanoBoyAdvance.desktop DESTINATION share/applications) +install(FILES rc/io.github.nba_emuNanoBoyAdvance.metainfo.xml DESTINATION share/metainfo) diff --git a/src/platform/qt/rc/io.github.nba_emuNanoBoyAdvance.desktop b/src/platform/qt/rc/io.github.nba_emuNanoBoyAdvance.desktop new file mode 100644 index 000000000..24161a51a --- /dev/null +++ b/src/platform/qt/rc/io.github.nba_emuNanoBoyAdvance.desktop @@ -0,0 +1,12 @@ +# Created with jdDesktopEntryEdit 1.0 +[Desktop Entry] +Type=Application +Name=NanoBoyAdvance +Comment=A cycle-accurate Nintendo Game Boy Advance emulator +Icon=io.github.nba_emuNanoBoyAdvance +TryExec=NanoBoyAdvance +Exec=NanoBoyAdvance %f +MimeType=application/x-gameboy-advance-rom;pplication/x-agb-rom;application/x-gba-rom; +Categories=Game;Emulator; +Keywords=Emulator;Nintendo;GameBoy;Game Boy Advance;GBA;GB; +SingleMainWindow=true diff --git a/src/platform/qt/rc/io.github.nba_emuNanoBoyAdvance.metainfo.xml b/src/platform/qt/rc/io.github.nba_emuNanoBoyAdvance.metainfo.xml new file mode 100644 index 000000000..9512ecb4d --- /dev/null +++ b/src/platform/qt/rc/io.github.nba_emuNanoBoyAdvance.metainfo.xml @@ -0,0 +1,118 @@ + + + + io.github.nba_emuNanoBoyAdvance + NanoBoyAdvance + A cycle-accurate Nintendo Game Boy Advance emulator + fleroviux + io.github.nba_emuNanoBoyAdvance.desktop + CC0-1.0 + GPL-3.0 + +

NanoBoyAdvance is a cycle-accurate Game Boy Advance emulator. +It aims to be as accurate as possible, while also offering enhancements such as improved audio quality.

+

Features

+
    +
  • Very high compatibility and accuracy
  • +
  • HQ audio mixer (for games which use Nintendo's MusicPlayer2000 sound engine)
  • +
  • Post-processing options (color correction, xBRZ upscaling and LCD ghosting simulation)
  • +
  • Save State support (10x save slots available)
  • +
  • Game controller support (buttons and axises can be remapped)
  • +
  • Loading ROMs from archives (Zip, 7z, Tar and limited RAR1 support)
  • +
  • RTC emulation
  • +
  • Solar Sensor emulation (for example: for Boktai - The Sun is in Your Hand)
  • +
+

Accuracy

+

A lot of research and attention to detail has been put into developing this core and making it accurate.

+
    +
  • Cycle-accurate emulation of most components, including: CPU, DMA, timers, PPU and Game Pak prefetch
  • +
  • Passes all AGS aging cartridge tests (NBA was the first public emulator to achieve this)
  • +
  • Passes most tests in the mGBA test suite
  • +
  • Passes ARMWrestler, gba-suite and FuzzARM CPU tests
  • +
+
+ + + https://github.com/nba-emu/NanoBoyAdvance/raw/v1.7/docs/screenshot.png + + + + + https://github.com/nba-emu/NanoBoyAdvance/releases/tag/v1.7 + +
    +
  • UI: implement a 'Use integer scaling' option
  • +
  • UI: allow limiting the screen scale
  • +
  • UI: allow accessing the menu during fullscreen gameplay
  • +
  • UI: allow setting a custom save folder
  • +
  • Core: implement save compatibility with mGBA 0.10.0+
  • +
  • Core: implement basic support for the mGBA logging interface
  • +
  • PPU: rewrite the PPU to be mostly cycle-accurate
  • +
  • PPU: implement the GREENSWAP register
  • +
  • PPU: use the 6-th green channel bit during blending
  • +
  • PPU: round the blending result to the nearest integer
  • +
  • ARM: fix a minor timing oversight in ARM mode
  • +
  • ARM: SWP and SWPB should lock the bus (no DMA interleave is possible)
  • +
  • ARM: do not force-align mis-aligned PC in ARM mode
  • +
  • Bus: allow the CPU to execute idle cycles in parallel to DMA
  • +
  • Bus: more accurately emulate disabling the prefetch buffer
  • +
  • Bus: force the first CPU access after a DMA to be non-sequential
  • +
  • Bus: implement penalty for ROM code access during the last ROM prefetch cycle
  • +
  • IRQ: delay IO writes by one cycle
  • +
  • IRQ: delay update of the IE&IF condition for unhalting the CPU
  • +
  • SIO: implement basic serial transfer timing
  • +
  • APU: emulate the master enable bit
  • +
  • APU: cancel a potentially pending event whan starting a channel
  • +
  • Scheduler: allow for (de)serialization of events for save states
  • +
+
+
+ + https://github.com/nba-emu/NanoBoyAdvance/releases/tag/v1.6 + + + https://github.com/nba-emu/NanoBoyAdvance/releases/tag/v1.5 + + + https://github.com/nba-emu/NanoBoyAdvance/releases/tag/v1.4 + + + https://github.com/nba-emu/NanoBoyAdvance/releases/tag/1.3 + + + https://github.com/nba-emu/NanoBoyAdvance/releases/tag/v1.2 + + + https://github.com/nba-emu/NanoBoyAdvance/releases/tag/v1.1 + + + https://github.com/nba-emu/NanoBoyAdvance/releases/tag/v1.0 + +
+ https://github.com/nba-emu/NanoBoyAdvance + https://github.com/nba-emu/NanoBoyAdvance + + Game + Emulator + + + pointing + keyboard + gamepad + + + + NanoBoyAdvance + application/x-gameboy-advance-rom + pplication/x-agb-rom + application/x-gba-rom + + + Emulator + Nintendo + GameBoy + Game Boy Advance + GBA + GB + +
diff --git a/src/platform/qt/rc/io.github.nba_emuNanoBoyAdvance.png b/src/platform/qt/rc/io.github.nba_emuNanoBoyAdvance.png new file mode 100644 index 0000000000000000000000000000000000000000..40ff3d6603a39d1997bf10e08770c4e47ab8a043 GIT binary patch literal 11882 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 MHH{E2)SaUL3zueKWdHyG literal 0 HcmV?d00001 diff --git a/src/platform/qt/src/config.hpp b/src/platform/qt/src/config.hpp index a18ff1783..bec62472d 100644 --- a/src/platform/qt/src/config.hpp +++ b/src/platform/qt/src/config.hpp @@ -12,6 +12,9 @@ #include #include #include +#include +#include +#include #include #ifdef MACOS_BUILD_APP_BUNDLE @@ -21,7 +24,7 @@ namespace fs = std::filesystem; -struct QtConfig final : nba::PlatformConfig { +struct QtConfig final : nba::PlatformConfig { QtConfig() { config_path = GetConfigPath(); } @@ -82,6 +85,15 @@ struct QtConfig final : nba::PlatformConfig { } void Save() { + auto config_dir = fs::path(config_path).parent_path(); + if (!fs::exists(config_dir)) { + try { + fs::create_directories(config_dir); + } catch (const std::exception& ex) { + qDebug() << "HHH"; + } + } + nba::PlatformConfig::Save(config_path); } @@ -126,7 +138,13 @@ struct QtConfig final : nba::PlatformConfig { } #endif - return "config.toml"; + #ifdef PORTABLE_MODE + return "config.toml"; + #else + auto config_directory = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation).toStdString(); + const std::filesystem::path config_path = config_directory; + return (config_path / "NanoBoyAdvance" / "config.toml").string(); + #endif } std::string config_path; diff --git a/src/platform/qt/src/main.cpp b/src/platform/qt/src/main.cpp index d453a5d05..584850a86 100644 --- a/src/platform/qt/src/main.cpp +++ b/src/platform/qt/src/main.cpp @@ -82,6 +82,7 @@ int main(int argc, char** argv) { QCoreApplication::setOrganizationName("fleroviux"); QCoreApplication::setApplicationName("NanoBoyAdvance"); + QGuiApplication::setDesktopFileName("io.github.nba_emuNanoBoyAdvance"); auto window = create_window(app, argc, argv);