| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Replace portable Python approach with python-build-standalone 3.12.13
(20260310 release) bundled directly in the distribution. Python is now
always available without user setup — removes the Python settings tab.
- PyQt6 staged to plugins/libs/PyQt6/ with bundled Qt stripped out;
patchelf'd to use our existing bundled Qt in lib/ instead of duplicating it.
- Restored native-converted plugins back to .py files:
Form43Checker, ScriptExtenderPluginChecker, DDSPreview, basic_games,
rootbuilder, installer_omod. Removed all *_native CMake targets.
- pythonrunner.cpp: removed venv/MO2_PYTHON_DIR lookup; always uses
bundled Python at <exe_dir>/python, system Python as last-resort fallback.
- plugincontainer.cpp: removed fluorine/python_enabled gate (Python always
loads), demoted proxy loading log messages from warn to debug, silenced
[plugin-diag] stderr spam.
- Dockerfile: switched from uv venv to PBS install_only tarball; PBS Python
used for both build-time pybind11 compilation and runtime distribution.
- build-inner.sh: aggressive Python staging (strip test/tkinter/ensurepip/
distutils/lib2to3/idlelib; wipe build-time site-packages, restore psutil+vdf).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Add icons.rs to nak crate: parses PE resource sections, extracts
RT_GROUP_ICON/RT_ICON and builds ICO files in memory
- Expose nak_extract_exe_icon() FFI for C++ consumption
- Update iconForExecutable() to use Rust FFI instead of shelling out
to wrestool; reads all ICO entries for correct color depth
- Fix BasicGamePlugin::gameIcon() to call iconForExecutable() (was
returning empty QIcon, causing placeholder icons for BG3/Cyberpunk)
- Move app icon setup: setDesktopFileName + setWindowIcon to
MOApplication constructor (fixes Wayland taskbar/decoration icon)
- Move data/com.fluorine.* to data/icons/, install to XDG paths at
launch for Wayland compositor icon resolution
- Remove icoutils dependency from Docker image and build output
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
| |
- Add find_package(Qt6) and qt_standard_project_setup() to installer_omod_native CMakeLists
- Remove duplicate default argument from fillStatForFile definition in mo2filesystem.cpp
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Add native plugins: form43_checker, script_extender_checker, preview_dds,
basic_games (75 game defs via IPluginProxy pattern with Steam/GOG detection)
- Remove portable Python from Dockerfile and build-inner.sh
- Add Python settings tab with venv support (system python3 + PyQt6)
- Skip loading plugin_python.so when Python disabled (default: off)
- Update pythonrunner.cpp to use venv at ~/.local/share/fluorine/python-venv/
- Preserve real file permissions in FUSE VFS (fixes native executable +x bits)
- Add FUSE_SET_ATTR_MODE handler so chmod works through VFS
- Fix desktop shortcut Exec= to use fluorine-manager launcher, not bare binary
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
New checkboxes in Edit Executables dialog:
- "Use Proton": controls whether the executable launches through Proton
(default on for backward compat). Disable for native Linux tools.
- "Open in terminal": launches the executable in a terminal window showing
stdout/stderr output, useful for debugging. Auto-detects terminal
emulator (konsole, gnome-terminal, alacritty, kitty, foot, xterm).
Terminal stays open after process exits showing the exit code.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
| |
QDir(path).rmdir(".") doesn't work on Linux — can't rmdir(".").
Use QDir().rmdir(path) to remove by absolute path instead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
Sort directories by path length descending (deepest first) before rmdir,
so leaf directories like NVSE/Plugins/Tweaks/INIs are removed before their
parents. The previous prepend approach didn't guarantee depth-first order.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
The previous implementation used Windows SHFileOperation semantics that don't
work on Linux: literal wildcard in paths, QFile::copy on directories,
absolutePath() instead of absoluteFilePath(), and GetLastError() for errors.
Rewrite moveOverwriteContentsTo() to recursively iterate all files, compute
relative paths, and move each file individually with cross-filesystem fallback.
Empty directories in overwrite are cleaned up after the move.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
self-destruct
- Remove initialScan() from mount and unmount — its heuristic ("file exists in
both overwrite and a mod") caused false-positive tracking of game-generated
config files. Tracking now only happens through explicit UI actions or
snapshot-based detectManualMoves().
- Prune stale tracked entries on load when mod folder no longer exists on disk.
- Store mod paths as relative (to JSON file parent) for instance portability;
legacy absolute paths auto-migrate on next save.
- Guard launcher sync against HERE==BIN_DST to prevent rm -rf self-destruct
when running directly from ~/.local/share/fluorine/bin/.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
FUSE passthrough caused Wine DLL loading failures (ERROR_NOACCESS 0x3E6)
for all file types, not just executables. Root cause is a kernel-level
incompatibility between FUSE passthrough I/O and Wine's file access
patterns. Removed all passthrough code, the passthrough helper binary,
libcap dependency, and the settings UI toggle.
Also removed flake.nix (unused with Docker build system) and stopped
tar.gz'ing the build output since GitHub zips release assets automatically.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
| |
Negotiating passthrough without the capability caused Wine/Proton DLL
loading failures (SKSE plugins returning error 0x36). Now checks the
process's effective capability set via libcap before telling the kernel
we want passthrough. Also adds qt.conf for AT_SECURE compatibility.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
patchelf can't modify a running binary. Now copies the binary to a
temp file, patches RPATH and applies setcap on the copy, then replaces
the original with mv.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
| |
glibc's ld.so ignores $ORIGIN in RPATH for capability binaries
(AT_SECURE mode), causing "cannot open shared object" errors.
Now patchelf rewrites RPATH to absolute paths before setcap runs,
both in the settings dialog and the auto-apply at mount time.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
Instead of prepending base ESMs to plugins.txt (wrong order), generate
plugins.txt from loadorder.txt with active/inactive markers from the
original plugins.txt. This ensures both files agree on plugin order.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
| |
MO2's plugins.txt omits implicitly-active base game ESMs — LOOT needs
every plugin listed to determine unambiguous load order. Now merges
entries from loadorder.txt that are missing from plugins.txt before
passing the files to LOOT.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
LOOT's AppImage bundles its own Qt — inheriting Fluorine's
QT_PLUGIN_PATH caused incompatible Qt plugin loading (exit code 6).
Also clean LD_LIBRARY_PATH when the original was empty.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Use fuse_passthrough_open/close API instead of raw fd assignment to
fi->backing_id, which caused EIO on every file open through the VFS
- Remove LD_LIBRARY_PATH from launcher script — DT_RPATH handles lib
resolution, and LD_LIBRARY_PATH triggers AT_SECURE which drops file
capabilities (cap_sys_admin) needed for passthrough
- Auto-detect missing cap_sys_admin at mount time and prompt via pkexec
to re-apply it (handles binary copy/update/extract losing the cap)
- Disable passthrough for session if fuse_passthrough_open fails, avoiding
"Operation not permitted" spam in terminal
- Fix Nix flake: tinyxml2 → tinyxml-2, xorg.lib* → top-level names
- CI: eliminate artifact zip round-trip for GitHub releases
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
- FUSE: disable AUTO_INVAL_DATA, enable readdirplus, 24h TTLs, clone_fd,
FUSE_USE_VERSION=312 — cuts game load time from 2:40 to 1:57
- Fix tracked writes going to wrong (lower-priority) mod in both
detectManualMoves and syncOverwrite
- Remove steam-run entirely (UI, C++, Rust layers)
- Build system: default to tarball, add installer/appimage as opt-in modes
- Add flake.nix for NixOS — builds from source with Rust crates as
separate pure derivations, FHS wrapper, NixOS module with FUSE passthrough
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
| |
When users move generated files (logs, INIs) from Overwrite into a
dedicated mod folder, future VFS writes to those files now go directly
to the mod instead of creating duplicates in Overwrite. Tracking
persists across sessions via a JSON file and detects manual moves
by comparing overwrite snapshots between sessions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
Mod .ini/.log files now stay in their original mod folder instead of
being copied to Overwrite. All files pass through reads and writes
to their real location. No copy-on-write needed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
Defer COW from open() to first write(). Wine/Proton opens mod files
O_RDWR for metadata ops (SetFileTime, etc.) without actually writing,
which was copying SKSE plugin .ini/.log files into Overwrite needlessly.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
| |
Parse PE resources to extract the largest embedded icon from Windows
executables and save as PNG to ~/.local/share/icons/fluorine/. If a
cached icon is just the Fluorine fallback (same file size), re-attempt
extraction in case the executable changed or was previously unavailable.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
LOOT sort fix: For PluginsTxt games (FO4, SkyrimSE), LOOT only modifies
plugins.txt, not loadorder.txt. Previously the stale loadorder.txt was
copied back, causing readPluginLists() to use the old order. Now we
regenerate loadorder.txt from the sorted plugins.txt.
Desktop shortcuts: Add "Application Launcher" option on Linux that creates
.desktop entries in ~/.local/share/applications/. Include instance name in
both filename (New-Vegas-NVSE.desktop) and Name= field (NVSE (New Vegas))
to avoid collisions. Icons saved to ~/.local/share/icons/fluorine/ with
game-specific names.
Browse VFS: Add button in Data tab that mounts the FUSE VFS and opens the
game Data folder in the system file manager, allowing users to browse the
merged mod files as the game sees them.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
| |
bsplugins, fix bsatk types
- Remove FUSE passthrough code: requesting FUSE_CAP_PASSTHROUGH without
CAP_SYS_ADMIN caused session cleanup crash on shutdown
- Remove bsplugins library (unneeded port)
- Fix bsatk: use uint32_t instead of unsigned long for BSAULong (LP64 compat)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
- Increase ATTR_CACHE_SECONDS from 1.0s to 30.0s (90% getattr reduction)
- Replace nuclear clearDirCache() with selective invalidateDirCache() that
only clears the affected parent directory instead of all caches
- Add mo2_init callback: enable FUSE_CAP_AUTO_INVAL_DATA for kernel page
cache retention across open/close, increase max_readahead/max_write to 1MB
- Switch open_files_mutex to shared_mutex for concurrent read access
- Add perf handoff doc for VFS optimization history
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Fix LOOT sorted order not applying: prefer Plugins.txt (capital P) over
our pre-deployed plugins.txt (lowercase) since LOOT writes capital P on
Linux case-sensitive FS. Same for Loadorder.txt.
- Force plugin list refresh after LOOT sort (refreshESPList(true))
- Remove Start Menu shortcut option on Linux (no-op, Windows-only concept)
- Implement .desktop file creation for Desktop shortcuts on Linux:
- Use $APPIMAGE env var for stable executable path (not ephemeral mount)
- Quote paths with spaces in Exec line
- Use absolute instance directory path for portable instances
- Install Fluorine icon to ~/.local/share/icons/ for persistence
- Skip .exe icons (can't render on Linux)
- Fix moshortcut:// instance matching for portable instances using abs paths
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
pollution
- Fix VFS files/dirs showing 1969 dates (separate error codes for mtime, set dir timestamps)
- Add stampPluginTimestamps() for FileTime games (FalloutNV/FO3/Oblivion) so LOOT sees correct load order
- Fix LOOT masterlist URL (v0.21 → v0.26) and point local_path to Fluorine prefix AppData
- Capture FileTime-based load order from VFS timestamps before unmount
- Handle Plugins.txt case sensitivity on Linux (LOOT writes capital P)
- Skip loadorder.txt copy-back for FileTime games to preserve sorted order
- Prevent LOOT COW'd plugins from polluting overwrite (discardStagingOnUnmount flag)
- Update mo2_setattr to modify VFS tree mtime in-place without triggering COW
- VFS perf: replace fs::relative() with fast string prefix strip, cache clock offset, parallel mod scanning
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- Download LOOT AppImage from GitHub releases on first sort
- Pre-seed LOOT settings.toml with game type, path, and masterlist URL
- Mount FUSE VFS before launching LOOT, unmount after exit
- Copy plugins.txt/loadorder.txt to LOOT local path and back
- Fix VFS file timestamps (separate error_code for mtime)
- Add directory timestamps to FUSE (was showing 1969)
- Stamp plugin files with load-order-based incrementing timestamps
- Remove WebEngine dependency on Linux (QTextBrowser fallback)
- Enable LOOT sorting for FalloutNV and FalloutTTW
- Add unmountVFS() to OrganizerCore
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
| |
Overwrites were loading just after base files before mods themselves,
meaning mods will overwrite everything in overwrites (which contradicts
purpose of overwrites folder).
|
| |
|
|
|
|
|
|
|
| |
- Switch VFS timing logs from log::info() to fprintf(stderr) so they
always appear in terminal regardless of configured log level
- Filter noisy Wine/Proton stderr output (GStreamer warnings,
ProtonFixes info, RADV conformance, MangoHud, NTSync messages)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Log timing for each phase of VFS setup and teardown at info level:
- Base game file scan (fresh vs cached)
- VFS tree build (file/dir counts)
- External mapping deployment (symlink/file counts)
- FUSE mount (total)
- Staging flush on unmount
- Full unmount
- updateMapping total
- Post-run permission restore
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
In rare cases (crashes, unclean Wine shutdown), game files can end up
read-only. As a precaution, restore owner rwx permissions on all files
in the game directory after every run, right after FUSE unmount.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Two fixes:
1. copyOnWrite() preserves source file permissions via fs::copy_file().
If the source was read-only (Steam game files, Windows mod archives),
the staging copy was also read-only, causing writes to fail with
EACCES. Now adds owner_write permission after copying.
2. createTarget from the saves mapping (which targets __MO_Saves in
My Games, not the Data dir) was incorrectly setting m_customOutputDir,
causing ALL VFS staging files to flush to the profile saves directory
instead of overwrite. Now only data-dir mappings can set the custom
output directory.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
findWineserver() was scanning /proc for ANY wineserver owned by the
current user. If the user had other wine processes running (e.g. winecfg
under ~/.wine), Fluorine would latch onto that unrelated wineserver and
never declare the game finished.
Now reads WINEPREFIX from the launched process's /proc/<pid>/environ and
passes it to findWineserver(), which filters candidates by matching
their WINEPREFIX against the game's prefix path.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
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 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>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- 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>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- 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>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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 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 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>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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>
|