| Commit message (Collapse) | Author | Age | Files | Lines |
| ... | |
| |
|
|
|
|
|
|
|
|
|
|
| |
Proton 11's toolmanifest sets use_sessions=1, so the "run" verb forks
into a persistent session manager that never exits — prefix init hung
forever. Use "waitforexitandrun" instead. Also drop WINEDEBUG=-all so
init output is visible, and migrate the bundled Steam Linux Runtime
downloader from steamrt3/sniper to steamrt4 (Proton 11's required
runtime). SLR lookup paths fall back to sniper for users with an
existing install.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
deployPlugins now writes only the plugin-list file the game actually
reads (Plugins.txt for PluginsTxt games, lowercase plugins.txt for
FileTime games). loadorder.txt is MO2-internal and never belonged in
AppData/Local/<Game>/; previously writing a stale copy there defeated
LOOT's edits because syncPluginsBack pulled the stale loadorder.txt
back into the profile, and getLoadOrder() preferred it over the
freshly-synced plugins.txt.
syncSavesBack now mirrors deletions: files present in the profile but
absent from the prefix are removed before the copy pass. Without this,
saves the user deleted in-game stayed in the profile forever because
copyTreeContents only copies files that exist in the source.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
When stepProtonInit failed, the runner kept marching through every
downstream step against a half-initialized prefix, producing a cascade
of misleading "wine client error: version mismatch" failures that
masked the real problem. Seen in the wild with a GE-Proton10-34 install
that was missing concrt140.dll from its bundled default_pfx template:
setup_prefix crashes with FileNotFoundError, then seven unrelated steps
are reported as broken.
Break out of the step loop as soon as proton_init fails, and inspect the
captured Proton output for the "FileNotFoundError" + "default_pfx" hint
so the error message points at the broken Proton distribution instead
of a generic "exit code 1". runProcess gains an optional QByteArray*
out param so the caller can pattern-match on the merged output without
changing any existing call sites.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
| |
OrganizerCore::modStatusChanged updates the DirectoryStructure in
place (enabling/disabling origins) but never fires
directoryStructureReady, which is the only signal MainWindow used to
drive DataTab::updateTree. Result: after enabling or disabling a mod
the Data tab kept showing the old virtual tree until the user hit
Refresh manually.
Connect ModList::modStatesChanged directly to DataTab::updateTree so
the file tree re-queries the structure as soon as the toggle lands.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
syncPluginsBack previously updated the profile from the newest case
variant but left the stale sibling (e.g. lowercase plugins.txt after
LOOT edited Plugins.txt) untouched in the prefix, so anything reading
the prefix before the next deployPlugins saw divergent content. Mirror
the newest variant into every sibling after the profile sync.
installer_omod.py called mobase.log / mobase.LogLevel which the Python
bindings do not expose, crashing .omod installs with AttributeError.
Route messages through stderr so the Python runner forwards them to
MOBase::log::error.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
LOOT (and any other tool that edits the plugin list) writes to the
deployed copies in the Wine prefix AppData. afterRun was syncing
saves and INIs back but not plugins, so LOOT's reordering was
silently reverted by savePluginList() writing the old in-memory
order on top of the untouched profile file.
Add WinePrefix::syncPluginsBack that picks the newest case variant
of plugins.txt and loadorder.txt from the prefix and copies them
back to the profile. Run it in afterRun alongside the existing
save/INI sync. For FileTime-based games (Skyrim LE, FO3, FNV) the
loadorder.txt removal now happens after the sync, so the file-time
fallback still works.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
| |
The auto-prompt in organizercore already offers to fix the registry
on launch, so the manual button is redundant.
BethINI Pie plugin compared against managedGame()->gameName(), but
GameFalloutNV returns "New Vegas" while BethINI's app folder is
"Fallout New Vegas" — add an alias map so NV is detected correctly.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
| |
Sets CCACHE_BASEDIR=/src and CCACHE_COMPILERCHECK=content so hashes
are stable across runs (absolute-path and compiler-mtime drift were
causing full rebuilds). Adds sloppiness flags, 5G max size, and
prints `ccache -s` before/after the build so cache effectiveness
is visible in the job log.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
Adds per-tick rusage snapshot (user/sys seconds, delta since last
tick, wall delta, busy%, max RSS) to the [VFS] stats lines so we
can tell CPU-bound from IO-bound slowness without external tools.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
VFS:
- Open backing fd at mo2_open time for read-only handles so mo2_read can
splice without re-opening the file on every read call.
- Bump RLIMIT_NOFILE at mount time to fit the resulting fd pressure when
the game keeps hundreds of BSAs open.
- Dedicated node_cache_mutex so resolveByInode / mo2_lookup stop racing
unordered_map writes while multiple tree_mutex readers are active.
- max_read=1MB + matching conn->max_read and raised max_readahead/max_write
so the kernel merges Wine's small sequential reads into bigger FUSE
requests.
- Per-op wall-clock counters in mo2_init() logs so we can distinguish VFS
latency from game-side work.
Proton launch:
- Write dxvk.conf to the prefix and set DXVK_CONFIG_FILE to force
dxvk.enableGraphicsPipelineLibrary=False, avoiding long GPL compile
stalls on first run.
UI / plugin compat:
- Clamp IconDelegate's per-icon width to [8, 16] so narrow content
columns don't trigger QIcon::pixmap(0,0) returning null and logging
"failed to load icon" every repaint.
- Pre-create lowercase symlinks in the stylesheet directory so QSS files
authored on Windows resolve url(foo.svg) when on-disk files are Foo.svg.
- Flip content icons empty-chessboard.png and facegen.png to 8-bit RGBA
so Qt's built-in PNG reader loads them uniformly.
- Add mobase.Version.canonicalString shim for legacy Python plugins that
still call the old VersionInfo method on appVersion()'s return.
- BSPluginList: compare normalized plugin name lists instead of byte
hashes so the post-run case-fix refresh stops spuriously firing the
"load order changed" dialog.
- BSPluginList disabled by default.
Download manager:
- Parse CDN URL with QUrl + QUrlQuery and read the filename from the
response-content-disposition query param (RFC 6266 quoted / unquoted /
ext-value forms), not QFileInfo on the raw URL.
- When the API or URL gives us a CDN object key (no archive extension),
prefer the actual Content-Disposition header from the live response in
metaDataChanged and downloadFinished.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
bsatk:
- Archive::extractToMemory() extracts a file directly into a byte buffer
instead of a filesystem path, backed by a std::ostringstream sink.
- Archive::findFile() locates a file by relative path, case-insensitive
and separator-agnostic, walking the folder tree recursively.
- extractDirect/extractCompressed now take std::ostream& so both the
ofstream and ostringstream paths share the same implementation.
libbsarch: shim rewrite on Linux to map the Windows API surface onto
bsatk::Archive, enabling preview_bsa to open vanilla BSAs via the
same interface as other plugins.
preview_bsa: double-click on a file in the BSA tree now extracts the
bytes via extractToMemory() and hands them to IOrganizer::previewFileData
for nested preview rendering (e.g. NIF inside a BSA).
uibase + organizerproxy + organizercore: new IOrganizer::previewFileData
virtual that routes in-memory file bytes through the first registered
IPluginPreview matching the extension. Uses heap + WA_DeleteOnClose +
open() to avoid nested exec() softlock from mod info filetree ->
preview_bsa tree -> nif preview.
docker/build-inner.sh: stage preview_nif shaders into plugin_data/shaders
so ShaderManager can load them via IOrganizer::getPluginDataPath().
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Vendored from github.com/Parapets/mo2-preview_nif and adapted for Linux:
- BSA texture resolution via MO2 virtual tree with case-insensitive
fallback walk (Linux FS is case-sensitive; NIFs reference textures
with arbitrary case against files on disk)
- Process-wide cached BSA candidate list, keyed by profile path,
priority-sorted, filtering disabled mods
- Path backslash normalization before loose-file lookup
- Polygon offset on SLSF1_Decal-flagged shapes to break z-ties with
coincident base meshes (road decals, moss overlays)
- Opaque framebuffer via glColorMask alpha lock so alpha-blended shapes
can't bleed the dialog background through the preview area
- QMouseEvent::globalPosition().toPoint() for Qt6 compatibility
Preview dialog behavior (organizercore.cpp):
- Switch previewFile and previewFileWithAlternatives from stack-allocated
exec() to heap + ApplicationModal + show() + WA_DeleteOnClose.
- Parent passed as nullptr so preview lifetime is decoupled from the
stack-allocated ModInfoDialog that spawns it. Nested exec() inside
the enclosing dialog's exec() was softlocking on close.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
| |
actions/upload-artifact@v4 defaults include-hidden-files to false, so
.fluorine-manifest was getting stripped from the CI release artifact
and users saw the launcher bail with "can't find its bundle files"
despite the build log reporting "Wrote manifest: 10 entries".
Rename to fluorine-manifest.txt. Sidesteps the upload-artifact default
and also survives any user-side extractor that hides dotfiles.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Previous sync ran `tar -cf - .` inside the launcher's HERE dir, which
slurped anything sitting next to the fluorine-manager script. If a user
extracted the release archive into ~/Downloads (alongside a 38 GB mod
stash), the launcher happily copied the whole lot into
~/.local/share/fluorine/bin/ on first run.
Write a `.fluorine-manifest` at build time listing the top-level entries
that belong to Fluorine, then have the launcher copy only those entries.
Also bail with a clear error if the manifest or ModOrganizer-core is
missing — catches "launcher dropped into some random folder" before any
damage is done.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Version fingerprint was stat -c '%i:%Y' which includes the inode number.
Re-extracting the same tarball produces new inodes, so the marker never
matched and the 237MB copy to ~/.local/share/fluorine/bin/ ran on every
launch — painful cross-drive (tarball on one disk, home on another).
Switch to '%s:%Y' (size + mtime). Survives re-extraction, still detects
real updates.
Also stage into bin.new/ and rename instead of rm -rf'ing bin/ before
the tar pipe. If the user Ctrl+C's mid-sync (or the copy fails), the
existing install stays intact instead of being left empty.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
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"
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
The *_native C++ ports were replaced by bundled Python + .py plugins in
de4db79, but the source dirs were left behind without any CMake wiring —
causing confusion when editing them appears to do nothing. Same story
for libs/dds_header (stale duplicate of libs/preview_dds, unrelated to
the actively-used libs/dds-header) and libs/game_gamebryo (superseded
by libs/game_bethesda/src/gamebryo).
Removes:
- libs/basic_games_native
- libs/form43_checker_native
- libs/installer_omod_native
- libs/preview_dds_native
- libs/rootbuilder_native
- libs/script_extender_checker_native
- libs/dds_header
- libs/game_gamebryo
|
| |
|
|
|
|
| |
Vendored BasicGame plugin from upstream modorganizer-basic_games.
Auto-moves loose *.pak/*.utoc/*.ucas files under Content/Paks/~mods/
on install.
|
| |
|
|
|
|
|
|
|
|
|
| |
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>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Native IPluginTool that integrates BethINI Pie (performance INI editor)
into the Tools menu. Auto-downloads the latest Linux build from GitHub
releases, checks for updates via commit SHA, and pre-configures it for
the current game and profile INI directory.
Supports: Skyrim SE, Fallout 4, Fallout New Vegas, Starfield.
Includes post-extraction fixes for PyInstaller bundle quirks:
- Patches tm.tcl hardcoded Tcl module path
- Symlinks apps/icons/fonts from _internal/ to executable directory
- Sets TCL_LIBRARY/TK_LIBRARY env vars on launch
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
| |
QFile::copy() does not overwrite existing files, unlike Windows
SHFileOperation. Remove destination before copying to match the
expected overwrite behavior.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
| |
PyQt6 6.11.0 requires Qt_6.11 symbols not present in our bundled
Qt 6.10.2, causing all Python plugins to fail with ImportError.
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>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
cabextract: The system binary under /usr is invisible inside the
pressure-vessel container where winetricks runs. Always download a
local copy to ~/.local/share/fluorine/bin/ instead of short-circuiting
when the host has it installed.
TTW: The game plugin was calling the base class identifyGamePath()
which tried matching "TTW" against NaK's detected game names — never
matching "Fallout New Vegas". Now explicitly searches for FNV in the
NaK results, mirroring how the Windows path uses the FalloutNV registry
key. Also adds HAS_NAK_FFI and nak_ffi linkage to the TTW CMake target
since it was previously only defined for the game_gamebryo target.
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>
|
| |
|
|
|
|
|
|
| |
The hard-blacklist in plugincontainer.cpp only catches rootbuilder at the
top-level scan, but the Python proxy independently scans the plugins
directory for packages (dirs with __init__.py) and was still loading it.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
| |
Log each game's prefix path, detected username, and whether the
Documents/My Games directory exists. Also log when scan_and_link_all
skips a game due to missing directories. This will help diagnose
why some games are not getting their Documents folders symlinked
during prefix setup.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
| |
Steam can place a game's compatdata in a different library folder
than the game itself (e.g. game on SD card, compatdata on internal
storage). Previously we only looked in the same steamapps directory
as the appmanifest, causing games to have no prefix_path and their
Documents/My Games folders to not get symlinked during prefix setup.
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>
|