aboutsummaryrefslogtreecommitdiff
path: root/src
Commit message (Collapse)AuthorAgeFilesLines
...
* Fix saves tab showing profile-specific saves when feature is disabledSulfurNitride2026-02-281-1/+1
| | | | | | | | When local saves is off but the game INI still has a stale sLocalSavePath=__MO_Saves\, ignore it and fall back to the default saves directory instead of following the redirect. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix modlist column visibility not persisting across relaunchesSulfurNitride2026-02-271-1/+6
| | | | | | | | | | The restoreState() method restored the header state (column visibility) before restoring the groupBy combo index. Changing the groupBy triggers updateGroupByProxy() which swaps the sort proxy's source model, resetting the header and showing all columns. Fix by restoring groupBy first so the model chain is stable when header state is applied. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix SVG icons and checkboxes: bundle qt6-svg-pluginsSulfurNitride2026-02-2710-0/+126
| | | | | | | | | | The AppImage was missing libqsvg.so (Qt SVG imageformat plugin), causing SVG-based theme icons and checkboxes to render as blank squares. Add qt6-svg-dev and qt6-svg-plugins to the Docker image. Also add explicit unchecked checkbox images to all vs15 Dark themes for consistent rendering on Linux. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix DownloadManager::stateChanged signal connectionSulfurNitride2026-02-271-1/+1
| | | | | | | | | The old-style SIGNAL() macro had the wrong signature: stateChanged(int,int) instead of stateChanged(int,DownloadManager::DownloadState). This caused Qt to silently fail the connection, meaning the download list view never updated when download state changed. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix NXM handler: use absolute path in desktop file Exec lineSulfurNitride2026-02-271-1/+3
| | | | | | | | | | | The desktop file used a bare command name (mo2-nxm-handler) which relies on ~/.local/bin being in PATH. When the browser or desktop environment invokes the URL scheme handler, ~/.local/bin is often not in PATH, so the handler silently fails. Use the full absolute path to the wrapper script instead. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix NXM handler for AppImage: use stable executable pathSulfurNitride2026-02-271-1/+10
| | | | | | | | | | | | | | | The NXM handler wrapper script was using QCoreApplication::applicationFilePath() which returns the temporary FUSE mount path for AppImages (/tmp/.mount_FluoriXXXXXX/...). This path changes every launch and doesn't exist when the AppImage isn't running, breaking NXM downloads from Nexus. Now uses the APPIMAGE env var (the actual .AppImage file path on disk) which is stable across launches and always accessible. Fixes #20 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix process tracking for Wine/Proton game processesSulfurNitride2026-02-272-11/+72
| | | | | | | | | | | | | | | | | | | Process tracking failed with Proton-GE because launcher executables (nvse_loader.exe, skse_loader.exe) exit after spawning the actual game (FalloutNV.exe, SkyrimSE.exe). The tracker saw the launcher exit and declared the game done, unmounting VFS while the game was still running. Fix: when the tracked process exits, fall back to waiting for wineserver which stays alive as long as ANY wine process in the prefix is running. This is the most robust way to detect when a game has truly exited, regardless of how many launcher layers are involved. Also: - Use "waitforexitandrun" proton verb instead of "run" (matches umu) - Reduce process tracking log spam (log once on first find, not every 50ms poll cycle) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix process tracking for Wine/Proton game processesSulfurNitride2026-02-251-7/+61
| | | | | | | | | | | | | | | | | | findTrackedProcess was only checking /proc/<pid>/comm to match game executables. This fails for Wine/Proton because: 1. /proc/comm is truncated to 15 chars (TASK_COMM_LEN), so "FalloutNVLauncher.exe" becomes "FalloutNVLaunch" — no match 2. Wine processes show "wine64-preloader" or "start.exe" in comm, not the actual game executable name 3. With UMU_ID set, Proton-GE launches via "start.exe /unix <game>" adding another indirection layer Now also checks /proc/<pid>/cmdline which contains the full untruncated command line including the game .exe path. Handles both Windows-style backslash paths (c:\...\game.exe) and Unix paths. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix non-Steam game launch: skip steam bridge, fix process trackingSulfurNitride2026-02-252-8/+43
| | | | | | | | | | | | | | Set UMU_ID=fluorine when Steam DRM is disabled so Proton-GE launches the game directly instead of through steam.exe (which asserts for non-Steam executables like GOG games). Fix VFS premature shutdown by tracking the game PID across process reparenting. When the proton root process exits, wine/game processes get reparented to PID 1 and disappear from the descendant tree. Now we remember the tracked game PID and poll it directly, keeping VFS mounted until the actual game exits. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Remove umu-run, keep game as child process for Steam trackingSulfurNitride2026-02-239-309/+62
| | | | | | | | | | | | | | | - Remove umu-run entirely (crashed due to pressure-vessel/FUSE incompatibility) — use raw `proton run` instead - Replace startDetached() with QProcess::start() so the game stays in Fluorine's process tree. This lets Steam track the game lifetime and makes the "close game" button work when Fluorine is added as a non-Steam game. - Add writeIniValueDirect/readIniValueDirect for safe Bethesda INI handling without QSettings corruption - Fix prefix_setup.rs to skip umu-run bootstrapping - Clean up settings UI, build scripts, and docs for umu-run removal Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix AppImage plugin loading, save timestamps, and INI corruptionSulfurNitride2026-02-2013-1210/+1427
| | | | | | | | | | | | | | | | | | - Add AppConfig::pluginsPath()/dllsPath() that respect MO2_PLUGINS_DIR and MO2_DLLS_DIR env vars, fixing plugin discovery when plugins live inside read-only AppImage squashfs (#22, game plugin not found errors) - Preserve file modification times in save deploy/sync so games display correct save timestamps instead of all showing the same time (#17) - Replace QSettings INI reader in saves tab with direct line-by-line parser to avoid backslash-as-line-continuation corruption of sLocalSavePath=__MO_Saves\ (#22, saves tab showing wrong directory) - Add diagnostic logging to plugin symlink creation, save backup/restore operations to help diagnose silent failures through prefix symlinks - Fix Python SONAME mismatch in AppImage build (patch portable Python SONAME to match librunner.so DT_NEEDED, preventing dual libpython load) - Bundle PyQt6 Qt dependencies, improve RPATH for lib/ and plugins/ Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add Python init diagnostics, AppImage build system, misc Linux fixesSulfurNitride2026-02-1935-1679/+641
| | | | | | | | | | | | | | | | | | | | - python: switch Py_InitializeEx → Py_InitializeFromConfig for explicit error reporting; add dladdr + fprintf diagnostics to trace which DSO Python symbols resolve to and whether Py_IsInitialized succeeds - python: log RTLD_NOLOAD vs fresh-load outcome when promoting libpython to RTLD_GLOBAL - build: add Docker-based AppImage build script (build.sh), update Dockerfile and build-inner.sh for AppImage-only workflow - build: remove Flatpak support entirely; move AppImage metadata (desktop/metainfo/icon) from flatpak/ to data/ - Add Monster Hunter Wilds basic_games plugin - .gitignore: exclude squashfs-root, build-source, flatpak-repo, __pycache__, fomod-plus-settings.ini - Various Linux port fixes across wineprefix, processrunner, proton launcher, FUSE connector, instance manager, download manager, sanitychecks, and NaK Rust paths/runtime_wrap Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
* Fix save deploy/sync for non-Bethesda games using Saved Games directorySulfurNitride2026-02-183-101/+145
| | | | | | | | | | | | | | | | | Games like Cyberpunk 2077 store saves in %USERPROFILE%/Saved Games/ instead of Documents/My Games/.../Saves. The save pipeline previously hardcoded Documents/My Games as the base path, so profile-specific saves never reached the correct location. Replace relative save path resolution with absolute path resolution that extracts the user-relative portion from LocalSavegames::mappings() or savesDirectory() and reconstructs it under the Fluorine prefix. Update restoreStaleBackups to scan the entire prefix for backup dirs. Remove "Saved Games" from NaK symlink skip list. Fixes #17 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Log Wine prefix plugin/INI paths at startup, fix noisy mergeTweak warningSulfurNitride2026-02-182-1/+15
| | | | | | | | | | - Log the resolved AppData/Local plugins dir and Documents/My Games INI dir at launch so users can verify correct paths in the terminal - Downgrade mergeTweak warning for missing profile_tweaks.ini to debug level since this file is optional and only exists if the user creates profile-level INI tweaks Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix Wine prefix deployment, INI handling, and data directory pathsSulfurNitride2026-02-1729-152/+1124
| | | | | | | | | | | | | | | | | | | | - Fix data directory path to use ~/.var/app/com.fluorine.manager consistently (was ~/.local/share/fluorine in committed code) - Fix VFS helper path in fuseconnector.cpp to use fluorineDataDir() - Fix localAppFolder() to resolve Wine prefix AppData/Local on Linux instead of returning XDG ~/.local/share - Add localAppName() virtual method for correct AppData folder mapping (Enderal→"enderal", Nehrim→"Oblivion") - Fix mergeTweak() to use direct INI parser instead of QSettings which corrupts backslashes and URL-encodes spaces in keys - Make resolveWineDataDirName() more robust with existence checks and fallback chain (documentsDirectory → gameShortName → gameName) - Add comprehensive debug logging throughout Wine prefix deployment - Fix INI case handling: copy instead of symlink for case-mismatched INIs, ensure both proper-case and lowercase aliases exist - Remove native build script (Flatpak only) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix FUSE VFS reporting wrong timestamps on save filesSulfurNitride2026-02-161-2/+41
| | | | | | | | | | | | | | | Three issues caused all save files to show the same date (the session start time), breaking Starfield's "Continue" mechanism: 1. setattr ignored FUSE_SET_ATTR_MTIME — Wine's SetFileTime() calls (utimensat) were silently dropped, so games couldn't set timestamps 2. TTL_SECONDS was 365 days — kernel cached stale attrs and never re-queried FUSE even after writes updated the real file 3. mo2_rename replaced mtime with now() instead of preserving it Fixes #16 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Replace Python build deps with uv across all build pathsSulfurNitride2026-02-151-5/+24
| | | | | | | | | | | | | | | | | Use uv as the single Python package manager for Docker, source, and Flatpak builds. Python 3.13 and pybind11==2.13.6 are now consistent across all three paths. - Docker: install uv + build venv instead of python3-dev/pip/pybind11-dev - CMake: bootstrap pyvenv with uv (REQUIRED/FATAL_ERROR) when no explicit Python provided; pin pybind11==2.13.6, add sip - Flatpak: remove pybind11 cmake module, use uv pip install --target for build deps, uv for portable Python packages - build-inner.sh: use BUILD_PY throughout, uv pip install for portable runtime packages, simplify embed check to direct Python invocation - VFS helper: fall back to shared libfuse3 when static .a unavailable Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fix system umu-run detection finding bundled copy insteadSulfurNitride2026-02-151-3/+19
| | | | | | | | | The launcher script prepends the app directory to PATH, so QStandardPaths::findExecutable found the bundled umu-run as the "system" one. Now explicitly filters out the app directory when searching PATH for a true system-installed umu-run. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Merge pull request #11 from RevengeRip/mainSulfurNitride2026-02-151-0/+1
|\ | | | | Thanks! Standard fix for Wayland icon association.
| * Fix generic Wayland iconOleg2026-02-151-0/+1
| |
* | Fix RPATH, absolute instance paths, Proton symlink matching, umu-run ↵SulfurNitride2026-02-152-0/+6
|/ | | | | | | | | | | | | | | | logging, pybind11 warning - Set $ORIGIN-relative RPATH on binaries so they find libs without LD_LIBRARY_PATH (fixes #12) - Check QDir::isAbsolutePath before concatenating instance paths to prevent doubling of custom portable paths - Canonicalize paths when matching Proton installations to handle symlinks in /usr/share/steam/compatibilitytools.d/ (fixes #8) - Add diagnostic logging for umu-run resolution showing preference, bundled/system paths, and final selection (helps diagnose #8) - Warn at CMake time if pybind11 >= 2.14 is detected (documents #9) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Migrate data paths to ~/.local/share/fluorine/, add native build, fix ↵SulfurNitride2026-02-1447-513/+728
| | | | | | | | | | | | | | | | | | | | | | | | %command% and system Proton scanning - All data paths migrated from ~/.var/app/com.fluorine.manager/ to ~/.local/share/fluorine/ so native and Flatpak builds share the same instances, plugins, and configs - New fluorinepaths.h/.cpp with fluorineDataDir() helper and one-time migration from old path (writes MOVED.txt breadcrumb) - New libs/nak/src/paths.rs as Rust equivalent (data_dir()) - Strip %command% tokens from launch wrapper in protonlauncher.cpp - Always scan /usr/share/steam/compatibilitytools.d/ for system Proton packages (Arch installs Proton there); add Flatpak filesystem permission - Native build (build-native.sh) installs to ~/.local/share/fluorine/ with desktop entry and ~/.local/bin symlink instead of portable zip - build-flatpak.sh wrapper for Flatpak builds - Fix container locale (LANG=C.UTF-8) for AutoUic warnings - Fix prefixExists() to handle both compatdata and pfx directory layouts - Fix globalInstancesRootPath() to use fluorineDataDir() on Linux - Fix umu-run Flatpak lookup to use fluorineDataDir() - Update README with build instructions and Arch dependency list Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add FUSE external mapping support, BG3/Oblivion Remastered fixes, fomod-plus ↵SulfurNitride2026-02-1425-624/+1318
| | | | | | | | | | | | | | | and NaK integration FUSE VFS now deploys non-data-dir mod mappings (Paks, OBSE, UE4SS, etc.) via real symlinks and injects file-level data-dir mappings (plugins.txt, loadorder.txt) into the VFS tree. Fixes game launches for Oblivion Remastered (Root Builder path resolution, script extender support) and BG3 (Wine prefix documents directory, file mapper symlinks on Linux). Vendors mo2-fomod-plus plugin and NaK crate for FOMOD installer and game finder/runtime support. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add Root Builder plugin, Linux game detection, and OMOD installer fixSulfurNitride2026-02-1121-233/+1460
| | | | | | | | | | | | | | | | | | | | | - New native Root Builder plugin (src/plugins/rootbuilder.py) with copy and symlink deploy modes, auto-deploy hooks, backup/restore, and third-party conflict detection that moves incompatible plugins to DisabledPlugins/. In link mode, .exe/.dll are always copied to avoid Wine/Proton path resolution issues with symlinked executables. - Fix basic_games detection on Linux: steam_utils now checks native Steam paths (~/.local/share/Steam, Flatpak, Snap), epic_utils uses correct Linux Heroic config paths, gog_utils falls back to Heroic GOG installed.json when Windows registry is unavailable. - Fix OMOD installer crash: isArchiveSupported now handles both IFileTree (from mod list refresh) and string (from install check) arguments. - Add flatpak manifest step to copy source-tree Python plugins (src/plugins/*.py) into the build output. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Fluorine Manager: full Linux port of Mod Organizer 2SulfurNitride2026-02-11604-0/+135871
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>