From 2e86b65bf9dbaeda52c678c4e296a64c6afe59c0 Mon Sep 17 00:00:00 2001
From: Connor McLaughlin <stenzek@gmail.com>
Date: Wed, 21 Apr 2021 01:58:49 +1000
Subject: [PATCH] Qt/AchievementLoginDialog: Make login fully asynchronous

---
 src/duckstation-qt/achievementlogindialog.cpp | 24 +++++++++----------
 src/duckstation-qt/achievementlogindialog.h   |  1 +
 2 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/src/duckstation-qt/achievementlogindialog.cpp b/src/duckstation-qt/achievementlogindialog.cpp
index 34f8b9436..c768786c3 100644
--- a/src/duckstation-qt/achievementlogindialog.cpp
+++ b/src/duckstation-qt/achievementlogindialog.cpp
@@ -20,15 +20,20 @@ void AchievementLoginDialog::loginClicked()
   // TODO: Make cancellable.
   m_ui.status->setText(tr("Logging in..."));
   enableUI(false);
-  qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
 
-  bool result;
-  QtHostInterface::GetInstance()->executeOnEmulationThread(
-    [username, password, &result]() {
-      result = Cheevos::Login(username.toStdString().c_str(), password.toStdString().c_str());
-    },
-    true);
+  QtHostInterface::GetInstance()->executeOnEmulationThread([this, username, password]() {
+    const bool result = Cheevos::Login(username.toStdString().c_str(), password.toStdString().c_str());
+    QMetaObject::invokeMethod(this, "processLoginResult", Qt::QueuedConnection, Q_ARG(bool, result));
+  });
+}
 
+void AchievementLoginDialog::cancelClicked()
+{
+  done(1);
+}
+
+void AchievementLoginDialog::processLoginResult(bool result)
+{
   if (!result)
   {
     QMessageBox::critical(this, tr("Login Error"),
@@ -41,11 +46,6 @@ void AchievementLoginDialog::loginClicked()
   done(0);
 }
 
-void AchievementLoginDialog::cancelClicked()
-{
-  done(1);
-}
-
 void AchievementLoginDialog::connectUi()
 {
   connect(m_ui.login, &QPushButton::clicked, this, &AchievementLoginDialog::loginClicked);
diff --git a/src/duckstation-qt/achievementlogindialog.h b/src/duckstation-qt/achievementlogindialog.h
index 8d251fd1a..cd980c650 100644
--- a/src/duckstation-qt/achievementlogindialog.h
+++ b/src/duckstation-qt/achievementlogindialog.h
@@ -13,6 +13,7 @@ public:
 private Q_SLOTS:
   void loginClicked();
   void cancelClicked();
+  void processLoginResult(bool result);
 
 private:
   void connectUi();