aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSulfurNitride <SulfurNitride@users.noreply.github.com>2026-03-05 15:23:27 -0600
committerSulfurNitride <SulfurNitride@users.noreply.github.com>2026-03-05 15:23:27 -0600
commitc11849c524c05d1b779d10bb5acf01a3506a0d39 (patch)
tree0d37c428d07f56c306649900e7833ee0211b8cef /src
parent0aba9526f0f2e0f372d4ceadff80fd8ed3037358 (diff)
Use direct stderr for VFS timing logs and filter Wine/Proton noise
- 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>
Diffstat (limited to 'src')
-rw-r--r--src/src/fuseconnector.cpp32
-rw-r--r--src/src/organizercore.cpp4
-rw-r--r--src/src/protonlauncher.cpp19
3 files changed, 39 insertions, 16 deletions
diff --git a/src/src/fuseconnector.cpp b/src/src/fuseconnector.cpp
index f466b04..ab52687 100644
--- a/src/src/fuseconnector.cpp
+++ b/src/src/fuseconnector.cpp
@@ -17,6 +17,7 @@
#include <algorithm>
#include <chrono>
#include <cerrno>
+#include <cstdio>
#include <cstring>
#include <fcntl.h>
#include <filesystem>
@@ -234,9 +235,9 @@ bool FuseConnector::mount(
}
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - t0).count();
- log::info("VFS: scanned {} base game entries in {}ms ({})",
- m_baseFileCache.size(), ms,
- m_dataDirPath == m_cachedDataDirPath ? "cached" : "fresh");
+ std::fprintf(stderr, "[VFS] scanned %zu base game entries in %lldms (%s)\n",
+ m_baseFileCache.size(), static_cast<long long>(ms),
+ m_dataDirPath == m_cachedDataDirPath ? "cached" : "fresh");
}
// Open fd to data dir BEFORE mounting so we can access original files
@@ -257,8 +258,8 @@ bool FuseConnector::mount(
{
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - treeStart).count();
- log::info("VFS: built tree ({} files, {} dirs) in {}ms",
- tree->file_count, tree->dir_count, ms);
+ std::fprintf(stderr, "[VFS] built tree (%zu files, %zu dirs) in %lldms\n",
+ tree->file_count, tree->dir_count, static_cast<long long>(ms));
}
m_context = std::make_shared<Mo2FsContext>();
@@ -313,8 +314,8 @@ bool FuseConnector::mount(
{
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - mountStart).count();
- log::info("VFS: mounted on '{}' in {}ms total",
- QString::fromStdString(m_mountPoint), ms);
+ std::fprintf(stderr, "[VFS] mounted on '%s' in %lldms total\n",
+ m_mountPoint.c_str(), static_cast<long long>(ms));
}
return true;
}
@@ -346,7 +347,8 @@ void FuseConnector::unmount()
flushStaging();
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - t0).count();
- log::info("VFS: flushed staging in {}ms", ms);
+ std::fprintf(stderr, "[VFS] flushed staging in %lldms\n",
+ static_cast<long long>(ms));
}
if (m_backingFd >= 0) {
@@ -364,8 +366,8 @@ void FuseConnector::unmount()
{
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - unmountStart).count();
- log::info("VFS: unmounted from '{}' in {}ms total",
- QString::fromStdString(m_mountPoint), ms);
+ std::fprintf(stderr, "[VFS] unmounted from '%s' in %lldms total\n",
+ m_mountPoint.c_str(), static_cast<long long>(ms));
}
}
@@ -456,9 +458,10 @@ void FuseConnector::updateMapping(const MappingType& mapping)
deployExternalMappings(mapping, dataDirPath);
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - t0).count();
- log::info("VFS: deployed external mappings ({} symlinks, {} extra files) "
- "in {}ms",
- m_externalSymlinks.size(), m_extraVfsFiles.size(), ms);
+ std::fprintf(stderr, "[VFS] deployed external mappings (%zu symlinks, %zu extra files) "
+ "in %lldms\n",
+ m_externalSymlinks.size(), m_extraVfsFiles.size(),
+ static_cast<long long>(ms));
}
if (!m_mounted) {
@@ -470,7 +473,8 @@ void FuseConnector::updateMapping(const MappingType& mapping)
{
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - updateStart).count();
- log::info("VFS: updateMapping completed in {}ms total", ms);
+ std::fprintf(stderr, "[VFS] updateMapping completed in %lldms total\n",
+ static_cast<long long>(ms));
}
}
diff --git a/src/src/organizercore.cpp b/src/src/organizercore.cpp
index 4f80e98..6fa0394 100644
--- a/src/src/organizercore.cpp
+++ b/src/src/organizercore.cpp
@@ -48,6 +48,7 @@
#endif
#include <chrono>
+#include <cstdio>
#include <filesystem>
#include <QApplication>
#include <QCoreApplication>
@@ -2356,7 +2357,8 @@ void OrganizerCore::afterRun(const QFileInfo& binary, DWORD exitCode)
}
const auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now() - t0).count();
- log::info("Post-run: restored game directory permissions in {}ms", ms);
+ std::fprintf(stderr, "[VFS] restored game directory permissions in %lldms\n",
+ static_cast<long long>(ms));
}
if (m_CurrentProfile != nullptr) {
diff --git a/src/src/protonlauncher.cpp b/src/src/protonlauncher.cpp
index d845b6f..4339920 100644
--- a/src/src/protonlauncher.cpp
+++ b/src/src/protonlauncher.cpp
@@ -1,6 +1,7 @@
#include "protonlauncher.h"
#include <nak_ffi.h>
+#include <cstdio>
#include <QDir>
#include <QFile>
#include <QFileInfo>
@@ -146,7 +147,23 @@ bool startWithEnv(const QString& program, const QStringList& arguments,
}
process->setProcessEnvironment(environment);
- process->setProcessChannelMode(QProcess::ForwardedChannels);
+ process->setProcessChannelMode(QProcess::ForwardedOutputChannel);
+
+ // Filter noisy Wine/Proton stderr (GStreamer warnings, etc.) while
+ // forwarding everything else to our stderr.
+ QObject::connect(process, &QProcess::readyReadStandardError, process, [process]() {
+ const QByteArray data = process->readAllStandardError();
+ for (const QByteArray& line : data.split('\n')) {
+ if (line.isEmpty())
+ continue;
+ if (line.contains("GStreamer-WARNING") || line.contains("Failed to load plugin") ||
+ line.contains("ProtonFixes[") || line.contains("wineserver: NTSync") ||
+ line.contains("[MANGOHUD]") || line.contains("radv is not a conformant"))
+ continue;
+ std::fwrite(line.constData(), 1, line.size(), stderr);
+ std::fputc('\n', stderr);
+ }
+ });
QObject::connect(process,
QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),