| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The sort button was already hidden on Linux (setVisible(false)) and
the LOOT feedback path (LootDialog -> addLootReport) has always been
Windows-only, meaning the dirty/incompatibilities/missingMasters/messages
tooltip bullets and the dirty-plugin icon could never fire on Linux.
MO2 shipped lootcli + libloot for a load-order sort mechanism that was
unreachable from the UI.
Users who want LOOT can download it from https://github.com/loot/loot
and run it against their instance directly.
- Drop libs/lootcli/, libloot Dockerfile build step, and lootcli
staging/patchelf in build-inner.sh
- Drop src/src/loot.{cpp,h}, src/src/lootdialog.{cpp,h,ui}
- Extract MarkdownDocument / MarkdownPage (used by UpdateDialog for its
changelog view) into src/src/markdowndocument.{h,cpp}
- Strip addLootReport, makeLootTooltip, Loot::Plugin field, LOOT icon
checks, and LOOT tooltip/isProblematic/hasInfo paths from pluginlist
- Delete sortButton widget, updateSortButton(), onSortButtonClicked(),
and all m_didUpdateMasterList wiring
- Delete lootLogLevel setting, combo box, and "Integrated LOOT" group
from the diagnostics settings tab
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The Linux port uses its own in-process FUSE VFS (FuseConnector), so
usvfs was dead weight: libs/usvfs/ was never built, usvfsconnector.cpp
was explicitly REMOVE_ITEM'd from the source list, and every call site
was already guarded by #ifdef _WIN32 with a working Linux branch (the
Windows build is also broken on this branch, since FUSE3 is a hard
find_package dependency).
- Drop libs/usvfs/ and src/src/usvfsconnector.{cpp,h}
- Collapse #ifdef _WIN32 / usvfs include branches in organizercore,
mainwindow, settings, util, spawn
- Remove getUsvfsVersionString() and the "usvfs: ..." log field
- Remove vfs32/64DLLName APPPARAMs (nothing reads them)
- Relabel About dialog "usvfs:" row to "VFS: FUSE 3"
|
| |
|
|
|
|
|
|
|
|
|
| |
backslash
The checkGameRegistryKey map still had "Installed Path" (capitalized) and
the winePath was missing the trailing backslash. When the user clicked "Yes"
on the mismatch dialog it would overwrite the correct lowercase key with
the wrong casing and strip the trailing separator.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
| |
Wine registry value names are case-sensitive. Game launchers (FNV, Oblivion,
etc.) look up "installed path" (lowercase) but Fluorine was writing
"Installed Path" (capitalized), causing "Unable to find an INI file" errors.
Also adds trailing backslash to match Steam's path format and fixes the
registry mismatch dialog to ignore trailing separator differences.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
xEdit (and similar tools) rename game files to create backups before
saving (e.g. DLCHorseArmor.esp -> TES4Edit Backups/...backup...).
OverwriteManager::rename() only searches staging and overwrite
directories, so renames of backing (game) or mod files failed with
EACCES since those files live in the real game/mod directories.
Now when OverwriteManager::rename() can't find the source file, the
VFS copies it to staging at the destination path via COW instead of
failing. The file disappears from its old path and appears at the new
path in the virtual view, without modifying the real game/mod dirs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
| |
The readyRead handler consumed data via readAll() but discarded it when
no destination file was set. The final readAll() then returned empty
since the buffer was already drained, causing all in-memory HTTP
responses (like BUILD_ID.txt) to appear empty.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
| |
- FO4VR: Add Daytripper4.dll to ESL support detection
- Remove empty categories tooltip when mod has no categories
- Fix QDialogButtonBox/QMessageBox enum mismatch in profile dialogs
- Use refreshESPList(false) after LOOT sort (no full re-read needed)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Wine uses renameat2(RENAME_NOREPLACE) when translating MoveFileW() calls
where ReplaceIfExists is FALSE (e.g. xEdit saving plugins). The VFS was
rejecting all non-zero flags with EINVAL, which a real filesystem like
ext4 handles correctly. This caused "Could not rename" errors in xEdit
and similar tools.
Now properly handles RENAME_NOREPLACE: checks if the destination exists
in the VFS tree and returns EEXIST (matching ext4 behavior), otherwise
proceeds with the rename. Adds diagnostic logging on EACCES failures.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Replace NaK Rust crate and nak_ffi with native C++ implementations:
- Game detection (Steam, Heroic, Bottles), VDF parser, icon extraction
- Prefix symlinks, SLR manager, Steam path detection
- Known games database
Add FUSE VFS optimizations: zero-copy reads via fuse_reply_data,
default_permissions mount option, FUSE_CAP_ASYNC_DIO, FUSE_CAP_EXPIRE_ONLY,
lookup cache parent index, cached mode bits, increased I/O buffer sizes.
Update build system, prefix setup, and various fixes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
XDG_RUNTIME_DIR may point to a read-only location on Steam Deck
(SteamOS has a read-only root filesystem). Use ~/.local/share/fluorine/tmp/
instead, which is always writable.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
| |
XDG_RUNTIME_DIR may point to a non-existent path on some
configurations, causing QLocalServer::listen to fail with
"Name error". Ensure the parent directory exists before
attempting to create the socket.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
| |
ENOENT from process execution was always shown as "No Wine Prefix"
when useProton was set, even when the prefix was properly configured.
Now checks FluorineConfig::isSetup() first — if the prefix exists,
falls through to the generic spawnFailed dialog which shows the
actual missing binary path.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
- Add inode→VfsNode* cache to skip splitPath + full tree walks on
lookup/getattr/open (O(1) hash lookup instead of tree traversal)
- Combine canonicalChildName + snapshotForPath into single lookupChild
function (one tree lock, one parent resolution, one child hash probe)
- Add userspace lookup cache keyed by (parent_ino, normalized_name) to
absorb Wine's case-variant probes that bypass the kernel FUSE dcache
- Add mo2_access handler to avoid kernel fallback to lookup+getattr
- Invalidate all caches correctly on tree mutations (create/unlink/rename/mkdir)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
| |
- Merge all DirectX June 2010 extractions into single "DirectX Runtimes"
step (d3dcompiler_42/43/47, d3dx9, d3dx10, d3dx11_42/43, xinput, xact)
- Merge .NET 6/7/8/9 runtimes into single "NET Runtimes (6-9)" step
- Replace .NET 9 SDK with .NET 9 Runtime (9.0.14)
- Add .NET 10 SDK (10.0.201)
- Remove .NET Desktop Runtime 10
- Add xinput, d3dcompiler_42, d3dx10, d3dx11_42 extractions
- Move .NET Desktop Runtime 6 before runtime installs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Direct DLL extraction and installer execution instead of shelling out
to winetricks for all prefix dependencies. Fixes d3dcompiler_47 being
sourced from wrong SDK cabs (broke CommunityShaders), and eliminates
the fragile cabextract-in-pressure-vessel PATH issue.
- d3dcompiler_47: direct download from Mozilla fxc2 repo
- d3dcompiler_43, d3dx9, d3dx11_43: cabextract from DirectX June 2010
redist with correct system32/syswow64 mapping
- xact/xact_x64: cab extraction + batched regsvr32 registration
- vcrun2022: direct installer with msvcp140.dll workaround (Wine #57518)
- dotnet6/7/8, dotnetdesktop6: direct x86+x64 installer pairs
- Game detection: batched into single .reg file import
- All DLL overrides added to WINE_SETTINGS_REG
- SHA256 verification for downloaded files
- Winetricks kept only for win11 mode step
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
Handle modl:// links alongside nxm:// for downloading mods from
mod.pub. mod.pub uses a different URL format than Nexus — the download
URL is embedded as a query parameter: modl://game/?url=<encoded-url>
- Register x-scheme-handler/modl in desktop files and MIME lists
- Accept both nxm and modl schemes in URL parsing (NxmLink, NXMUrl)
- Parse modl:// direct download links and route to startDownloadURLs
- Make key/expires optional in NxmLink::parse (not used by mod.pub)
- Add debug logging for received URLs to aid troubleshooting
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Move Wine prefix creation from NaK Rust FFI to native C++ with a new
modal dialog showing per-step progress, retry support, and proper
failure cleanup.
- PrefixSetupRunner: runs each step (proton init, drive cleanup, 11
individual winetricks verbs, .NET installers, game detection, wine
registry, win11 mode, post-setup) as discrete retryable operations
- PrefixSetupDialog: step list with status icons, filtered log output,
cancel/retry-failed/delete-prefix buttons
- Downloads use QNetworkAccessManager (no host curl dependency)
- Zip extraction uses downloaded 7zz binary (no host unzip dependency)
- Winetricks runs on host (not in pressure-vessel) so cabextract is
always findable via PATH
- Wine/winetricks debug spam filtered from log output
- Skip Python basic_games proxy since native equivalent exists
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
New executables added via the Modify Executables dialog now have
"Use Proton" checked by default, matching user expectations for
a Linux mod manager.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Replace SHA256SUMS verification with Content-Length check for SLR
downloads. Valve's CDN frequently serves stale SHA256SUMS that don't
match the current archive, causing persistent checksum mismatches.
Fix CMake DEPENDS for nak_ffi to glob all .rs sources instead of
hardcoding a few files — previously changes to slr.rs (and most other
Rust files) were silently ignored by ninja.
Also wrap prefix init and runtime commands through SLR pressure-vessel
container, and expose Proton install directories to the container.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
The downloadView widget was missing selectionMode and selectionBehavior
properties, defaulting to SingleSelection. All other list views in the
UI already had ExtendedSelection set.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
| |
The restoreOrig lambda only restored env vars when FLUORINE_ORIG_* was
set, with no fallback. If those vars were missing, bundled library paths
leaked into winetricks/zenity causing FcConfigSetDefaultSubstitute
symbol errors. Now uses the same restoreOrStrip pattern as
protonlauncher.cpp — strip paths containing "fluorine" as fallback.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
| |
Logs were being created in the current working directory (defaulting to
$HOME when launched from a desktop entry). Now uses the instance
directory passed to setLogDirectory() so each instance gets its own
logs/ folder. Removes unused FLUORINE_LAUNCH_DIR env var.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
Instead of logging a warning and attempting to launch (which fails with
EACCES), show a clear error dialog directing the user to Settings →
Wine/Proton to create a prefix.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
| |
Winetricks spawns kdialog/zenity for its GUI, which inherit
Fluorine's LD_LIBRARY_PATH pointing at bundled Qt .so files.
On SteamOS (Steam Deck) this causes symbol lookup errors in
the system kdialog. Restore the original host library paths
from FLUORINE_ORIG_* env vars before launching winetricks.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
RootBuilder is incompatible with Fluorine/Linux. Add a permanent
hard blacklist (case-insensitive) in loadPlugins() so it is silently
skipped for all users.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
delete, hide LOOT sort
- VFS: resolve canonical (mod-provided) case for inode paths instead of Wine's
requested case, preventing duplicate Overwrite entries with mismatched casing
- Root Builder: fix deployRootFiles not running (m_gameDir set too late,
setRootBuilderEnabled missing from prepareVFS path)
- Root Builder: add "Browse Root Builder" button to Data tab, opens game root
with deployed Root files visible
- Mod validity: treat mods with only a Root/ folder as valid when VFS Root
Builder is enabled
- Downloads: multi-select delete via Delete key and context menu
- Hide LOOT Sort button on Linux
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
visibility fix
Plugin loading:
- Remove symlink-based ensureBundledPluginsLinked(), replace with multi-dir
search (bundled dir takes priority, instance dir adds extras only)
- Auto-clean stale symlinks from instance plugins/ dirs on startup
- Add mergedProxyList() for proxy plugin discovery across both dirs
VFS Root Builder (replaces Python rootbuilder.py):
- Native C++ Root Builder integrated into FuseConnector
- Deploy mod Root/ files to game dir before FUSE mount, clear on unmount
- Per-instance toggle in Instance Manager (default: on)
- Root Builder path normalization in processrunner.cpp: rewrite binary and
start-in paths from mods/.../Root/ to Game Root for correct Wine path
resolution (fixes SKSE + EngineFixes versionlib lookup)
- Expose game dir and prefix to SLR pressure-vessel via --filesystem=
Wine registry check:
- Read/write Wine prefix system.reg (HKLM) with timestamp-aware parsing
- Auto-check game install path before launch, prompt to fix if mismatched
- Updates both Software\ and Wow6432Node\ registry keys
Column visibility fix:
- Guard updateGroupByProxy() during QHeaderView::restoreState() to prevent
sort indicator restoration from triggering setSourceModel() which resets
all columns to visible
Python proxy:
- Skip FixGameRegKey.py, crashlogtools, rootbuilder.py (Windows-only or
replaced by native implementations)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
Large modlists (e.g. Gate To Sovngarde) exceed the default 1024 fd
limit during FUSE VFS recursive directory iteration, causing
"Too many open files" errors.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
| |
Each launch creates a new mo_interface_YYYY-MM-DD_HH-MM-SS.log in a
logs/ folder next to where fluorine-manager was run from. Old logs are
cleaned up to keep only the 5 most recent. Launcher scripts export
FLUORINE_LAUNCH_DIR before cd'ing to the bin directory so the C++ side
knows the original working directory.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
games
Steam injects 32-bit gameoverlayrenderer.so via LD_PRELOAD which causes
"wrong ELF class" errors for 64-bit Qt6 apps. Save and clear LD_PRELOAD
in both launcher and AppRun scripts, restore it in ProtonLauncher for
game processes.
Also hardens looksValid() with QFileInfo::exists() for absolute paths
(QDir::exists() has edge cases with relative subdirectory paths), adds
case-insensitive directory walking fallback, and adds debug logging to
both looksValid() and detectGame().
Adds ~/.steam/debian-installation to Python steam_utils.py candidates.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
On Bazzite (and other Fedora immutable distros), /home/ is a symlink to
/var/home/. This caused the symlink staleness check to always fail when
desktop mode and game mode resolved $HOME differently, deleting and
re-creating plugin symlinks on every game-mode launch. If re-creation
failed (e.g. race or gamescope restriction), libbasic_games.so would be
missing from the per-instance plugin dir, producing the "game plugin
'Oblivion Remastered' doesn't exist" (PluginGone) error.
Fix: use canonicalFilePath() on both sides of the comparison so paths
that differ only by symlink component (/home/ vs /var/home/) compare equal.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The previous fix only overrode m_GameName in requestFileInfo and
requestDownloadURL, but after the download completes STATE_FETCHINGMODINFO
triggers requestDescription with the same fallback game plugin issue,
causing 404s for nexusmods.com/site mods.
Consolidate into applyGameNameOverride() helper called from:
- requestFileInfo
- requestDownloadURL
- requestDescription
- requestModInfo
This ensures all API calls use "site" as the game domain when no
matching game plugin is found.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
| |
|
|
| |
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Tools like BethINI Pie use the "site" game domain on Nexus, which has
no matching game plugin. Previously this triggered the "Wrong Game"
error. Now "site" (and any other domain with no plugin) is allowed:
- downloadmanager: detect "site" NXM links and allow download using
managed game as context; propagate raw game name ("site") through
pending tracking and API requests for correct Nexus API URLs
- downloadmanager: in nxmFileInfoAvailable, default info->gameName to
the raw game name before plugin lookup so "site" is preserved when
no matching plugin is found
- nexusinterface: override m_GameName with raw game name in both
requestFileInfo and requestDownloadURL when the plugin is a fallback
(i.e. doesn't actually match the requested game domain)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Steam Linux Runtime:
- New Rust module (libs/nak/src/slr.rs): download SteamLinuxRuntime_sniper
from repo.steampowered.com, SHA256 verification, BUILD_ID update checks
- nak_ffi exports: nak_slr_is_installed, nak_slr_get_run_script, nak_download_slr
- ProtonLauncher: wraps Proton launch inside SLR pressure-vessel container
when enabled (run -- proton waitforexitandrun game.exe)
- Instance Manager: SLR checkbox (default on) beside Steam DRM checkbox
- Main window: pre-check downloads SLR before launch if needed
- Proton settings tab: "Download Steam Linux Runtime" button
- spawn.cpp: reads fluorine/use_slr per-instance INI key
- Logs "Final command:" showing full assembled launch command
Bug fixes:
- Fix Use Proton off by default for plugin executables (executableslist.cpp)
- Fix Use Proton off by default for file tree right-click (filetree.cpp)
- Fix Fedora 43 Qt platform plugin crash: explicit QT_QPA_PLATFORM_PLUGIN_PATH
- Add Qt6::Concurrent to CMakeLists for QtConcurrent background downloads
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
| |
On Debian/Ubuntu, libfuse3-3 (runtime) installs libfuse3.so.3 but not
the unversioned libfuse3.so symlink — that requires libfuse3-dev. Add
.so.3 variants to the FUSE detection check so users with only the
runtime package don't get a spurious warning.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
- 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>
|