diff options
| author | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-02-11 02:37:39 -0600 |
|---|---|---|
| committer | SulfurNitride <SulfurNitride@users.noreply.github.com> | 2026-02-11 02:37:39 -0600 |
| commit | 7ee008e150bc5bcf76082d726f719ee0fdfda982 (patch) | |
| tree | 27fb39be241fdb5ac2734c574de678977d1856d0 /libs/tool_inibakery | |
Fluorine Manager: full Linux port of Mod Organizer 2
Complete native Linux port with FUSE-based virtual filesystem,
Proton/umu-run integration, and Flatpak packaging.
Key features:
- FUSE VFS replacing Windows USVFS (in-process + standalone helper for Flatpak)
- Proton/GE-Proton/umu-run launcher with env var forwarding
- Flatpak support (sandbox-aware VFS, NXM handler, umu-run)
- Wine prefix management UI
- Case-insensitive path resolution for Linux filesystems
- QSettings-safe INI handling (avoids Bethesda INI corruption)
- Portable instance support with auto-generated launcher scripts
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'libs/tool_inibakery')
| -rw-r--r-- | libs/tool_inibakery/.clang-format | 41 | ||||
| -rw-r--r-- | libs/tool_inibakery/.gitattributes | 7 | ||||
| -rw-r--r-- | libs/tool_inibakery/.gitignore | 5 | ||||
| -rw-r--r-- | libs/tool_inibakery/.pre-commit-config.yaml | 20 | ||||
| -rw-r--r-- | libs/tool_inibakery/CMakeLists.txt | 5 | ||||
| -rw-r--r-- | libs/tool_inibakery/CMakePresets.json | 60 | ||||
| -rw-r--r-- | libs/tool_inibakery/src/CMakeLists.txt | 13 | ||||
| -rw-r--r-- | libs/tool_inibakery/src/inibakery.cpp | 97 | ||||
| -rw-r--r-- | libs/tool_inibakery/src/inibakery.h | 58 | ||||
| -rw-r--r-- | libs/tool_inibakery/src/inibakery_en.ts | 17 | ||||
| -rw-r--r-- | libs/tool_inibakery/vcpkg.json | 15 |
11 files changed, 338 insertions, 0 deletions
diff --git a/libs/tool_inibakery/.clang-format b/libs/tool_inibakery/.clang-format new file mode 100644 index 0000000..6098e1f --- /dev/null +++ b/libs/tool_inibakery/.clang-format @@ -0,0 +1,41 @@ +--- +# We'll use defaults from the LLVM style, but with 4 columns indentation. +BasedOnStyle: LLVM +IndentWidth: 2 +--- +Language: Cpp +DeriveLineEnding: false +UseCRLF: true +DerivePointerAlignment: false +PointerAlignment: Left +AlignConsecutiveAssignments: true +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: Empty +AlwaysBreakTemplateDeclarations: Yes +AccessModifierOffset: -2 +AlignTrailingComments: true +SpacesBeforeTrailingComments: 2 +NamespaceIndentation: Inner +MaxEmptyLinesToKeep: 1 +BreakBeforeBraces: Custom +BraceWrapping: + AfterCaseLabel: false + AfterClass: true + AfterControlStatement: false + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterStruct: true + AfterUnion: true + AfterExternBlock: true + BeforeCatch: false + BeforeElse: false + BeforeLambdaBody: false + BeforeWhile: false + IndentBraces: false + SplitEmptyFunction: false + SplitEmptyRecord: false + SplitEmptyNamespace: true +ColumnLimit: 88 +ForEachMacros: ['Q_FOREACH', 'foreach'] diff --git a/libs/tool_inibakery/.gitattributes b/libs/tool_inibakery/.gitattributes new file mode 100644 index 0000000..f869712 --- /dev/null +++ b/libs/tool_inibakery/.gitattributes @@ -0,0 +1,7 @@ +# Set the default behavior, in case people don't have core.autocrlf set. +* text=auto + +# Explicitly declare text files you want to always be normalized and converted +# to native line endings on checkout. +*.cpp text eol=crlf +*.h text eol=crlf diff --git a/libs/tool_inibakery/.gitignore b/libs/tool_inibakery/.gitignore new file mode 100644 index 0000000..cf71be7 --- /dev/null +++ b/libs/tool_inibakery/.gitignore @@ -0,0 +1,5 @@ +edit +CMakeLists.txt.user +/msbuild.log +/*std*.log +/*build diff --git a/libs/tool_inibakery/.pre-commit-config.yaml b/libs/tool_inibakery/.pre-commit-config.yaml new file mode 100644 index 0000000..eb8969c --- /dev/null +++ b/libs/tool_inibakery/.pre-commit-config.yaml @@ -0,0 +1,20 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v6.0.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-merge-conflict + - id: check-case-conflict + - repo: https://github.com/pre-commit/mirrors-clang-format + rev: v21.1.8 + hooks: + - id: clang-format + 'types_or': [c++, c] + +ci: + autofix_commit_msg: "[pre-commit.ci] Auto fixes from pre-commit.com hooks." + autofix_prs: true + autoupdate_commit_msg: "[pre-commit.ci] Pre-commit autoupdate." + autoupdate_schedule: quarterly + submodules: false diff --git a/libs/tool_inibakery/CMakeLists.txt b/libs/tool_inibakery/CMakeLists.txt new file mode 100644 index 0000000..84f2257 --- /dev/null +++ b/libs/tool_inibakery/CMakeLists.txt @@ -0,0 +1,5 @@ +cmake_minimum_required(VERSION 3.16) + +project(inibakery) + +add_subdirectory(src) diff --git a/libs/tool_inibakery/CMakePresets.json b/libs/tool_inibakery/CMakePresets.json new file mode 100644 index 0000000..16e1e6f --- /dev/null +++ b/libs/tool_inibakery/CMakePresets.json @@ -0,0 +1,60 @@ +{ + "configurePresets": [ + { + "errors": { + "deprecated": true + }, + "hidden": true, + "name": "cmake-dev", + "warnings": { + "deprecated": true, + "dev": true + } + }, + { + "cacheVariables": { + "VCPKG_MANIFEST_NO_DEFAULT_FEATURES": { + "type": "BOOL", + "value": "ON" + } + }, + "toolchainFile": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake", + "hidden": true, + "name": "vcpkg" + }, + { + "hidden": true, + "inherits": ["vcpkg"], + "name": "vcpkg-dev" + }, + { + "binaryDir": "${sourceDir}/vsbuild", + "architecture": { + "strategy": "set", + "value": "x64" + }, + "cacheVariables": { + "CMAKE_CXX_FLAGS": "/EHsc /MP /W4", + "VCPKG_TARGET_TRIPLET": { + "type": "STRING", + "value": "x64-windows-static-md" + } + }, + "generator": "Visual Studio 17 2022", + "inherits": ["cmake-dev", "vcpkg-dev"], + "name": "vs2022-windows", + "toolset": "v143" + }, + { + "cacheVariables": { + "VCPKG_MANIFEST_FEATURES": { + "type": "STRING", + "value": "standalone" + } + }, + "inherits": "vs2022-windows", + "name": "vs2022-windows-standalone" + } + ], + "version": 4 +} diff --git a/libs/tool_inibakery/src/CMakeLists.txt b/libs/tool_inibakery/src/CMakeLists.txt new file mode 100644 index 0000000..533adef --- /dev/null +++ b/libs/tool_inibakery/src/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.16) + +file(GLOB inibakery_SOURCES CONFIGURE_DEPENDS + ${CMAKE_CURRENT_SOURCE_DIR}/*.cpp + ${CMAKE_CURRENT_SOURCE_DIR}/*.h + ${CMAKE_CURRENT_SOURCE_DIR}/*.ui + ${CMAKE_CURRENT_SOURCE_DIR}/*.qrc +) + +add_library(inibakery SHARED ${inibakery_SOURCES}) +mo2_configure_plugin(inibakery NO_SOURCES WARNINGS 4) +target_link_libraries(inibakery PRIVATE mo2::uibase) +mo2_install_plugin(inibakery) diff --git a/libs/tool_inibakery/src/inibakery.cpp b/libs/tool_inibakery/src/inibakery.cpp new file mode 100644 index 0000000..bb23492 --- /dev/null +++ b/libs/tool_inibakery/src/inibakery.cpp @@ -0,0 +1,97 @@ +#include "inibakery.h" + +#include <functional> + +#include <QCoreApplication> +#include <QFile> +#include <QStringList> +#include <QtPlugin> + +#include <uibase/game_features/bsainvalidation.h> +#include <uibase/game_features/igamefeatures.h> +#include <uibase/game_features/localsavegames.h> +#include <uibase/iplugingame.h> + +using namespace MOBase; + +bool IniBakery::init(MOBase::IOrganizer* moInfo) +{ + using namespace std::placeholders; + m_MOInfo = moInfo; + m_MOInfo->onAboutToRun([this](const auto& binary) { + return prepareIni(binary); + }); + + return true; +} + +QString IniBakery::name() const +{ + return "INI Bakery"; +} + +QString IniBakery::localizedName() const +{ + return tr("INI Bakery"); +} + +QString IniBakery::author() const +{ + return "Tannin"; +} + +QString IniBakery::description() const +{ + return tr("Manages game ini files"); +} + +MOBase::VersionInfo IniBakery::version() const +{ + return VersionInfo(0, 3, 0, VersionInfo::RELEASE_FINAL); +} + +QList<PluginSetting> IniBakery::settings() const +{ + return QList<PluginSetting>(); +} + +QStringList IniBakery::iniFileNames() const +{ + return m_MOInfo->managedGame()->iniFiles(); +} + +bool IniBakery::prepareIni(const QString&) +{ + const auto* features = m_MOInfo->gameFeatures(); + + auto savegames = features->gameFeature<MOBase::LocalSavegames>(); + if (savegames != nullptr) { + savegames->prepareProfile(m_MOInfo->profile().get()); + } + + auto invalidation = features->gameFeature<BSAInvalidation>(); + if (invalidation != nullptr) { + invalidation->prepareProfile(m_MOInfo->profile().get()); + } + + return true; +} + +MappingType IniBakery::mappings() const +{ + MappingType result; + + const IPluginGame* game = m_MOInfo->managedGame(); + + auto profile = m_MOInfo->profile(); + + if (profile->localSettingsEnabled()) { + for (const QString& iniFile : iniFileNames()) { + result.push_back({m_MOInfo->profilePath() + "/" + QFileInfo(iniFile).fileName(), + game->documentsDirectory().absoluteFilePath(iniFile), false, + false}); + } + } + + return result; +} diff --git a/libs/tool_inibakery/src/inibakery.h b/libs/tool_inibakery/src/inibakery.h new file mode 100644 index 0000000..21db29b --- /dev/null +++ b/libs/tool_inibakery/src/inibakery.h @@ -0,0 +1,58 @@ +/* +Mod Organizer ini bakery plugin + +Copyright (C) 2015 Sebastian Herbord. All rights reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 3 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +#pragma once + +#include <QList> +#include <QObject> +#include <QString> + +#include <uibase/iplugin.h> +#include <uibase/ipluginfilemapper.h> + +/** + * @brief The IniBakery class + */ +class IniBakery : public QObject, + public MOBase::IPlugin, + public MOBase::IPluginFileMapper +{ + Q_OBJECT + Q_INTERFACES(MOBase::IPlugin MOBase::IPluginFileMapper) + Q_PLUGIN_METADATA(IID "org.tannin.IniBakey") + +public: + virtual bool init(MOBase::IOrganizer* moInfo); + virtual QString name() const; + virtual QString localizedName() const; + virtual QString author() const; + virtual QString description() const; + virtual MOBase::VersionInfo version() const; + virtual QList<MOBase::PluginSetting> settings() const; + + virtual MappingType mappings() const; + +private: + QStringList iniFileNames() const; + bool prepareIni(const QString& executable); + +private: + MOBase::IOrganizer* m_MOInfo; +}; diff --git a/libs/tool_inibakery/src/inibakery_en.ts b/libs/tool_inibakery/src/inibakery_en.ts new file mode 100644 index 0000000..1617a0b --- /dev/null +++ b/libs/tool_inibakery/src/inibakery_en.ts @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="utf-8"?> +<!DOCTYPE TS> +<TS version="2.1" language="en_US"> +<context> + <name>IniBakery</name> + <message> + <location filename="inibakery.cpp" line="35"/> + <source>INI Bakery</source> + <translation type="unfinished"></translation> + </message> + <message> + <location filename="inibakery.cpp" line="45"/> + <source>Manages game ini files</source> + <translation type="unfinished"></translation> + </message> +</context> +</TS> diff --git a/libs/tool_inibakery/vcpkg.json b/libs/tool_inibakery/vcpkg.json new file mode 100644 index 0000000..486b0fd --- /dev/null +++ b/libs/tool_inibakery/vcpkg.json @@ -0,0 +1,15 @@ +{ + "features": { + "standalone": { + "description": "Build Standalone.", + "dependencies": ["mo2-cmake", "mo2-uibase"] + } + }, + "vcpkg-configuration": { + "default-registry": { + "kind": "git", + "repository": "https://github.com/ModOrganizer2/vcpkg-registry", + "baseline": "d194ec4e14052784518d5e9f1c5ccac16de49c2c" + } + } +} |
