Merge pull request #9606 from Filoppi/patch-14

Qt: avoid queuing ConfigChanged() more than once
This commit is contained in:
JosJuice 2021-06-11 18:59:39 +02:00 committed by GitHub
commit a09d9cf608
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 2 deletions

View File

@ -4,6 +4,8 @@
#include "DolphinQt/Settings.h"
#include <atomic>
#include <QApplication>
#include <QDir>
#include <QFile>
@ -42,8 +44,21 @@ Settings::Settings()
QueueOnObject(this, [this, new_state] { emit EmulationStateChanged(new_state); });
});
Config::AddConfigChangedCallback(
[this] { QueueOnObject(this, [this] { emit ConfigChanged(); }); });
Config::AddConfigChangedCallback([this] {
static std::atomic<bool> do_once{true};
if (do_once.exchange(false))
{
// Calling ConfigChanged() with a "delay" can have risks, for example, if from
// code we change some configs that result in Qt greying out some setting, we could
// end up editing that setting before its greyed out, sending out an event,
// which might not be expected or handled by the code, potentially crashing.
// The only safe option would be to wait on the Qt thread to have finished executing this.
QueueOnObject(this, [this] {
do_once = true;
emit ConfigChanged();
});
}
});
g_controller_interface.RegisterDevicesChangedCallback([this] {
if (Host::GetInstance()->IsHostThread())