Skip to content
Permalink
Browse files
Merge pull request #9606 from Filoppi/patch-14
Qt: avoid queuing ConfigChanged() more than once
  • Loading branch information
JosJuice committed Jun 11, 2021
2 parents 0c6e00c + e6057c5 commit a09d9cf
Showing 1 changed file with 17 additions and 2 deletions.
@@ -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())

0 comments on commit a09d9cf

Please sign in to comment.