| Commit message (Collapse) | Author | Age | Files | Lines |
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
pressure-vessel's default sharing of /run/media and home uses non-recursive
bind mounts that don't propagate FUSE submounts into the container. The
shouldExposeMountPointToPressureVessel function excluded all paths under /run
(isSystemRootPath) and under /run/media (pressureVesselSharesByDefault), so
the fuse.mo2linux mount point was never added to PRESSURE_VESSEL_FILESYSTEMS_RW.
Inside the container, the game saw the real SD card Data directory instead of
the FUSE overlay, so all VFS writes (shader cache, config files, overwrite)
bypassed staging entirely — VFS_staging stayed empty and write-heavy mods like
Community Shaders logged "Failed to save shader" on every compile.
Internal-drive games were unaffected because pressure-vessel's home directory
handling is recursive and propagates FUSE submounts correctly.
Fix: detect fuse.mo2linux in the mountinfo scan and always add it to
PRESSURE_VESSEL_FILESYSTEMS_RW regardless of its parent path classification.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
VFS: Remove physical directory creation from mo2_lookup auto-mkdir.
Previously, any dotless path component that missed the VFS tree was
immediately created on disk, leaving hundreds of empty directories in
overwrite (Shaders/, STRINGS/, DLLPlugins/, etc.) after a session.
Now a phantom virtual node is inserted instead — createFile() already
calls create_directories on the parent path, so the real directory
materialises on disk only when a file is actually written inside it.
mo2_rmdir already handles phantom (disk-absent) directories correctly.
LOOT: Add lootmanager.h/cpp which downloads the latest win64 .7z from
the GitHub releases API, extracts it to ~/.local/share/fluorine/tools/loot/
using the bundled 7zz or any system 7z tool, and exposes isLootInstalled()
/ getLootExePath(). Add a Sort button to the plugins tab that downloads
LOOT on first use (same progress-dialog pattern as SLR) then launches
LOOT.exe hooked through the active Proton via ProcessRunner so it sees
the full merged VFS. Button is hidden for games that don't use LOOT
sorting.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
| |\
| |
| | |
OpenMW support
|
| | | |
|
| | | |
|
| | | |
|
| | |
| |
| |
| |
| |
| |
| |
| |
| | |
fuse_req_session() is not available in all libfuse3 builds in the CI
image. Instead, store the fuse_session* directly in Mo2FsContext (set
once after fuse_session_new in fuseconnector.cpp) and use ctx->session
in the fuse_lowlevel_notify_inval_inode calls that fix the INI key clobber.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
| | |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
Shader cache (mo2_lookup): Starfield skips mkdir("ShaderCache/Lighting/")
and goes straight to CreateFile("ShaderCache/Lighting/X.pso"). USVFS
handles this by intercepting at Win32 level and auto-creating parent dirs
in overwrite. FUSE operates below the kernel path-resolver, so if a parent
component is missing the kernel returns ENOENT before mo2_create is ever
called. Fix: in mo2_lookup, when a name has no '.' (directory-like) and is
not found in the VFS, auto-create it in staging and return a positive inode
so the kernel can continue resolving the path. createDirectory uses
create_directories internally, so staging parent dirs are also created when
the parent came from overwrite rather than this session.
INI key clobber (mo2_open / mo2_write): keep_cache=1 with AUTO_INVAL_DATA
disabled let the kernel serve stale pre-COW page cache on re-reads. Wine's
WritePrivateProfileString does open→read→close→open(O_TRUNC)→write per key;
after the first write triggered COW, subsequent reads got old cached content,
so each new key was written on top of the original file — only the last key
survived. Fix: call fuse_lowlevel_notify_inval_inode at all four COW and
O_TRUNC paths to flush stale kernel pages precisely at the moment the
backing path changes, without the blanket performance cost of keep_cache=0.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
|
| | | |
|
| | | |
|
| | | |
|
| |/
|
|
|
|
| |
Fixes #98
Addresses #102
|
| |
|
|
| |
This reverts commit 41a336cc8e53ba062ab791ffd6dc9b90d2c72899.
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Multi-area sync against the upstream MO2 2.5.3 beta line. Roughly three
logical sections share the diff:
Catch-up (Betas 3-11):
- nxmaccessmanager: drop "supporter" from validRoles so non-premium
supporters get the right download path (Beta 10)
- mainwindow: disable tutorial triggers at the trigger sites; Qt 6.11
lockup on child windows (Beta 4)
- basic_games: add Kingdom Come Deliverance 2, Slay the Spire 2
(Betas 11, 6)
- uibase: add NXM collections parsing fields/accessors + (?:nxm|modl)
scheme support in NXMUrl (Beta 9)
- Starfield: blueprintPrefix() on IPluginGame; plugins.txt write
suppression for blueprint plugins; hasInvalidBlueprint /
hasUnpairedBlueprint diagnoses; Title-keyed content catalog
consolidation (Betas 3-5)
- downloadmanager + systemtraymanager + organizercore + iuserinterface
+ settings: add Beta 11 "show notifications when downloads complete
or fail" toggle and the showNotification plumbing
- nxmaccessmanager: restore upstream re-entry guard for OAuth refresh
and the styled OAuth response page (Beta 11)
- organizer_en.ts and game-bethesda *_en.ts: pull upstream HEAD strings
Workarounds tab removed:
- Delete settingsdialogworkarounds.{h,cpp}; drop the tab in
settingsdialog.ui; move "Enable archives parsing" into General
- Hardcode GameSettings::forceEnableCoreFiles() to true so the
primary-master toggle-off bug (DLCs unchecked on tab refresh) can't
recur; setter becomes a no-op
- No-op stubs for offlineMode, useProxy, useCustomBrowser, Steam
appID/credentials, executablesBlacklist, skipFileSuffixes,
skipDirectories — UI gone, accessors keep call sites green
- settingsdialognexus drops the custom-browser wiring; spawn drops the
"Change the blacklist" Retry path
Beta 9 download manager port:
- fileID-first match in nxmFilesAvailable and
nxmFileInfoFromMd5Available; filename remains the fallback
- NexusInterface::isActiveFileStatus() helper; rewrite of
nxmUpdatesAvailable to use pickNewestVersion /
findUpdateChainSuccessors / resolveInstalledFileId. ARCHIVED_HIDDEN
now correctly treated as inactive
- std::optional<unsigned int> reservedID on DownloadInfo factories and
on the three addDownload overloads; startDownloadURLs and
startDownloadURLWithMeta return the canonical DownloadID instead of
m_ActiveDownloads.size()-1 (which was the index, not an ID)
- QHash<unsigned int, DownloadInfo*> m_ByID maintained alongside
m_ActiveDownloads at every mutation site; downloadInfoByID is now
O(1) via m_ByID.value(id, nullptr)
LOOT remains intentionally stripped (lootcli build cruft cleaned up
separately). BSA wide-path skipped — Linux UTF-8 paths already work.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
User feedback: the only way to clean up old backups was to hand-edit
the profile directory, since the "Choose backup to restore" dialog
exposed select-or-cancel and no delete affordance.
Add an addChoice overload on SelectionDialog that takes a per-row
delete callback. Each row is rendered as a horizontal layout —
QCommandLinkButton (stretched) plus a small auto-raised QToolButton
with a trash icon (user-trash → edit-delete → SP_TrashIcon
fallback chain). Clicking the trash prompts for confirmation,
invokes the callback, and hides the row on success; the QCommandLink
remains live for restore. numChoices() now counts visible rows
under scrollAreaWidgetContents so the "no backups" check stays
correct as rows disappear.
MainWindow::queryRestore wires the callback to delete the matching
Plugins.txt.<ts>, loadorder.txt.<ts>, and lockedorder.txt.<ts>
triplet via QFile::remove.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|