mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-06 01:53:25 -08:00
[Game] Follow the palette in judge message tags (#7597)
* [Settings] Delete update channels at shutdown SettingsCache owns the stable and beta update channels as raw pointers, and each owns a QNetworkAccessManager, so the process leaves QtNetwork objects alive past QApplication teardown. Delete them from a QCoreApplication::aboutToQuit handler instead of the destructor: SettingsCache is a Q_GLOBAL_STATIC, so ~SettingsCache() runs during static teardown, after QApplication is gone, and destroying the network managers at that point is the post-application window that ASan reports. The hook is installed on the first instance() call that has an application object, since the first access may predate it. * [Game] Follow the palette in judge message tags Judge tags hardcoded a black prefix and a `theme:icons/scales` image inside rich text, where `currentColor` cannot resolve and a palette change leaves the tag unreadable. Render the scales glyph through the themed icon engine, register it as a document image resource, and repaint the log when the palette or theme changes. --------- Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
parent
e22a75974a
commit
ada0cccfbf
4 changed files with 64 additions and 3 deletions
|
|
@ -6,6 +6,7 @@
|
|||
#include "shortcuts_settings.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QCoreApplication>
|
||||
#include <QDebug>
|
||||
#include <QDir>
|
||||
#include <QFile>
|
||||
|
|
@ -47,7 +48,32 @@ Q_GLOBAL_STATIC(SettingsCache, settingsCache)
|
|||
|
||||
SettingsCache &SettingsCache::instance()
|
||||
{
|
||||
return *settingsCache; // returns a QT managed singleton reference
|
||||
SettingsCache &cache = *settingsCache; // returns a QT managed singleton reference
|
||||
// The release channels own QNetworkAccessManagers, which must be destroyed
|
||||
// while the application object is alive. ~SettingsCache() runs during
|
||||
// static teardown, after QApplication is gone, so hook the application's
|
||||
// shutdown instead. Retried here because the first access may predate the
|
||||
// application object.
|
||||
cache.installShutdownHook();
|
||||
return cache;
|
||||
}
|
||||
|
||||
void SettingsCache::installShutdownHook()
|
||||
{
|
||||
if (shutdownHookInstalled) {
|
||||
return;
|
||||
}
|
||||
QCoreApplication *application = QCoreApplication::instance();
|
||||
if (application == nullptr) {
|
||||
return;
|
||||
}
|
||||
connect(application, &QCoreApplication::aboutToQuit, this, [this] {
|
||||
for (ReleaseChannel *releaseChannel : std::as_const(releaseChannels)) {
|
||||
delete releaseChannel;
|
||||
}
|
||||
releaseChannels.clear();
|
||||
});
|
||||
shutdownHookInstalled = true;
|
||||
}
|
||||
|
||||
QString SettingsCache::getDataPath()
|
||||
|
|
|
|||
|
|
@ -90,8 +90,13 @@ private:
|
|||
QString themeName;
|
||||
|
||||
QList<ReleaseChannel *> releaseChannels;
|
||||
bool shutdownHookInstalled = false;
|
||||
bool isPortableBuild;
|
||||
|
||||
// Connects the aboutToQuit handler that deletes the release channels while
|
||||
// the application object is still alive; a no-op before it exists.
|
||||
void installShutdownHook();
|
||||
|
||||
[[nodiscard]] QString getSafeConfigPath(QString configEntry, QString defaultPath) const;
|
||||
[[nodiscard]] QString getSafeConfigFilePath(QString configEntry, QString defaultPath) const;
|
||||
void loadPaths();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue