From 19d953891b48af1d300f66b110f37edc4145fb2a Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Thu, 24 Jul 2025 14:54:26 +0200 Subject: [PATCH 01/12] working flatpak --- .gitignore | 5 + flatpak/FlatpakLaunch.sh | 2 + flatpak/org.zulianc.jminos.desktop | 8 ++ flatpak/org.zulianc.jminos.yml | 40 +++++++ src/GraphicalUI/AppMenus/AppMenu.cpp | 4 +- .../AppMenus/SettingsKeybindsAppMenu.cpp | 4 +- src/GraphicalUI/Keybinds.cpp | 5 +- src/GraphicalUI/Settings.cpp | 5 +- src/GraphicalUI/main.cpp | 32 +++--- src/Pieces/PiecesFiles.cpp | 5 +- src/TextUI/main.cpp | 3 +- src/Utils/AssetManager.cpp | 101 ++---------------- src/Utils/AssetManager.h | 31 ++---- xmake.lua | 30 ++++-- 14 files changed, 120 insertions(+), 155 deletions(-) create mode 100644 flatpak/FlatpakLaunch.sh create mode 100644 flatpak/org.zulianc.jminos.desktop create mode 100644 flatpak/org.zulianc.jminos.yml diff --git a/.gitignore b/.gitignore index 83ce8ae..882b457 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,8 @@ doc/mockups/* data/pieces/*.bin data/config/*.bin data/config/keybinds/*.bin + +# flatpak files +flatpak/.flatpak-builder +flatpak/builddir +flatpak/repo diff --git a/flatpak/FlatpakLaunch.sh b/flatpak/FlatpakLaunch.sh new file mode 100644 index 0000000..ea42414 --- /dev/null +++ b/flatpak/FlatpakLaunch.sh @@ -0,0 +1,2 @@ +#!/bin/sh +JMINOS_DATA="/app/share" /app/bin/graph \ No newline at end of file diff --git a/flatpak/org.zulianc.jminos.desktop b/flatpak/org.zulianc.jminos.desktop new file mode 100644 index 0000000..b74fe98 --- /dev/null +++ b/flatpak/org.zulianc.jminos.desktop @@ -0,0 +1,8 @@ +[Desktop Entry] +Type=Application +Version=1.0 +Name=Jminos +Exec=/usr/bin/graph +Terminal=false +Categories=Games; +Comment=Amazing stacker game by the J \ No newline at end of file diff --git a/flatpak/org.zulianc.jminos.yml b/flatpak/org.zulianc.jminos.yml new file mode 100644 index 0000000..8fe6cba --- /dev/null +++ b/flatpak/org.zulianc.jminos.yml @@ -0,0 +1,40 @@ +id: org.zulianc.jminos +runtime: org.freedesktop.Platform +runtime-version: "24.08" +sdk: org.freedesktop.Sdk +command: FlatpakLaunch.sh + +finish-args: + - --socket=x11 + - --device=dri + +modules: + - name: xmake + buildsystem: simple + no-autogen: true + cleanup: ['*'] + build-commands: + - ./configure --prefix=/app + - make -j $(nproc) + - prefix=/app ./scripts/get.sh __local__ __install_only__ + sources: + - type: git + url: https://github.com/xmake-io/xmake.git + tag: v3.0.1 + + - name: jminos + buildsystem: simple + build-options: + build-args: + - --share=network + build-commands: + - xmake f --policies=package.install_locally -m release -y + - xmake + - xmake install -o output + - install -D output/bin/* ${FLATPAK_DEST}/bin + - cp -r output/data ${FLATPAK_DEST}/share + - install -D flatpak/FlatpakLaunch.sh ${FLATPAK_DEST}/bin + - install -D flatpak/org.zulianc.jminos.desktop ${FLATPAK_DEST}/share/applications + sources: + - type: dir + path: .. diff --git a/src/GraphicalUI/AppMenus/AppMenu.cpp b/src/GraphicalUI/AppMenus/AppMenu.cpp index b927da6..20e0eb5 100644 --- a/src/GraphicalUI/AppMenus/AppMenu.cpp +++ b/src/GraphicalUI/AppMenus/AppMenu.cpp @@ -15,9 +15,7 @@ AppMenu::AppMenu(std::shared_ptr menuStack, std::shared_ptr settings(settings), renderWindow(renderWindow) { - const Asset& file = getResource(AssetName::data_fonts_pressstart_prstartk_ttf); - - this->pressStartFont = sf::Font(file.data, file.size); + this->pressStartFont = sf::Font(AssetManager::getResourcePath("data/fonts/pressstart/prstart.ttf")); } void AppMenu::updateMetaBinds() { diff --git a/src/GraphicalUI/AppMenus/SettingsKeybindsAppMenu.cpp b/src/GraphicalUI/AppMenus/SettingsKeybindsAppMenu.cpp index 95bec2c..f308f16 100644 --- a/src/GraphicalUI/AppMenus/SettingsKeybindsAppMenu.cpp +++ b/src/GraphicalUI/AppMenus/SettingsKeybindsAppMenu.cpp @@ -23,9 +23,7 @@ SettingsKeybindsAppMenu::SettingsKeybindsAppMenu(std::shared_ptr menu std::string textureName = ACTION_NAMES[action]; textureName = std::regex_replace(textureName, std::regex(" "), ""); - const Asset& textureData = getResource("data/images/keybinds/" + textureName + ".png"); - - this->iconTextures[action] = sf::Texture(textureData.data, textureData.size, false, {{0, 0}, {16, 16}}); + this->iconTextures[action] = sf::Texture(AssetManager::getResourcePath("data/images/keybinds/" + textureName + ".png"), false, {{0, 0}, {16, 16}}); } } diff --git a/src/GraphicalUI/Keybinds.cpp b/src/GraphicalUI/Keybinds.cpp index f4a1c67..5435982 100644 --- a/src/GraphicalUI/Keybinds.cpp +++ b/src/GraphicalUI/Keybinds.cpp @@ -6,6 +6,7 @@ #include #include #include +#include "../Utils/AssetManager.h" Keybinds::Keybinds(int layoutNumber) : @@ -20,7 +21,7 @@ Keybinds::Keybinds(int layoutNumber) : } void Keybinds::loadKeybindsFromFile() { - std::ifstream layoutFile("data/config/keybinds/layout" + std::to_string(this->layoutNumber) + ".bin", std::ios::binary); + std::ifstream layoutFile(AssetManager::getResourcePath("data/config/keybinds/layout" + std::to_string(this->layoutNumber) + ".bin"), std::ios::binary); for (Action action : ACTION_LIST_IN_ORDER) { this->keybinds.at(action).clear(); @@ -47,7 +48,7 @@ void Keybinds::loadKeybindsFromFile() { void Keybinds::saveKeybindsToFile() const { if (!this->modifiable) return; - std::ofstream layoutFile("data/config/keybinds/layout" + std::to_string(this->layoutNumber) + ".bin", std::ios::trunc | std::ios::binary); + std::ofstream layoutFile(AssetManager::getResourcePath("data/config/keybinds/layout" + std::to_string(this->layoutNumber) + ".bin"), std::ios::trunc | std::ios::binary); char byte; for (Action action : ACTION_LIST_IN_ORDER) { diff --git a/src/GraphicalUI/Settings.cpp b/src/GraphicalUI/Settings.cpp index 0c84bac..1a2f2df 100644 --- a/src/GraphicalUI/Settings.cpp +++ b/src/GraphicalUI/Settings.cpp @@ -3,6 +3,7 @@ #include "../Core/Menu.h" #include "Keybinds.h" #include "PiecesType.h" +#include "../Utils/AssetManager.h" #include #include @@ -49,7 +50,7 @@ void Settings::loadPieces(int loadablePiecesSizeRequest) { } void Settings::loadSettingsFromFile(bool loadPieces, std::optional loadablePiecesSizeRequest) { - std::ifstream settingsFile("data/config/settings.bin", std::ios::binary); + std::ifstream settingsFile(AssetManager::getResourcePath("data/config/settings.bin"), std::ios::binary); char byte; // file format version @@ -158,7 +159,7 @@ void Settings::saveSettingsToFile() const { this->keybinds.at(CUSTOMIZABLE_KEYBINDS).saveKeybindsToFile(); - std::ofstream settingsFile("data/config/settings.bin", std::ios::trunc | std::ios::binary); + std::ofstream settingsFile(AssetManager::getResourcePath("data/config/settings.bin"), std::ios::trunc | std::ios::binary); char byte; // file format version diff --git a/src/GraphicalUI/main.cpp b/src/GraphicalUI/main.cpp index a625522..71899fb 100644 --- a/src/GraphicalUI/main.cpp +++ b/src/GraphicalUI/main.cpp @@ -4,6 +4,8 @@ #include #include +#include "../Utils/AssetManager.h" + [[nodiscard]] bool resetSettingsFile(); [[nodiscard]] bool resetKeybindFile(int layout); @@ -18,7 +20,7 @@ int main() { PiecesFiles pf; bool warned = false; for (int i = 1; i <= MAXIMUM_PIECES_SIZE; i++) { - if (!std::filesystem::exists("data/pieces/" + std::to_string(i) + "minos.bin")) { + if (!std::filesystem::exists(AssetManager::getResourcePath("data/pieces/" + std::to_string(i) + "minos.bin"))) { #ifndef DEBUG if (!warned && i > DEBUG_PIECES_SIZE) { std::cout << "IMPORTANT: You are currently in release mode, if you do not wish to generate big pieces (can take several minutes), type 'xmake f -m debug'." << std::endl; @@ -36,7 +38,7 @@ int main() { bool releasePiecesGenerated = true; for (int i = DEBUG_PIECES_SIZE + 1; i <= RELEASE_PIECES_SIZE; i++) { - if (!std::filesystem::exists("data/pieces/" + std::to_string(i) + "minos.bin")) { + if (!std::filesystem::exists(AssetManager::getResourcePath("data/pieces/" + std::to_string(i) + "minos.bin"))) { releasePiecesGenerated = false; } } @@ -47,29 +49,29 @@ int main() { bool everythingGenerated = true; for (int i = 1; i <= MAXIMUM_PIECES_SIZE; i++) { - std::string filePath = "data/pieces/" + std::to_string(i) + "minos.bin"; + auto filePath = AssetManager::getResourcePath("data/pieces/" + std::to_string(i) + "minos.bin"); if (!std::filesystem::exists(filePath)) { - std::cout << "ERROR: Could not open file " + filePath << std::endl; + std::cout << "ERROR: Could not open file " << filePath << std::endl; everythingIsOK &= false; } } // CHECK CONFIG FILES - if (!std::filesystem::exists("data/config/settings.bin")) { + if (!std::filesystem::exists(AssetManager::getResourcePath("data/config/settings.bin"))) { std::cout << "INFO: Settings file not found, generating..." << std::endl; everythingIsOK &= resetSettingsFile(); for (int i = 0; i < NUMBER_OF_KEYBINDS; i++) { - if (!std::filesystem::exists("data/config/keybinds/layout" + std::to_string(i) + ".bin")) { + if (!std::filesystem::exists(AssetManager::getResourcePath("data/config/keybinds/layout" + std::to_string(i) + ".bin"))) { std::cout << "INFO: Keybind file number " << (i + 1) << "/" << NUMBER_OF_KEYBINDS << " not found, generating..." << std::endl; everythingIsOK &= resetKeybindFile(i); } } } else { - std::ifstream settingsFile("data/config/settings.bin", std::ios::binary); + std::ifstream settingsFile(AssetManager::getResourcePath("data/config/settings.bin"), std::ios::binary); char byte; settingsFile.get(byte); @@ -99,14 +101,14 @@ int main() { bool resetSettingsFile() { - if (!std::filesystem::exists("data/config")) { - std::filesystem::create_directories("data/config"); + if (!std::filesystem::exists(AssetManager::getResourcePath("data/config"))) { + std::filesystem::create_directories(AssetManager::getResourcePath("data/config")); } - std::string filePath ="data/config/settings.bin"; + auto filePath = AssetManager::getResourcePath("data/config/settings.bin"); std::ofstream settingsFile(filePath, std::ios::trunc | std::ios::binary); if (!settingsFile.good()) { - std::cerr << "ERROR: Could not open file " + filePath << std::endl; + std::cerr << "ERROR: Could not open file " << filePath << std::endl; return false; } @@ -180,14 +182,14 @@ bool resetKeybindFile(int layout) { return false; } - if (!std::filesystem::exists("data/config/keybinds")) { - std::filesystem::create_directories("data/config/keybinds"); + if (!std::filesystem::exists(AssetManager::getResourcePath("data/config/keybinds"))) { + std::filesystem::create_directories(AssetManager::getResourcePath("data/config/keybinds")); } - std::string filePath = "data/config/keybinds/layout" + std::to_string(layout) + ".bin"; + auto filePath = AssetManager::getResourcePath("data/config/keybinds/layout" + std::to_string(layout) + ".bin"); std::ofstream layoutFile(filePath, std::ios::trunc | std::ios::binary); if (!layoutFile.good()) { - std::cerr << "ERROR: Could not open file " + filePath << std::endl; + std::cerr << "ERROR: Could not open file " << filePath << std::endl; return false; } diff --git a/src/Pieces/PiecesFiles.cpp b/src/Pieces/PiecesFiles.cpp index 6500f41..26617f8 100644 --- a/src/Pieces/PiecesFiles.cpp +++ b/src/Pieces/PiecesFiles.cpp @@ -11,6 +11,7 @@ #include #include "../Common/Compression.h" +#include "../Utils/AssetManager.h" PiecesFiles::PiecesFiles() { @@ -140,7 +141,7 @@ bool PiecesFiles::loadPieces(int polyominoSize, std::vector& pieces, std: } bool PiecesFiles::getFilePath(int polyominoSize, std::string& filePath) const { - std::string dataFolderPath = "data/pieces/"; + auto dataFolderPath = AssetManager::getResourcePath("data/pieces"); if (!std::filesystem::exists(dataFolderPath)) { std::filesystem::create_directories(dataFolderPath); @@ -150,6 +151,6 @@ bool PiecesFiles::getFilePath(int polyominoSize, std::string& filePath) const { return false; } - filePath = dataFolderPath + std::to_string(polyominoSize) + "minos.bin"; + filePath = dataFolderPath / (std::to_string(polyominoSize) + "minos.bin"); return true; } diff --git a/src/TextUI/main.cpp b/src/TextUI/main.cpp index 6634373..2a360d8 100644 --- a/src/TextUI/main.cpp +++ b/src/TextUI/main.cpp @@ -1,6 +1,7 @@ #include "../Pieces/Generator.h" #include "../Pieces/PiecesFiles.h" #include "TextApp.h" +#include "../Utils/AssetManager.h" #include #include @@ -22,7 +23,7 @@ int main(int argc, char** argv) { PiecesFiles pf; bool warned = false; for (int i = 1; i <= MAXIMUM_PIECES_SIZE; i++) { - if (!std::filesystem::exists("data/pieces/" + std::to_string(i) + "minos.bin")) { + if (!std::filesystem::exists(AssetManager::getResourcePath("data/pieces/" + std::to_string(i) + "minos.bin"))) { if (!warned) { std::cout << "INFO: Pieces files for size " << i << " not found, generating..." << std::endl; warned = true; diff --git a/src/Utils/AssetManager.cpp b/src/Utils/AssetManager.cpp index 75b2c5d..61a1126 100644 --- a/src/Utils/AssetManager.cpp +++ b/src/Utils/AssetManager.cpp @@ -1,97 +1,12 @@ -#include "./AssetManager.h" +#include "AssetManager.h" -#include +namespace fs = std::filesystem; -static const unsigned char data_fonts_pressstart_prstart_ttf[] = { - #include -}; - -static const unsigned char data_fonts_pressstart_prstartk_ttf[] = { - #include -}; - -static const unsigned char data_images_keybinds_Rotate180_png[] = { - #include -}; - -static const unsigned char data_images_keybinds_Rotate0_png[] = { - #include -}; - -static const unsigned char data_images_keybinds_RotateCCW_png[] = { - #include -}; - -static const unsigned char data_images_keybinds_Retry_png[] = { - #include -}; - -static const unsigned char data_images_keybinds_RotateCW_png[] = { - #include -}; - -static const unsigned char data_images_keybinds_Moveright_png[] = { - #include -}; - -static const unsigned char data_images_keybinds_Harddrop_png[] = { - #include -}; - -static const unsigned char data_images_keybinds_Moveleft_png[] = { - #include -}; - -static const unsigned char data_images_keybinds_Hold_png[] = { - #include -}; - -static const unsigned char data_images_keybinds_Softdrop_png[] = { - #include -}; - -static const unsigned char data_images_keybinds_Pause_png[] = { - #include -}; - -static const Asset assets[] = { - {data_fonts_pressstart_prstart_ttf, sizeof(data_fonts_pressstart_prstart_ttf)}, - {data_fonts_pressstart_prstartk_ttf, sizeof(data_fonts_pressstart_prstartk_ttf)}, - {data_images_keybinds_Rotate180_png, sizeof(data_images_keybinds_Rotate180_png)}, - {data_images_keybinds_Rotate0_png, sizeof(data_images_keybinds_Rotate0_png)}, - {data_images_keybinds_RotateCCW_png, sizeof(data_images_keybinds_RotateCCW_png)}, - {data_images_keybinds_Retry_png, sizeof(data_images_keybinds_Retry_png)}, - {data_images_keybinds_RotateCW_png, sizeof(data_images_keybinds_RotateCW_png)}, - {data_images_keybinds_Moveright_png, sizeof(data_images_keybinds_Moveright_png)}, - {data_images_keybinds_Harddrop_png, sizeof(data_images_keybinds_Harddrop_png)}, - {data_images_keybinds_Moveleft_png, sizeof(data_images_keybinds_Moveleft_png)}, - {data_images_keybinds_Hold_png, sizeof(data_images_keybinds_Hold_png)}, - {data_images_keybinds_Softdrop_png, sizeof(data_images_keybinds_Softdrop_png)}, - {data_images_keybinds_Pause_png, sizeof(data_images_keybinds_Pause_png)}, - -}; - -static const std::map assetMap = { - {"data/fonts/pressstart/prstart.ttf", AssetName::data_fonts_pressstart_prstart_ttf}, - {"data/fonts/pressstart/prstartk.ttf", AssetName::data_fonts_pressstart_prstartk_ttf}, - {"data/images/keybinds/Rotate180.png", AssetName::data_images_keybinds_Rotate180_png}, - {"data/images/keybinds/Rotate0.png", AssetName::data_images_keybinds_Rotate0_png}, - {"data/images/keybinds/RotateCCW.png", AssetName::data_images_keybinds_RotateCCW_png}, - {"data/images/keybinds/Retry.png", AssetName::data_images_keybinds_Retry_png}, - {"data/images/keybinds/RotateCW.png", AssetName::data_images_keybinds_RotateCW_png}, - {"data/images/keybinds/Moveright.png", AssetName::data_images_keybinds_Moveright_png}, - {"data/images/keybinds/Harddrop.png", AssetName::data_images_keybinds_Harddrop_png}, - {"data/images/keybinds/Moveleft.png", AssetName::data_images_keybinds_Moveleft_png}, - {"data/images/keybinds/Hold.png", AssetName::data_images_keybinds_Hold_png}, - {"data/images/keybinds/Softdrop.png", AssetName::data_images_keybinds_Softdrop_png}, - {"data/images/keybinds/Pause.png", AssetName::data_images_keybinds_Pause_png}, - -}; - -const Asset& getResource(AssetName fileName) { - return assets[static_cast(fileName)]; +std::string AssetManager::getResourcePrefix() { + char* env = std::getenv("JMINOS_DATA"); + return env ? env : std::string{}; } -const Asset& getResource(const std::string& fileName) { - return getResource(assetMap.at(fileName)); -} +fs::path AssetManager::getResourcePath(const std::string& resource) { + return fs::path{getResourcePrefix()} / resource; +} \ No newline at end of file diff --git a/src/Utils/AssetManager.h b/src/Utils/AssetManager.h index e4eacae..15cfd88 100644 --- a/src/Utils/AssetManager.h +++ b/src/Utils/AssetManager.h @@ -2,29 +2,10 @@ #include #include +#include -struct Asset { - const unsigned char* data; - std::size_t size; -}; - -enum class AssetName { - data_fonts_pressstart_prstart_ttf, - data_fonts_pressstart_prstartk_ttf, - data_images_keybinds_Rotate180_png, - data_images_keybinds_Rotate0_png, - data_images_keybinds_RotateCCW_png, - data_images_keybinds_Retry_png, - data_images_keybinds_RotateCW_png, - data_images_keybinds_Moveright_png, - data_images_keybinds_Harddrop_png, - data_images_keybinds_Moveleft_png, - data_images_keybinds_Hold_png, - data_images_keybinds_Softdrop_png, - data_images_keybinds_Pause_png, - -}; - -const Asset& getResource(AssetName fileName); - -const Asset& getResource(const std::string& fileName); +class AssetManager { + public: + static std::string getResourcePrefix(); + static std::filesystem::path getResourcePath(const std::string& resource); +}; \ No newline at end of file diff --git a/xmake.lua b/xmake.lua index d579661..026ee2c 100644 --- a/xmake.lua +++ b/xmake.lua @@ -1,8 +1,11 @@ add_rules("mode.debug", "mode.release") -includes("xmake/bin2c.lua") +set_version("1.0.0") +set_project("org.zulianc.jminos") -add_requires("sfml 3.0.0", "zlib") +includes("@builtin/xpack") + +add_requires("sfml 3.0.0", "zlib", {system = false}) set_languages("c++20") @@ -10,7 +13,7 @@ set_rundir(".") target("core") set_kind("$(kind)") - add_files("src/Pieces/*.cpp", "src/Core/*.cpp", "src/Common/*.cpp") + add_files("src/Pieces/*.cpp", "src/Core/*.cpp", "src/Common/*.cpp", "src/Utils/*.cpp") add_packages("zlib") target("text") @@ -27,16 +30,11 @@ target("bmark") target("graph") set_default(true) - add_rules("bin2c", { - extensions = {".png", ".ttf"}, - outputSource = {"src/Utils/AssetManager.cpp"}, - outputHeader = {"src/Utils/AssetManager.h"} - }) set_kind("binary") add_files("./src/GraphicalUI/**.cpp") - add_files("data/fonts/**.ttf", "data/images/**.png") add_deps("core") add_packages("sfml") + add_installfiles("(data/**)") if is_mode("debug") then add_defines("DEBUG") @@ -46,6 +44,20 @@ if is_plat("mingw") then add_ldflags("-static-libstdc++", "-static") end +xpack("jminos") + set_formats("flatpak") + set_extension("") + set_title("jminos") + set_author("zulianc") + set_description("A test installer.") + set_homepage("https://git.ale-pri.com/TetrisNerd/jminos") + set_company("org.zulianc") + on_package(function (package) + os.cd("flatpak") + os.exec("flatpak-builder --force-clean --user --install-deps-from=flathub --repo=repo --install builddir org.zulianc.jminos.yml") + os.exec("flatpak build-bundle repo jminos.flatpak org.zulianc.jminos --runtime-repo=https://flathub.org/repo/flathub.flatpakrepo") + os.mv("jminos.flatpak", package:outputdir()) + end) -- -- If you want to known more usage about xmake, please see https://xmake.io -- 2.49.1 From 6dbcc717f7677c61b18451dd7e17e029b35c3acc Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Thu, 24 Jul 2025 15:12:48 +0200 Subject: [PATCH 02/12] fix normal build --- flatpak/org.zulianc.jminos.yml | 10 +++++----- xmake.lua | 10 +++++++++- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/flatpak/org.zulianc.jminos.yml b/flatpak/org.zulianc.jminos.yml index 8fe6cba..24c16a5 100644 --- a/flatpak/org.zulianc.jminos.yml +++ b/flatpak/org.zulianc.jminos.yml @@ -28,13 +28,13 @@ modules: build-args: - --share=network build-commands: - - xmake f --policies=package.install_locally -m release -y + - xmake f --policies=package.install_locally --external_build=y -m release -y - xmake - xmake install -o output - - install -D output/bin/* ${FLATPAK_DEST}/bin - - cp -r output/data ${FLATPAK_DEST}/share - - install -D flatpak/FlatpakLaunch.sh ${FLATPAK_DEST}/bin - - install -D flatpak/org.zulianc.jminos.desktop ${FLATPAK_DEST}/share/applications + - install -D output/bin/* /app/bin + - cp -r output/data /app/share + - install -D flatpak/FlatpakLaunch.sh /app/bin + - install -D -t /app/share/applications flatpak/org.zulianc.jminos.desktop sources: - type: dir path: .. diff --git a/xmake.lua b/xmake.lua index 026ee2c..5ab205d 100644 --- a/xmake.lua +++ b/xmake.lua @@ -5,7 +5,15 @@ set_project("org.zulianc.jminos") includes("@builtin/xpack") -add_requires("sfml 3.0.0", "zlib", {system = false}) +option("external_build") + set_default(false) +option_end() + +if has_config("external_build") then + add_requires("sfml 3.0.0", "zlib", {system = false}) +else + add_requires("sfml 3.0.0", "zlib") +end set_languages("c++20") -- 2.49.1 From 508405b00c5d7364154b489522ffd8f07a7f230e Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Thu, 24 Jul 2025 15:12:55 +0200 Subject: [PATCH 03/12] fix desktop file --- flatpak/org.zulianc.jminos.desktop | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flatpak/org.zulianc.jminos.desktop b/flatpak/org.zulianc.jminos.desktop index b74fe98..fb1d783 100644 --- a/flatpak/org.zulianc.jminos.desktop +++ b/flatpak/org.zulianc.jminos.desktop @@ -4,5 +4,5 @@ Version=1.0 Name=Jminos Exec=/usr/bin/graph Terminal=false -Categories=Games; +Categories=Game; Comment=Amazing stacker game by the J \ No newline at end of file -- 2.49.1 From 7040ce3381e66b5b87cf0033909f35ad82396410 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Thu, 24 Jul 2025 17:45:44 +0200 Subject: [PATCH 04/12] add flatpak metadata --- flatpak/org.zulianc.jminos.desktop | 1 + flatpak/org.zulianc.jminos.metainfo.xml | 71 ++++++++++++++++++++++++ flatpak/org.zulianc.jminos.png | Bin 0 -> 18616 bytes flatpak/org.zulianc.jminos.yml | 8 ++- 4 files changed, 77 insertions(+), 3 deletions(-) create mode 100644 flatpak/org.zulianc.jminos.metainfo.xml create mode 100644 flatpak/org.zulianc.jminos.png diff --git a/flatpak/org.zulianc.jminos.desktop b/flatpak/org.zulianc.jminos.desktop index fb1d783..7eed97a 100644 --- a/flatpak/org.zulianc.jminos.desktop +++ b/flatpak/org.zulianc.jminos.desktop @@ -3,6 +3,7 @@ Type=Application Version=1.0 Name=Jminos Exec=/usr/bin/graph +Icon=org.zulianc.jminos Terminal=false Categories=Game; Comment=Amazing stacker game by the J \ No newline at end of file diff --git a/flatpak/org.zulianc.jminos.metainfo.xml b/flatpak/org.zulianc.jminos.metainfo.xml new file mode 100644 index 0000000..99a5f3e --- /dev/null +++ b/flatpak/org.zulianc.jminos.metainfo.xml @@ -0,0 +1,71 @@ + + + org.zulianc.jminos + org.zulianc.jminos.desktop + jminos + Zulianc + Amazing stacker game by the J + CC0-1.0 + GPL-3.0-only + https://git.ale-pri.com/TetrisNerd/jminos + +

+ Modern stacker game with every polyominoes from size 1 to 15, made in C++ with SFML 3! +

+

Features

+
    +
  • Every polyominoes up to pentedecaminoes!
  • +
  • 7bag with proportionnality for each polyomino size!
  • +
  • AutoRS as the Rotation System!
  • +
  • 0° rotations!
  • +
  • All spin!
  • +
  • IRS, IHS, infinite hold, and other leniency mechanics!
  • +
  • Customizable board size!
  • +
  • Customizable keybinds!
  • +
  • Very bland interface!! (i'm not a designer)
  • +
+

Available gamemodes

+
    +
  • SPRINT : clear 40 lines as fast as possible!
  • +
  • MARATHON : clear 200 lines with increasing gravity!
  • +
  • ULTRA : scores as much as possible in only 2 minutes!
  • +
  • MASTER : clear 200 lines at levels higher than maximum gravity!
  • +
  • INVISIBLE : get 1000 grade while not being able to see the board!
  • +
  • ZEN : practice indefinitely in this mode with no gravity!
  • +
+
+ + + org.zulianc.jminos.desktop + + + Game + + + + Big piece + https://git.ale-pri.com/TetrisNerd/jminos/raw/branch/main/doc/readme/big_piece.png + + + Dark Settings + https://git.ale-pri.com/TetrisNerd/jminos/media/branch/main/doc/readme/pieces_selection.png + + + Light Interface + https://git.ale-pri.com/TetrisNerd/jminos/media/branch/main/doc/readme/rotations.gif + + + Light Grid View + https://git.ale-pri.com/TetrisNerd/jminos/media/branch/main/doc/readme/rotation_0.gif + + + + + https://git.ale-pri.com/TetrisNerd/jminos/src/tag/v1.0/ + + Inital release + + + + +
\ No newline at end of file diff --git a/flatpak/org.zulianc.jminos.png b/flatpak/org.zulianc.jminos.png new file mode 100644 index 0000000000000000000000000000000000000000..f07208d22b8a492a8c6446dbbde2987cc9d043a8 GIT binary patch literal 18616 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 Date: Fri, 25 Jul 2025 10:22:45 +0200 Subject: [PATCH 05/12] fix config save (flatpak) --- flatpak/FlatpakLaunch.sh | 2 +- src/GraphicalUI/Keybinds.cpp | 4 ++-- src/GraphicalUI/Settings.cpp | 4 ++-- src/GraphicalUI/main.cpp | 18 +++++++++--------- src/Utils/AssetManager.cpp | 12 ++++++++---- src/Utils/AssetManager.h | 9 ++++++++- 6 files changed, 30 insertions(+), 19 deletions(-) diff --git a/flatpak/FlatpakLaunch.sh b/flatpak/FlatpakLaunch.sh index ea42414..8fe4e97 100644 --- a/flatpak/FlatpakLaunch.sh +++ b/flatpak/FlatpakLaunch.sh @@ -1,2 +1,2 @@ #!/bin/sh -JMINOS_DATA="/app/share" /app/bin/graph \ No newline at end of file +JMINOS_DATA="/app/share" JMINOS_CONFIG=$XDG_CONFIG_HOME /app/bin/graph \ No newline at end of file diff --git a/src/GraphicalUI/Keybinds.cpp b/src/GraphicalUI/Keybinds.cpp index 5435982..bb70708 100644 --- a/src/GraphicalUI/Keybinds.cpp +++ b/src/GraphicalUI/Keybinds.cpp @@ -21,7 +21,7 @@ Keybinds::Keybinds(int layoutNumber) : } void Keybinds::loadKeybindsFromFile() { - std::ifstream layoutFile(AssetManager::getResourcePath("data/config/keybinds/layout" + std::to_string(this->layoutNumber) + ".bin"), std::ios::binary); + std::ifstream layoutFile(AssetManager::getConfigPath("data/config/keybinds/layout" + std::to_string(this->layoutNumber) + ".bin"), std::ios::binary); for (Action action : ACTION_LIST_IN_ORDER) { this->keybinds.at(action).clear(); @@ -48,7 +48,7 @@ void Keybinds::loadKeybindsFromFile() { void Keybinds::saveKeybindsToFile() const { if (!this->modifiable) return; - std::ofstream layoutFile(AssetManager::getResourcePath("data/config/keybinds/layout" + std::to_string(this->layoutNumber) + ".bin"), std::ios::trunc | std::ios::binary); + std::ofstream layoutFile(AssetManager::getConfigPath("data/config/keybinds/layout" + std::to_string(this->layoutNumber) + ".bin"), std::ios::trunc | std::ios::binary); char byte; for (Action action : ACTION_LIST_IN_ORDER) { diff --git a/src/GraphicalUI/Settings.cpp b/src/GraphicalUI/Settings.cpp index 1a2f2df..13a2185 100644 --- a/src/GraphicalUI/Settings.cpp +++ b/src/GraphicalUI/Settings.cpp @@ -50,7 +50,7 @@ void Settings::loadPieces(int loadablePiecesSizeRequest) { } void Settings::loadSettingsFromFile(bool loadPieces, std::optional loadablePiecesSizeRequest) { - std::ifstream settingsFile(AssetManager::getResourcePath("data/config/settings.bin"), std::ios::binary); + std::ifstream settingsFile(AssetManager::getConfigPath("data/config/settings.bin"), std::ios::binary); char byte; // file format version @@ -159,7 +159,7 @@ void Settings::saveSettingsToFile() const { this->keybinds.at(CUSTOMIZABLE_KEYBINDS).saveKeybindsToFile(); - std::ofstream settingsFile(AssetManager::getResourcePath("data/config/settings.bin"), std::ios::trunc | std::ios::binary); + std::ofstream settingsFile(AssetManager::getConfigPath("data/config/settings.bin"), std::ios::trunc | std::ios::binary); char byte; // file format version diff --git a/src/GraphicalUI/main.cpp b/src/GraphicalUI/main.cpp index 71899fb..e04d72d 100644 --- a/src/GraphicalUI/main.cpp +++ b/src/GraphicalUI/main.cpp @@ -59,19 +59,19 @@ int main() { // CHECK CONFIG FILES - if (!std::filesystem::exists(AssetManager::getResourcePath("data/config/settings.bin"))) { + if (!std::filesystem::exists(AssetManager::getConfigPath("data/config/settings.bin"))) { std::cout << "INFO: Settings file not found, generating..." << std::endl; everythingIsOK &= resetSettingsFile(); for (int i = 0; i < NUMBER_OF_KEYBINDS; i++) { - if (!std::filesystem::exists(AssetManager::getResourcePath("data/config/keybinds/layout" + std::to_string(i) + ".bin"))) { + if (!std::filesystem::exists(AssetManager::getConfigPath("data/config/keybinds/layout" + std::to_string(i) + ".bin"))) { std::cout << "INFO: Keybind file number " << (i + 1) << "/" << NUMBER_OF_KEYBINDS << " not found, generating..." << std::endl; everythingIsOK &= resetKeybindFile(i); } } } else { - std::ifstream settingsFile(AssetManager::getResourcePath("data/config/settings.bin"), std::ios::binary); + std::ifstream settingsFile(AssetManager::getConfigPath("data/config/settings.bin"), std::ios::binary); char byte; settingsFile.get(byte); @@ -101,11 +101,11 @@ int main() { bool resetSettingsFile() { - if (!std::filesystem::exists(AssetManager::getResourcePath("data/config"))) { - std::filesystem::create_directories(AssetManager::getResourcePath("data/config")); + if (!std::filesystem::exists(AssetManager::getConfigPath("data/config"))) { + std::filesystem::create_directories(AssetManager::getConfigPath("data/config")); } - auto filePath = AssetManager::getResourcePath("data/config/settings.bin"); + auto filePath = AssetManager::getConfigPath("data/config/settings.bin"); std::ofstream settingsFile(filePath, std::ios::trunc | std::ios::binary); if (!settingsFile.good()) { std::cerr << "ERROR: Could not open file " << filePath << std::endl; @@ -182,11 +182,11 @@ bool resetKeybindFile(int layout) { return false; } - if (!std::filesystem::exists(AssetManager::getResourcePath("data/config/keybinds"))) { - std::filesystem::create_directories(AssetManager::getResourcePath("data/config/keybinds")); + if (!std::filesystem::exists(AssetManager::getConfigPath("data/config/keybinds"))) { + std::filesystem::create_directories(AssetManager::getConfigPath("data/config/keybinds")); } - auto filePath = AssetManager::getResourcePath("data/config/keybinds/layout" + std::to_string(layout) + ".bin"); + auto filePath = AssetManager::getConfigPath("data/config/keybinds/layout" + std::to_string(layout) + ".bin"); std::ofstream layoutFile(filePath, std::ios::trunc | std::ios::binary); if (!layoutFile.good()) { std::cerr << "ERROR: Could not open file " << filePath << std::endl; diff --git a/src/Utils/AssetManager.cpp b/src/Utils/AssetManager.cpp index 61a1126..0b12e94 100644 --- a/src/Utils/AssetManager.cpp +++ b/src/Utils/AssetManager.cpp @@ -2,11 +2,15 @@ namespace fs = std::filesystem; -std::string AssetManager::getResourcePrefix() { - char* env = std::getenv("JMINOS_DATA"); - return env ? env : std::string{}; +static std::string getEnv(const std::string& var) { + char* env = std::getenv(var.c_str()); + return env ? env : ""; } fs::path AssetManager::getResourcePath(const std::string& resource) { - return fs::path{getResourcePrefix()} / resource; + return fs::path{getEnv("JMINOS_DATA")} / resource; +} + +fs::path AssetManager::getConfigPath(const std::string& resource) { + return fs::path{getEnv("JMINOS_CONFIG")} / resource; } \ No newline at end of file diff --git a/src/Utils/AssetManager.h b/src/Utils/AssetManager.h index 15cfd88..ab36e94 100644 --- a/src/Utils/AssetManager.h +++ b/src/Utils/AssetManager.h @@ -6,6 +6,13 @@ class AssetManager { public: - static std::string getResourcePrefix(); + /** + * @brief Used to load things (might be read-only) + */ static std::filesystem::path getResourcePath(const std::string& resource); + + /** + * @brief Used to save things + */ + static std::filesystem::path getConfigPath(const std::string& resource); }; \ No newline at end of file -- 2.49.1 From 792bf73e79213dc24ea9a3df94a5480cfc7238b4 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Fri, 25 Jul 2025 10:50:38 +0200 Subject: [PATCH 06/12] split xmake module in its own file --- flatpak/org.zulianc.jminos.yml | 13 +------------ flatpak/xmake.yml | 12 ++++++++++++ 2 files changed, 13 insertions(+), 12 deletions(-) create mode 100644 flatpak/xmake.yml diff --git a/flatpak/org.zulianc.jminos.yml b/flatpak/org.zulianc.jminos.yml index ec07409..caad499 100644 --- a/flatpak/org.zulianc.jminos.yml +++ b/flatpak/org.zulianc.jminos.yml @@ -9,18 +9,7 @@ finish-args: - --device=dri modules: - - name: xmake - buildsystem: simple - no-autogen: true - cleanup: ['*'] - build-commands: - - ./configure --prefix=/app - - make -j $(FLATPAK_BUILDER_N_JOBS) - - prefix=/app ./scripts/get.sh __local__ __install_only__ - sources: - - type: git - url: https://github.com/xmake-io/xmake.git - tag: v3.0.1 + - xmake.yml - name: jminos buildsystem: simple diff --git a/flatpak/xmake.yml b/flatpak/xmake.yml new file mode 100644 index 0000000..b9797cf --- /dev/null +++ b/flatpak/xmake.yml @@ -0,0 +1,12 @@ +name: xmake +buildsystem: simple +no-autogen: true +cleanup: ['*'] +build-commands: + - ./configure --prefix=/app + - make -j $(FLATPAK_BUILDER_N_JOBS) + - prefix=/app ./scripts/get.sh __local__ __install_only__ +sources: + - type: git + url: https://github.com/xmake-io/xmake.git + tag: v3.0.1 -- 2.49.1 From 7301c40ba9123efe735b5d919d0f94dbf08d23b0 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Fri, 25 Jul 2025 11:54:58 +0200 Subject: [PATCH 07/12] fix mingw build --- src/Pieces/PiecesFiles.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Pieces/PiecesFiles.cpp b/src/Pieces/PiecesFiles.cpp index 26617f8..da491d4 100644 --- a/src/Pieces/PiecesFiles.cpp +++ b/src/Pieces/PiecesFiles.cpp @@ -151,6 +151,6 @@ bool PiecesFiles::getFilePath(int polyominoSize, std::string& filePath) const { return false; } - filePath = dataFolderPath / (std::to_string(polyominoSize) + "minos.bin"); + filePath = (dataFolderPath / (std::to_string(polyominoSize) + "minos.bin")).string(); return true; } -- 2.49.1 From 9208a5750dfb0827e1794f611e869c5395c640e3 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Mon, 28 Jul 2025 10:29:42 +0200 Subject: [PATCH 08/12] zip windows packing --- xmake.lua | 15 +-------------- xpack.lua | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+), 14 deletions(-) create mode 100644 xpack.lua diff --git a/xmake.lua b/xmake.lua index 5ab205d..a053819 100644 --- a/xmake.lua +++ b/xmake.lua @@ -52,20 +52,7 @@ if is_plat("mingw") then add_ldflags("-static-libstdc++", "-static") end -xpack("jminos") - set_formats("flatpak") - set_extension("") - set_title("jminos") - set_author("zulianc") - set_description("A test installer.") - set_homepage("https://git.ale-pri.com/TetrisNerd/jminos") - set_company("org.zulianc") - on_package(function (package) - os.cd("flatpak") - os.exec("flatpak-builder --force-clean --user --install-deps-from=flathub --repo=repo --install builddir org.zulianc.jminos.yml") - os.exec("flatpak build-bundle repo jminos.flatpak org.zulianc.jminos --runtime-repo=https://flathub.org/repo/flathub.flatpakrepo") - os.mv("jminos.flatpak", package:outputdir()) - end) +includes("./xpack.lua") -- -- If you want to known more usage about xmake, please see https://xmake.io diff --git a/xpack.lua b/xpack.lua new file mode 100644 index 0000000..c000afc --- /dev/null +++ b/xpack.lua @@ -0,0 +1,33 @@ +if is_os("linux") then + +xpack("jminos") + set_formats("flatpak") + set_extension("flatpak") + set_title("jminos") + set_author("zulianc") + set_description("A test installer.") + set_homepage("https://git.ale-pri.com/TetrisNerd/jminos") + set_company("org.zulianc") + on_package(function (package) + os.cd("flatpak") + os.exec("flatpak-builder --force-clean --user --install-deps-from=flathub --repo=repo --install builddir org.zulianc.jminos.yml") + os.exec("flatpak build-bundle repo jminos.flatpak org.zulianc.jminos --runtime-repo=https://flathub.org/repo/flathub.flatpakrepo") + os.mv("jminos.flatpak", package:outputdir()) + end) + +else + +xpack("jminos") + set_formats("zip") + add_targets("graph") + add_installfiles("(data/**.png)") + on_load(function (package) + package:set("basename", package:name() .. "-v" .. package:version() .. "-" .. package:arch()) + end) + after_installcmd(function (package, batchcmds) + batchcmds:mv(path.join(package:installdir("bin"), "*"), package:installdir()) + batchcmds:rm(package:installdir("bin")) + batchcmds:rm(package:installdir("**/.gitkeep")) + end) + +end \ No newline at end of file -- 2.49.1 From 86a034a4ac3fcbd580d1a045568c605021c2fcc7 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Mon, 28 Jul 2025 10:31:06 +0200 Subject: [PATCH 09/12] update flatpak metainfo --- flatpak/org.zulianc.jminos.metainfo.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flatpak/org.zulianc.jminos.metainfo.xml b/flatpak/org.zulianc.jminos.metainfo.xml index 99a5f3e..88ec0be 100644 --- a/flatpak/org.zulianc.jminos.metainfo.xml +++ b/flatpak/org.zulianc.jminos.metainfo.xml @@ -5,8 +5,8 @@ jminos Zulianc Amazing stacker game by the J - CC0-1.0 - GPL-3.0-only + https://git.ale-pri.com/TetrisNerd/jminos

@@ -22,7 +22,7 @@

  • IRS, IHS, infinite hold, and other leniency mechanics!
  • Customizable board size!
  • Customizable keybinds!
  • -
  • Very bland interface!! (i'm not a designer)
  • +
  • Very bland interface!! (i'm not a designer)
  • Available gamemodes

      @@ -47,15 +47,15 @@ https://git.ale-pri.com/TetrisNerd/jminos/raw/branch/main/doc/readme/big_piece.png - Dark Settings + Pieces selection https://git.ale-pri.com/TetrisNerd/jminos/media/branch/main/doc/readme/pieces_selection.png - Light Interface + Rotations https://git.ale-pri.com/TetrisNerd/jminos/media/branch/main/doc/readme/rotations.gif - Light Grid View + Rotation_0 https://git.ale-pri.com/TetrisNerd/jminos/media/branch/main/doc/readme/rotation_0.gif -- 2.49.1 From 7977fb976bbe70e72ff0d77165b5a35d50f16166 Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Tue, 29 Jul 2025 21:13:10 +0200 Subject: [PATCH 10/12] nsis packaging --- flatpak/org.zulianc.jminos.ico | Bin 0 -> 14033 bytes src/GraphicalUI/main.cpp | 4 +++- src/Utils/AssetManager.cpp | 15 +++++++++++++-- src/Utils/AssetManager.h | 5 +++++ xmake.lua | 3 ++- xpack.lua => xmake/xpack.lua | 15 +++++++++------ 6 files changed, 32 insertions(+), 10 deletions(-) create mode 100644 flatpak/org.zulianc.jminos.ico rename xpack.lua => xmake/xpack.lua (64%) diff --git a/flatpak/org.zulianc.jminos.ico b/flatpak/org.zulianc.jminos.ico new file mode 100644 index 0000000000000000000000000000000000000000..52079c1de3cd17e7eae506792b96b9e4b6d01e7c GIT binary patch literal 14033 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

      XrV3Y;UOdYx-_9f>TyzqfxWc8#g5A;L z_h#)**2qwLJ}8%8gk)f36~Q}#PtDA)LLI41_$c1x;_F>z4=1tBSq)-y*T6$QZR;1G zpWQ^xkZnJKa^0zma@{hsWWy=5z2}rigxrZn<<}$+zghhgtD$3p45y4{M5*_dux$D_ zSoA%`ZA|HUfh5>S2V<|JjSW!#!_|a6NUB%YHc(I zg-$pFYX-4it#|Pn%;N~n1pblVlM;`GQ2Ejvqy4rpH4S|+_J~%Z+m>W>V|%w{ncm%O zDyG$B{CaVI`e|XZu1wagP#w?U%G&LW<|Xgi3rXvzT~vHHO38hOGB!~KlAdA`4QBXv zx=!TPuPCm(xZ7(YlR|i%3+uelQqJYNsZTh$kmym(ag}2KvZkj_XU}R9+uIG6ob==j zZewduzXm&;jC^92Y-3SEF}TY-sabcoyeQ1W=+(b9g@2thj@C{T`Dx96<7J1l4R=1&Y# z$3&}^l$0dC%tGjA%(>8}WmL(rr%HlKMW_n9_Gw?flA%0nY+5)M6d9W<3C+HTj70!; z3T*X<6)U7AQ0_|2CNLKI5U%-)>KTo?Xe!p!hi$El?p?qA2>S^^${oBg2%JQ?V)PDd zJb&5YSiP%&R!)1u_7m}^&l3sR|f3Gi%HqAWIno&|{-?2W6 zc#&^sw9JTW{u>Ayx#O8=7UrYpkBaSJ^P9zwdRs;PE{O@fFsbUV<(E}R#|F|(mZNq$ z)so*=WWK$W-gTvywy+M*mg>B_Zlw7ax0ZZ1BjsyCnS`M^+k2tpR;fo`vYU=dy>>LN zT4K6IRJGa((kG+xDy+_qo-i;c>bfVdZc6?p-How7rJkzrp#@VyVQ%5iF42P8!nrB? zhnXIn*Iy_(=18u+{8{EID<7Gi#?%Ws4#)^Pf2Bxq|1;7c`j}gN&DbNsJ8*2C;nkqT zL4(b^v^($D2u0n7BvSnTdR(16o*r|ks7>%7p-Q4onkt<-L1hI#zC2S^Vfotk#6w}F zEaB|ab0y-3+M(AnR=-&5c7JW=%zraLg-8FDM3Y5Kmf$I}b#I(KEadCql_0epXkg@c z*wSHf{n;7E;n(tvQRWWX@$2o-(ApKzyRWD3b$7Ss{V*|N9PDR+bSP=O;;m>%okM`Z-R>?&!^}`khHNp6I>o$Yxm?J2Ij;Sbf6`^(|9 z|9lRoIw4aImg#N%aB_KbZe@_G*&X-2=iKwK>A6~GJn6&TC@p<=d@rXrs13sKJEmXF zJ->cd6Pejcl}?%YNX+OocuLLHnLzjqjZ7{|u;L7YY?k7PyK0s-=}X`6f)Qi&j1PfT z>W)eGFFY$=T3f(^ed3n{M;}a2)uvh4Q>Q2Xfs0TpoqxlK4>! zdVvn-L03oOhsx5;xS;MJz4=n_x73brlj51~ID}{FkM+=kd$+$i6r~KfkRVhNK!Yj` zbn{{$u!>?~iVwILXKjF)5!^g;FTI{zD*5aDVCOh@^k!p2UKDBOebA#oD*R+h~97XTjW_TcIEPA4iV==4zS;4%D z{clPhKlUL<(d-}vdog6DWt?o8Cf|iMp8QgU$;QVrR^|fG!40+l3J{@~Nq55f_zwyY zYEYLz=Kx3lmNa7Y+4(z|So4v{p0NF^5=#)VJAc$^Cj2>R*jVxV+|bz9YzCTO!T9ld zyP0;~i#KW-95rbjv)4;XMWu?GuM%)*PQb{3+g%({%4SAP7iS^7%RzZ6^|93LTQ%|*hMq?f)5 zJn>=5_vcLhSDDlRAI>P#pJ;o#a>KxDm7;?+nXAy2-KE+;VbT>rzhb5|HEw)VcOh7- zoeps8YY(^FIyIr+`r3}w(S??aYnWLh>4GQqub(*B&;_{xkQ+`by+?sc?;z;>%n)ye zy58&o(e=M|4zfjqhW%@TyON!?t54{Jo=MLuzOiZD+AdnyaC8at9LRuFug!HF6bG}G zLePv7AMLakQwY9)+l*KC-)Z^#jvF5w%@FDem_CH?JN1rlY=RUv| z5Gg3YlT|Z*@%Q;r&W}2~za6JszJm-2(?f<}xTG0e)Gtyr%(Uf?_qwljIIcSV!`=$W zbF>vCe-9tF8$?IlZecbLw4n^?G}AJ7hwz#2=XN;bpFwy!#;>hN)bPU&!>!3d^z6*c}WA6$QJ0c%CENQbg@%WsQm^ z=kIYlT%L4O%v%ibSnZhm0EtykxU{CAwx97QA}*#sEf-xv3vD6cn*tSN3`Gq=e+{)y za_0lPTk`>OD08Dp2plbr3v{WXB@YpngP8&E;_imREY~Z)-Gm``=eOsB-Z`>F5C%F!pGZ;ZswGX@bW%!MwT8MrvF)^=+)c}kittBn+H5a|^C99~!a7=6D(}%YSNyWHerl zFyVX{6j_aAH1st~DCl})+)LHUpXqCNfCHcHZDXTv_yZZj0UNMUPT9paM4iJ?n4&0R z%zfVfARseLxg^k}Nqi~x^)X`MNPJFjYgxozzz|0axQ~v0YTbN8J)`UHq09?#_r7!d z_Me^AYT2d#d>@Q~55f1w^Q=Rb}GH*IMQv&GzXOtS?PpX5dl=;mGiki@I96;!)Tk^9n+}YS~q9am4 z_NvptJZb$hMYEANIcEN!JGM!Q>+0SNx^5O=S6-~p(QF)PZJDRK8l!sv07F$5^T@^` zv4taicVJcXG&FajJ3(0c(sm!-D>Yl;l%Uj;A@k;1hV6hTu;=~(1XTqG5ik+gmX)ll z0FpG0iG*ireFECKbVgvZ1Rxbuc&V?>h6vLRKGr6)1YJ_!eJ(rI+La83^1<#?TvTOW z^wDp0Ra5Q4Dqh!eVi@l5CD6iu&_%oZt&$w_)IQZz=f+-nSIpS@UmF-^m7<8yYcr66 z@#EI$tj6eNIW|qEp0t&ns|!U50~FV0dsfgDe~p7#C&5fv@g0#bH^Eh1wGt|v@?y{P zq(ldI>@0Pt<$;G#tyRO>7Uh|=AW-nfHWzYW@?*#WihD=AOaVh&MVFaVO38--B>Hyi*G8O9&Bvjf0h`GE6^O5 za?Qm9od;{XgS$Pue`XZ2NDV)qI}4h0c*8H z-U3BM2pF}ySe?nrw(ap4X>bKIQB{zchGtDD7Z^4V9a%Bw2>G z*nnrs1K==i;eRGmqs{0RG3x4~0G^c&%3kO%`T8DBUt@>hH9-tW0Y`5NykAmL@-URq zrAc$cA0;7=K8CEr(T^^lTS#_(5wBK3HN`$9t3LUA(rO=!D)2R2RkDbh3Q~KKL8ccD zC^>rRpr;!yMeFSSSG{_h3Yny*XKVA92asC9RMLpt4D>k+<%}LIp$v-q>gNFjHDI8| z8RzSKUDt8dodbnQW8SOppM{f|DDyoaT3+=FYjtu9_gCv?64*NKO|xLuVA4!{i-IiJ zLj0~O0EH{~)(A^=xZ9x_{Aq7#1?TcUMZC7mt^42`wiKT?sW#38v3%TZ@Midv8?i+n z%>u^rpp#JQcVxWpOdtrGwana0ONxae5W5C`@xUE?zHDy z8bD9@EXo4^SM^@=YMZlMqbWiGhZX{R5pYhJV?q?K5(HD02C(=ntGp$N^08|(3A#~t z|Awi!U-9Y(j!Gs?nLh+LP)W-g(s8Y27={-tjF5ttltFvWYKDf1D}z~7ppG4&UV~sf zRMiW>Bumutez-SEi`#9mS@VqZxaRJ6jJyGFxb> zPw}2@k67FnlOKH@2rzpQFSQkJa09K8lKD*WWdy4EbM0*$^E3Vzm)y;*ok9mnAP>8! zBo^01N(^j#rey%Z#Mso!9&y1al% zpkeX%tg4qD8i7DkGu`=BGt*a*QZZ$v+np))S7UpZ$5H_Yvpo$y6sbFmKM*?n?e{w9 zGi$;L&gyrIfxhmKFBpVoG$cqM>faGq+X=kx5O7<1c;dOp?0(c*PcutO==ztF{h;F( zBgw7LJv@v6w;zH%)0pd^_2B9eO>gJ|OVGA{^d8MhDb(^3UIr!^nZO29+^zO}?x=fd zq*_r&hiwxPJ;RBQ-!F-ekzrW2LkU2O>?XMy&(Ty>Hl>4?NN-sw{W>jeOi;;2 zTUK}JvdRme*99NgWjlw6&_6<0pa`r5prdcyTchIQA(8ezh$yT)a}UfdS2o}QPA!U` zEr!E{7gFua@qJ`LxRO~z2F0OPz7Z+pi4x$r!G>l~3chpqu`5R)3%}>Pv)8o<)Z2(r zksZ@Z!=Av2;6=sNfCT_+%#bxWT3(;W%+$v;@f*zrDTBobi4@M4dF*)vx3JtwA;zV zPZ^vD`2zcFua}*lnoke>9Ec$dI-D;LAh!x=PdS4XQb|+tOs{R8pA$Kna8&Ds4u`37 zfZ$KmzsS%qbP+bzrBX~z{(chzddV_$D)qMF=eB&R9atRTX!4c zSX|+Q5amh46Mb>$RPZcfndlaD^4C1KtxNEJ91LAJiAeAr{fPK7$TX4cm2`c#>TBqC zo&nHgm_h zjBcam%^a5gRxCS%C4*gaKq(qRjutww&+km?CA#KKng$ES8YMSP{7EoHJ}h9Hu0!gm zGf`8ew$34nG&eOki?i``J)Lb_|<2vy>1-nzKN z^q2P_n5UOr{C9FvN=MbK*%CV|%+&04h*$y+6IcJNI$ULWdmP>A(`ZQJ1$-~40r6Dt z>I}bg>7wi8X--%MI``8;QCjeR!#HXu_F+Ecg7km2V8=;v;8IKoD{`^f%GPx1cxE9Mm84bRgR$_Iza-Dn5HVtFcH zS92lQI;sae`|_lLth}f_vdjHO5QOW#6~jiuofhgB_rm9TA*`7npkR>jLZi@+Zfhn8 z$z^hWA6rM*FbR~9^eIhljZX5#SGVbLP5n4{+*{&}<6C&=itaZ+6)!b*Gg}nWKH*`meYHnC*VW_OwARXJY7SO0E{t7X-bu`~5pBH%K}y+y23z8tBKrQRDeJ0sbfk$?;iPK)JB;~Jky z(Z9Gn4&SEqGrsAzSK#TBZ(SyO6FUX64iVCM@!gvJ7e7C}m(+%2*Zzr-J7eiwY~x(z zGsby`gU0xvm6!t_9Vin2<+)bIgj!bQalrFnz?=j5I#Qoot&; zXv^m4yE!>yeTak92(frM8S&BXVkHDU&Gm`zBPYE15f0e%b)b>EARPpyjx`;YJHF`eif!>Ys`vHlNuU1D;B!; zUw_4be&qEGC!R$nU#x{C@DwLnDu;Hk$V@WSBh-Tf8OWJZ^D$cYL=c;4X&44{g#bCZ zuhsT!cfo4+>>dt^;ZT_gG`{$&$42VFSm)pGF9*JA8cu$Ak)QO}lse!2vTM$Wg*nm0(*nL3txGN)x`aJD3qX_x4zhR`O+|^e#BFpl8 zQZ~D(Yq5D8)pypC$z0_6lI6bN7$%SJ$b%d?2=dEqe5=+EFKVkIN8eviAD`@kEbk(a zMv&)Ao87C2`*xWkXSH`9n)-~roju!2jXuf<3q0PD11d6!$uAB4OpBi>`(7_p9?WZ& zy?oOzd@7vwXDV&Ry~lwfj|tH4F1Jo#<^nDju}m!dM(ZC3t<&b#>p47umP70-NB2Oi z@owp-?#>m=knq<}5eq((bx(OM;x7Jtk+bZMHj`g@_%Y>SO>@A7#!6(F$lT;0omec( z<5yXDi2}zNf23Yu$;bA~c+DF>5WxG?3y<_h_s**0o96kz>yWV@8a>BEr1+r8yg#+c z+}!MhWXrbssA48)%^CO&1er=Jy#{d$1h_D1<)vig%rJ>Q2R0S@Eyiyr);m(Wg?<;C zJUsmw-B#QEb(C|C;d9b+Z$g&_7LNl(ZaeyXF7njI-=hg%@4z+fO`v(N z-shGg4&kHiG7rY}I}IQqk9wngCth>9*2;#wBLA(;!kh1V$x*yw20HbY^mtH$K4YCT z+(*oJ-0KPKeYq_A$BDWlAV9wy(IKiFZiOF=vEVj7xTW_y_YL&Dwx{u1_p8DxFFwSs zfBuB}Jkz@t$pn8@hZy2-?|q&z65@##xV!h)iv3Qn7~1F1sp{=tzdO>Hu^y|Lw<)v% z`A_NN|E+=i-w7&&V7H8i;x$!b?*F%h^1lu*rr*4V>~d@^k=q+Q0oYCDfyVvvdzQif E5BA9DCIA2c literal 0 HcmV?d00001 diff --git a/src/GraphicalUI/main.cpp b/src/GraphicalUI/main.cpp index e04d72d..62eea41 100644 --- a/src/GraphicalUI/main.cpp +++ b/src/GraphicalUI/main.cpp @@ -10,11 +10,13 @@ [[nodiscard]] bool resetKeybindFile(int layout); -int main() { +int main(int arc, char** args) { std::srand(std::time(NULL)); bool everythingIsOK = true; + AssetManager::setExePath(args[0]); + // CHECK PIECES FILES PiecesFiles pf; diff --git a/src/Utils/AssetManager.cpp b/src/Utils/AssetManager.cpp index 0b12e94..f42da11 100644 --- a/src/Utils/AssetManager.cpp +++ b/src/Utils/AssetManager.cpp @@ -2,9 +2,20 @@ namespace fs = std::filesystem; -static std::string getEnv(const std::string& var) { +static fs::path EXE_DIRECTORY; + +void AssetManager::setExePath(const std::string& arg0) { + EXE_DIRECTORY = fs::path(arg0).parent_path(); +} + +static fs::path getEnv(const std::string& var) { char* env = std::getenv(var.c_str()); - return env ? env : ""; + return env ? env : +#ifdef JMINOS_IGNORE_WORKDIR + EXE_DIRECTORY.parent_path(); +#else + ""; +#endif } fs::path AssetManager::getResourcePath(const std::string& resource) { diff --git a/src/Utils/AssetManager.h b/src/Utils/AssetManager.h index ab36e94..8e8bdfc 100644 --- a/src/Utils/AssetManager.h +++ b/src/Utils/AssetManager.h @@ -15,4 +15,9 @@ class AssetManager { * @brief Used to save things */ static std::filesystem::path getConfigPath(const std::string& resource); + + /** + * @brief Set the current path of the executable + */ + static void setExePath(const std::string& arg0); }; \ No newline at end of file diff --git a/xmake.lua b/xmake.lua index a053819..3d4c59a 100644 --- a/xmake.lua +++ b/xmake.lua @@ -11,6 +11,7 @@ option_end() if has_config("external_build") then add_requires("sfml 3.0.0", "zlib", {system = false}) + add_defines("JMINOS_IGNORE_WORKDIR") else add_requires("sfml 3.0.0", "zlib") end @@ -52,7 +53,7 @@ if is_plat("mingw") then add_ldflags("-static-libstdc++", "-static") end -includes("./xpack.lua") +includes("xmake/xpack.lua") -- -- If you want to known more usage about xmake, please see https://xmake.io diff --git a/xpack.lua b/xmake/xpack.lua similarity index 64% rename from xpack.lua rename to xmake/xpack.lua index c000afc..8c654d5 100644 --- a/xpack.lua +++ b/xmake/xpack.lua @@ -10,24 +10,27 @@ xpack("jminos") set_company("org.zulianc") on_package(function (package) os.cd("flatpak") - os.exec("flatpak-builder --force-clean --user --install-deps-from=flathub --repo=repo --install builddir org.zulianc.jminos.yml") + os.exec("flatpak install org.flatpak.Builder --user -y") + os.exec("flatpak run org.flatpak.Builder --force-clean --user --install-deps-from=flathub --repo=repo --install builddir org.zulianc.jminos.yml") os.exec("flatpak build-bundle repo jminos.flatpak org.zulianc.jminos --runtime-repo=https://flathub.org/repo/flathub.flatpakrepo") os.mv("jminos.flatpak", package:outputdir()) end) + on_load(function (package) + package:set("basename", package:name() .. "-v" .. package:version() .. "-" .. package:arch()) + end) else xpack("jminos") - set_formats("zip") + set_formats("zip", "nsis") add_targets("graph") add_installfiles("(data/**.png)") - on_load(function (package) + set_iconfile("flatpak/org.zulianc.jminos.ico") + on_load(function (package) package:set("basename", package:name() .. "-v" .. package:version() .. "-" .. package:arch()) end) after_installcmd(function (package, batchcmds) - batchcmds:mv(path.join(package:installdir("bin"), "*"), package:installdir()) - batchcmds:rm(package:installdir("bin")) batchcmds:rm(package:installdir("**/.gitkeep")) end) -end \ No newline at end of file +end -- 2.49.1 From 94e5450a74c2d71fd9c36f0088bc7eb33ed9befb Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Tue, 29 Jul 2025 21:36:01 +0200 Subject: [PATCH 11/12] fix icon path --- xmake/xpack.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xmake/xpack.lua b/xmake/xpack.lua index 8c654d5..6f824c1 100644 --- a/xmake/xpack.lua +++ b/xmake/xpack.lua @@ -25,7 +25,7 @@ xpack("jminos") set_formats("zip", "nsis") add_targets("graph") add_installfiles("(data/**.png)") - set_iconfile("flatpak/org.zulianc.jminos.ico") + set_iconfile("../flatpak/org.zulianc.jminos.ico") on_load(function (package) package:set("basename", package:name() .. "-v" .. package:version() .. "-" .. package:arch()) end) -- 2.49.1 From a836dd31e27a7ec220376f4d4b05c9a9d40fc57e Mon Sep 17 00:00:00 2001 From: Persson-dev Date: Tue, 29 Jul 2025 21:36:18 +0200 Subject: [PATCH 12/12] fix exec path --- src/GraphicalUI/main.cpp | 2 -- src/Utils/AssetManager.cpp | 25 ++++++++++++++++++++----- src/Utils/AssetManager.h | 5 ----- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/src/GraphicalUI/main.cpp b/src/GraphicalUI/main.cpp index 62eea41..9a3c417 100644 --- a/src/GraphicalUI/main.cpp +++ b/src/GraphicalUI/main.cpp @@ -15,8 +15,6 @@ int main(int arc, char** args) { bool everythingIsOK = true; - AssetManager::setExePath(args[0]); - // CHECK PIECES FILES PiecesFiles pf; diff --git a/src/Utils/AssetManager.cpp b/src/Utils/AssetManager.cpp index f42da11..3baf127 100644 --- a/src/Utils/AssetManager.cpp +++ b/src/Utils/AssetManager.cpp @@ -1,18 +1,33 @@ #include "AssetManager.h" +#ifdef _WIN32 +#include //GetModuleFileNameW +#else +#include +#include //readlink +#endif + namespace fs = std::filesystem; -static fs::path EXE_DIRECTORY; - -void AssetManager::setExePath(const std::string& arg0) { - EXE_DIRECTORY = fs::path(arg0).parent_path(); +static fs::path getExeDirectory(){ + #ifdef _WIN32 + wchar_t path[MAX_PATH] = { 0 }; + GetModuleFileNameW(NULL, path, MAX_PATH); + return path; +#else + char result[PATH_MAX]; + ssize_t count = readlink("/proc/self/exe", result, PATH_MAX); + return std::string(result, (count > 0) ? count : 0); +#endif } + + static fs::path getEnv(const std::string& var) { char* env = std::getenv(var.c_str()); return env ? env : #ifdef JMINOS_IGNORE_WORKDIR - EXE_DIRECTORY.parent_path(); + getExeDirectory().parent_path().parent_path(); #else ""; #endif diff --git a/src/Utils/AssetManager.h b/src/Utils/AssetManager.h index 8e8bdfc..ab36e94 100644 --- a/src/Utils/AssetManager.h +++ b/src/Utils/AssetManager.h @@ -15,9 +15,4 @@ class AssetManager { * @brief Used to save things */ static std::filesystem::path getConfigPath(const std::string& resource); - - /** - * @brief Set the current path of the executable - */ - static void setExePath(const std::string& arg0); }; \ No newline at end of file -- 2.49.1