Răsfoiți Sursa

applet: Add operation completed callback

Zach Hilman 7 ani în urmă
părinte
comite
19b2571aec

+ 3 - 1
src/core/frontend/applets/software_keyboard.cpp

@@ -18,10 +18,12 @@ void DefaultSoftwareKeyboardApplet::RequestText(
     out(parameters.initial_text);
 }
 
-void DefaultSoftwareKeyboardApplet::SendTextCheckDialog(std::u16string error_message) const {
+void DefaultSoftwareKeyboardApplet::SendTextCheckDialog(
+    std::u16string error_message, std::function<void()> finished_check) const {
     LOG_WARNING(Service_AM,
                 "(STUBBED) called - Default fallback software keyboard does not support text "
                 "check! (error_message={})",
                 Common::UTF16ToUTF8(error_message));
+    finished_check();
 }
 } // namespace Core::Frontend

+ 4 - 2
src/core/frontend/applets/software_keyboard.h

@@ -39,14 +39,16 @@ public:
 
     virtual void RequestText(std::function<void(std::optional<std::u16string>)> out,
                              SoftwareKeyboardParameters parameters) const = 0;
-    virtual void SendTextCheckDialog(std::u16string error_message) const = 0;
+    virtual void SendTextCheckDialog(std::u16string error_message,
+                                     std::function<void()> finished_check) const = 0;
 };
 
 class DefaultSoftwareKeyboardApplet final : public SoftwareKeyboardApplet {
 public:
     void RequestText(std::function<void(std::optional<std::u16string>)> out,
                      SoftwareKeyboardParameters parameters) const override;
-    void SendTextCheckDialog(std::u16string error_message) const override;
+    void SendTextCheckDialog(std::u16string error_message,
+                             std::function<void()> finished_check) const override;
 };
 
 } // namespace Core::Frontend

+ 4 - 2
src/core/hle/service/am/am.cpp

@@ -605,8 +605,10 @@ private:
         ASSERT(applet != nullptr);
 
         applet->Initialize(storage_stack);
-        storage_stack.clear();
-        interactive_storage_stack.clear();
+        while (!storage_stack.empty())
+            storage_stack.pop();
+        while (!interactive_storage_stack.empty())
+            interactive_storage_stack.pop();
         applet->Execute([this](IStorage storage) { AppletStorageProxyOutData(storage); },
                         [this](IStorage storage) { AppletStorageProxyOutInteractiveData(storage); },
                         [this] { state_changed_event->Signal(); });

+ 1 - 1
src/core/hle/service/am/applets/software_keyboard.cpp

@@ -87,7 +87,7 @@ void SoftwareKeyboard::ReceiveInteractiveData(std::shared_ptr<IStorage> storage)
         std::array<char16_t, SWKBD_OUTPUT_INTERACTIVE_BUFFER_SIZE / 2 - 2> string;
         std::memcpy(string.data(), data.data() + 4, string.size() * 2);
         frontend.SendTextCheckDialog(
-            Common::UTF16StringFromFixedZeroTerminatedBuffer(string.data(), string.size()));
+            Common::UTF16StringFromFixedZeroTerminatedBuffer(string.data(), string.size()), state);
     }
 }
 

+ 13 - 1
src/yuzu/applets/software_keyboard.cpp

@@ -3,11 +3,13 @@
 // Refer to the license.txt file included.
 
 #include <algorithm>
+#include <mutex>
 #include <QDialogButtonBox>
 #include <QFont>
 #include <QLabel>
 #include <QLineEdit>
 #include <QVBoxLayout>
+#include "core/hle/lock.h"
 #include "yuzu/applets/software_keyboard.h"
 #include "yuzu/main.h"
 
@@ -122,10 +124,20 @@ void QtSoftwareKeyboard::RequestText(std::function<void(std::optional<std::u16st
     emit MainWindowGetText(parameters);
 }
 
-void QtSoftwareKeyboard::SendTextCheckDialog(std::u16string error_message) const {
+void QtSoftwareKeyboard::SendTextCheckDialog(std::u16string error_message,
+                                             std::function<void()> finished_check) const {
+    this->finished_check = finished_check;
     emit MainWindowTextCheckDialog(error_message);
 }
 
 void QtSoftwareKeyboard::MainWindowFinishedText(std::optional<std::u16string> text) {
+    // Acquire the HLE mutex
+    std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
     text_output(text);
 }
+
+void QtSoftwareKeyboard::MainWindowFinishedCheckDialog() {
+    // Acquire the HLE mutex
+    std::lock_guard<std::recursive_mutex> lock(HLE::g_hle_lock);
+    finished_check();
+}

+ 4 - 1
src/yuzu/applets/software_keyboard.h

@@ -62,7 +62,8 @@ public:
 
     void RequestText(std::function<void(std::optional<std::u16string>)> out,
                      Core::Frontend::SoftwareKeyboardParameters parameters) const override;
-    void SendTextCheckDialog(std::u16string error_message) const override;
+    void SendTextCheckDialog(std::u16string error_message,
+                             std::function<void()> finished_check) const override;
 
 signals:
     void MainWindowGetText(Core::Frontend::SoftwareKeyboardParameters parameters) const;
@@ -70,7 +71,9 @@ signals:
 
 public slots:
     void MainWindowFinishedText(std::optional<std::u16string> text);
+    void MainWindowFinishedCheckDialog();
 
 private:
     mutable std::function<void(std::optional<std::u16string>)> text_output;
+    mutable std::function<void()> finished_check;
 };

+ 4 - 1
src/yuzu/main.cpp

@@ -215,14 +215,17 @@ void GMainWindow::SoftwareKeyboardGetText(
     dialog.setWindowModality(Qt::WindowModal);
     dialog.exec();
 
-    if (!dialog.GetStatus())
+    if (!dialog.GetStatus()) {
         emit SoftwareKeyboardFinishedText(std::nullopt);
+        return;
+    }
 
     emit SoftwareKeyboardFinishedText(dialog.GetText());
 }
 
 void GMainWindow::SoftwareKeyboardInvokeCheckDialog(std::u16string error_message) {
     QMessageBox::warning(this, tr("Text Check Failed"), QString::fromStdU16String(error_message));
+    emit SoftwareKeyboardFinishedCheckDialog();
 }
 
 void GMainWindow::InitializeWidgets() {

+ 1 - 0
src/yuzu/main.h

@@ -100,6 +100,7 @@ signals:
     void UpdateThemedIcons();
 
     void SoftwareKeyboardFinishedText(std::optional<std::u16string> text);
+    void SoftwareKeyboardFinishedCheckDialog();
 
 public slots:
     void SoftwareKeyboardGetText(const Core::Frontend::SoftwareKeyboardParameters& parameters);