From c360dbf9c42f71e7931c56b7a396ba7f7e9982e6 Mon Sep 17 00:00:00 2001 From: SulfurNitride Date: Mon, 23 Feb 2026 17:44:12 -0600 Subject: Remove umu-run, keep game as child process for Steam tracking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- libs/game_bethesda/src/gamebryo/gamegamebryo.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) (limited to 'libs/game_bethesda/src/gamebryo/gamegamebryo.cpp') diff --git a/libs/game_bethesda/src/gamebryo/gamegamebryo.cpp b/libs/game_bethesda/src/gamebryo/gamegamebryo.cpp index 4a92440..2fd45cd 100644 --- a/libs/game_bethesda/src/gamebryo/gamegamebryo.cpp +++ b/libs/game_bethesda/src/gamebryo/gamegamebryo.cpp @@ -356,6 +356,15 @@ void GameGamebryo::ensureIniFilesExist(const QString& basePath) continue; } +#ifndef _WIN32 + // Remove broken symlinks — QFileInfo::exists() follows symlinks and + // returns false for dangling ones, but QFile::copy() fails with + // "File exists" because the symlink inode is still there. + if (targetInfo.isSymLink() && !targetInfo.exists()) { + QFile::remove(targetPath); + } +#endif + #ifndef _WIN32 // On Linux, search for a differently-cased version of this INI file // (e.g., FalloutPrefs.ini when we expect falloutprefs.ini). @@ -413,15 +422,21 @@ void GameGamebryo::ensureIniFilesExist(const QString& basePath) if (targetInfo.exists()) { QFile::remove(targetPath); } - if (QFile::copy(defaultIniPath, targetPath)) { + QFile srcFile(defaultIniPath); + if (srcFile.copy(targetPath)) { // Make the copy writable QFile::setPermissions( targetPath, QFile::permissions(targetPath) | QFile::WriteUser | QFile::WriteOwner); MOBase::log::info("Seeded '{}' from default INI '{}'", iniFile, defaultIniPath); } else { - MOBase::log::warn("Failed to copy default INI '{}' -> '{}'", - defaultIniPath, targetPath); + MOBase::log::warn("Failed to copy default INI '{}' -> '{}': {} " + "(srcExists={}, srcSize={}, targetExists={}, dirExists={})", + defaultIniPath, targetPath, srcFile.errorString(), + QFileInfo::exists(defaultIniPath), + QFileInfo(defaultIniPath).size(), + QFileInfo::exists(targetPath), + QFileInfo(targetPath).dir().exists()); } } -- cgit v1.3.1