diff options
author | Zach Hilman <zachhilman@gmail.com> | 2018-11-12 02:16:38 +0100 |
---|---|---|
committer | Zach Hilman <zachhilman@gmail.com> | 2018-11-18 16:53:47 +0100 |
commit | 7cfb29de23836aa1873bbb108e3d25a0e9dcfa6d (patch) | |
tree | 6ed63f8c93a0d9b4e0cb6ac8d41e0a94aa149e99 | |
parent | am: Implement ILibraryAppletAccessor IsCompleted and GetResult (diff) | |
download | yuzu-7cfb29de23836aa1873bbb108e3d25a0e9dcfa6d.tar yuzu-7cfb29de23836aa1873bbb108e3d25a0e9dcfa6d.tar.gz yuzu-7cfb29de23836aa1873bbb108e3d25a0e9dcfa6d.tar.bz2 yuzu-7cfb29de23836aa1873bbb108e3d25a0e9dcfa6d.tar.lz yuzu-7cfb29de23836aa1873bbb108e3d25a0e9dcfa6d.tar.xz yuzu-7cfb29de23836aa1873bbb108e3d25a0e9dcfa6d.tar.zst yuzu-7cfb29de23836aa1873bbb108e3d25a0e9dcfa6d.zip |
-rw-r--r-- | src/core/frontend/applets/software_keyboard.cpp | 10 | ||||
-rw-r--r-- | src/core/frontend/applets/software_keyboard.h | 5 | ||||
-rw-r--r-- | src/core/hle/service/am/am.cpp | 34 | ||||
-rw-r--r-- | src/core/hle/service/am/applets/applets.h | 6 | ||||
-rw-r--r-- | src/core/hle/service/am/applets/software_keyboard.cpp | 27 | ||||
-rw-r--r-- | src/core/hle/service/am/applets/software_keyboard.h | 3 | ||||
-rw-r--r-- | src/yuzu/applets/software_keyboard.cpp | 15 | ||||
-rw-r--r-- | src/yuzu/applets/software_keyboard.h | 8 | ||||
-rw-r--r-- | src/yuzu/main.cpp | 14 | ||||
-rw-r--r-- | src/yuzu/main.h | 4 |
10 files changed, 62 insertions, 64 deletions
diff --git a/src/core/frontend/applets/software_keyboard.cpp b/src/core/frontend/applets/software_keyboard.cpp index cf5e2ea31..2445a980d 100644 --- a/src/core/frontend/applets/software_keyboard.cpp +++ b/src/core/frontend/applets/software_keyboard.cpp @@ -9,14 +9,12 @@ namespace Core::Frontend { SoftwareKeyboardApplet::~SoftwareKeyboardApplet() = default; -bool DefaultSoftwareKeyboardApplet::GetText(SoftwareKeyboardParameters parameters, - std::u16string& text) const { +std::optional<std::u16string> DefaultSoftwareKeyboardApplet::GetText( + SoftwareKeyboardParameters parameters) const { if (parameters.initial_text.empty()) - text = u"yuzu"; - else - text = parameters.initial_text; + return u"yuzu"; - return true; + return parameters.initial_text; } void DefaultSoftwareKeyboardApplet::SendTextCheckDialog(std::u16string error_message) const { diff --git a/src/core/frontend/applets/software_keyboard.h b/src/core/frontend/applets/software_keyboard.h index 0a82aac0d..7387ee8d7 100644 --- a/src/core/frontend/applets/software_keyboard.h +++ b/src/core/frontend/applets/software_keyboard.h @@ -4,6 +4,7 @@ #pragma once +#include <optional> #include <string> #include "common/bit_field.h" #include "common/common_types.h" @@ -35,13 +36,13 @@ class SoftwareKeyboardApplet { public: virtual ~SoftwareKeyboardApplet(); - virtual bool GetText(SoftwareKeyboardParameters parameters, std::u16string& text) const = 0; + virtual std::optional<std::u16string> GetText(SoftwareKeyboardParameters parameters) const = 0; virtual void SendTextCheckDialog(std::u16string error_message) const = 0; }; class DefaultSoftwareKeyboardApplet final : public SoftwareKeyboardApplet { public: - bool GetText(SoftwareKeyboardParameters parameters, std::u16string& text) const override; + std::optional<std::u16string> GetText(SoftwareKeyboardParameters parameters) const override; void SendTextCheckDialog(std::u16string error_message) const override; }; diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp index 3201e2d4b..3f8d97d31 100644 --- a/src/core/hle/service/am/am.cpp +++ b/src/core/hle/service/am/am.cpp @@ -566,6 +566,16 @@ public: } private: + void AppletStorageProxyOutData(IStorage storage) { + storage_stack.push_back(std::make_shared<IStorage>(storage)); + pop_out_data_event->Signal(); + } + + void AppletStorageProxyOutInteractiveData(IStorage storage) { + interactive_storage_stack.push_back(std::make_shared<IStorage>(storage)); + pop_interactive_out_data_event->Signal(); + } + void GetAppletStateChangedEvent(Kernel::HLERequestContext& ctx) { state_changed_event->Signal(); @@ -591,17 +601,11 @@ private: ASSERT(applet != nullptr); applet->Initialize(storage_stack); - const auto data = std::make_shared<IStorage>(applet->Execute()); + applet->Execute( + [this](IStorage storage) { AppletStorageProxyOutData(storage); }, + [this](IStorage storage) { AppletStorageProxyOutInteractiveData(storage); }); state_changed_event->Signal(); - if (applet->TransactionComplete()) { - storage_stack.push_back(data); - pop_out_data_event->Signal(); - } else { - interactive_storage_stack.push_back(data); - pop_interactive_out_data_event->Signal(); - } - IPC::ResponseBuilder rb{ctx, 2}; rb.Push(RESULT_SUCCESS); } @@ -632,17 +636,11 @@ private: ASSERT(applet->IsInitialized()); applet->ReceiveInteractiveData(interactive_storage_stack.back()); - const auto data = std::make_shared<IStorage>(applet->Execute()); + applet->Execute( + [this](IStorage storage) { AppletStorageProxyOutData(storage); }, + [this](IStorage storage) { AppletStorageProxyOutInteractiveData(storage); }); state_changed_event->Signal(); - if (applet->TransactionComplete()) { - storage_stack.push_back(data); - pop_out_data_event->Signal(); - } else { - interactive_storage_stack.push_back(data); - pop_interactive_out_data_event->Signal(); - } - IPC::ResponseBuilder rb{ctx, 2}; rb.Push(RESULT_SUCCESS); diff --git a/src/core/hle/service/am/applets/applets.h b/src/core/hle/service/am/applets/applets.h index 6d90eb608..7fbaaf2f3 100644 --- a/src/core/hle/service/am/applets/applets.h +++ b/src/core/hle/service/am/applets/applets.h @@ -4,6 +4,7 @@ #pragma once +#include <functional> #include <memory> #include <vector> #include "common/swap.h" @@ -20,6 +21,8 @@ class IStorage; namespace Applets { +using AppletStorageProxyFunction = std::function<void(IStorage)>; + class Applet { public: Applet(); @@ -30,7 +33,8 @@ public: virtual bool TransactionComplete() const = 0; virtual ResultCode GetStatus() const = 0; virtual void ReceiveInteractiveData(std::shared_ptr<IStorage> storage) = 0; - virtual IStorage Execute() = 0; + virtual void Execute(AppletStorageProxyFunction out_data, + AppletStorageProxyFunction out_interactive_data) = 0; bool IsInitialized() const { return initialized; diff --git a/src/core/hle/service/am/applets/software_keyboard.cpp b/src/core/hle/service/am/applets/software_keyboard.cpp index 044a16264..7352f3bdf 100644 --- a/src/core/hle/service/am/applets/software_keyboard.cpp +++ b/src/core/hle/service/am/applets/software_keyboard.cpp @@ -87,42 +87,37 @@ void SoftwareKeyboard::ReceiveInteractiveData(std::shared_ptr<IStorage> storage) } } -IStorage SoftwareKeyboard::Execute() { +void SoftwareKeyboard::Execute(AppletStorageProxyFunction out_data, + AppletStorageProxyFunction out_interactive_data) { if (complete) - return IStorage{final_data}; + return; const auto& frontend{Core::System::GetInstance().GetSoftwareKeyboard()}; const auto parameters = ConvertToFrontendParameters(config, initial_text); - std::u16string text; - const auto success = frontend.GetText(parameters, text); + const auto res = frontend.GetText(parameters); std::vector<u8> output(SWKBD_OUTPUT_BUFFER_SIZE); - if (success) { + if (res.has_value()) { if (config.text_check) { - const auto size = static_cast<u32>(text.size() * 2 + 4); + const auto size = static_cast<u32>(res->size() * 2 + 4); std::memcpy(output.data(), &size, sizeof(u32)); } else { output[0] = 1; } - std::memcpy(output.data() + 4, text.data(), - std::min(text.size() * 2, SWKBD_OUTPUT_BUFFER_SIZE - 4)); + std::memcpy(output.data() + 4, res->data(), + std::min(res->size() * 2, SWKBD_OUTPUT_BUFFER_SIZE - 4)); } else { complete = true; - final_data = std::move(output); - return IStorage{final_data}; + out_data(IStorage{output}); + return; } complete = !config.text_check; - if (complete) { - final_data = std::move(output); - return IStorage{final_data}; - } - - return IStorage{output}; + (complete ? out_data : out_interactive_data)(IStorage{output}); } } // namespace Service::AM::Applets diff --git a/src/core/hle/service/am/applets/software_keyboard.h b/src/core/hle/service/am/applets/software_keyboard.h index 9d77f5802..66de4bc59 100644 --- a/src/core/hle/service/am/applets/software_keyboard.h +++ b/src/core/hle/service/am/applets/software_keyboard.h @@ -54,7 +54,8 @@ public: bool TransactionComplete() const override; ResultCode GetStatus() const override; void ReceiveInteractiveData(std::shared_ptr<IStorage> storage) override; - IStorage Execute() override; + void Execute(AppletStorageProxyFunction out_data, + AppletStorageProxyFunction out_interactive_data) override; private: KeyboardConfig config; diff --git a/src/yuzu/applets/software_keyboard.cpp b/src/yuzu/applets/software_keyboard.cpp index fad150ec1..92992ef87 100644 --- a/src/yuzu/applets/software_keyboard.cpp +++ b/src/yuzu/applets/software_keyboard.cpp @@ -97,11 +97,11 @@ void QtSoftwareKeyboardDialog::Reject() { accept(); } -std::u16string QtSoftwareKeyboardDialog::GetText() { +std::u16string QtSoftwareKeyboardDialog::GetText() const { return text; } -bool QtSoftwareKeyboardDialog::GetStatus() { +bool QtSoftwareKeyboardDialog::GetStatus() const { return ok; } @@ -109,13 +109,12 @@ QtSoftwareKeyboard::QtSoftwareKeyboard(GMainWindow& parent) : main_window(parent QtSoftwareKeyboard::~QtSoftwareKeyboard() = default; -bool QtSoftwareKeyboard::GetText(Core::Frontend::SoftwareKeyboardParameters parameters, - std::u16string& text) const { - bool success; +std::optional<std::u16string> QtSoftwareKeyboard::GetText( + Core::Frontend::SoftwareKeyboardParameters parameters) const { + std::optional<std::u16string> success; QMetaObject::invokeMethod(&main_window, "SoftwareKeyboardGetText", Qt::BlockingQueuedConnection, - Q_RETURN_ARG(bool, success), - Q_ARG(Core::Frontend::SoftwareKeyboardParameters, parameters), - Q_ARG(std::u16string&, text)); + Q_RETURN_ARG(std::optional<std::u16string>, success), + Q_ARG(Core::Frontend::SoftwareKeyboardParameters, parameters)); return success; } diff --git a/src/yuzu/applets/software_keyboard.h b/src/yuzu/applets/software_keyboard.h index 1069c10ec..8d95ca511 100644 --- a/src/yuzu/applets/software_keyboard.h +++ b/src/yuzu/applets/software_keyboard.h @@ -36,8 +36,8 @@ public: void Submit(); void Reject(); - std::u16string GetText(); - bool GetStatus(); + std::u16string GetText() const; + bool GetStatus() const; private: bool ok = false; @@ -58,8 +58,8 @@ public: explicit QtSoftwareKeyboard(GMainWindow& parent); ~QtSoftwareKeyboard() override; - bool GetText(Core::Frontend::SoftwareKeyboardParameters parameters, - std::u16string& text) const override; + std::optional<std::u16string> GetText( + Core::Frontend::SoftwareKeyboardParameters parameters) const override; void SendTextCheckDialog(std::u16string error_message) const override; private: diff --git a/src/yuzu/main.cpp b/src/yuzu/main.cpp index 447d9dece..a11eb7f86 100644 --- a/src/yuzu/main.cpp +++ b/src/yuzu/main.cpp @@ -207,16 +207,18 @@ GMainWindow::~GMainWindow() { delete render_window; } -bool GMainWindow::SoftwareKeyboardGetText( - const Core::Frontend::SoftwareKeyboardParameters& parameters, std::u16string& text) { +std::optional<std::u16string> GMainWindow::SoftwareKeyboardGetText( + const Core::Frontend::SoftwareKeyboardParameters& parameters) { QtSoftwareKeyboardDialog dialog(this, parameters); dialog.setWindowFlags(Qt::Dialog | Qt::CustomizeWindowHint | Qt::WindowTitleHint | Qt::WindowSystemMenuHint | Qt::WindowCloseButtonHint); dialog.setWindowModality(Qt::WindowModal); dialog.exec(); - text = dialog.GetText(); - return dialog.GetStatus(); + if (!dialog.GetStatus()) + return std::nullopt; + + return dialog.GetText(); } void GMainWindow::SoftwareKeyboardInvokeCheckDialog(std::u16string error_message) { @@ -1251,10 +1253,10 @@ void GMainWindow::OnStartGame() { emu_thread->SetRunning(true); qRegisterMetaType<Core::Frontend::SoftwareKeyboardParameters>( - "core::Frontend::SoftwareKeyboardParameters"); + "Core::Frontend::SoftwareKeyboardParameters"); qRegisterMetaType<Core::System::ResultStatus>("Core::System::ResultStatus"); qRegisterMetaType<std::string>("std::string"); - qRegisterMetaType<std::u16string>("std::u16string"); + qRegisterMetaType<std::optional<std::u16string>>("std::optional<std::u16string>"); connect(emu_thread.get(), &EmuThread::ErrorThrown, this, &GMainWindow::OnCoreError); diff --git a/src/yuzu/main.h b/src/yuzu/main.h index 38074e3f0..8fbe998ea 100644 --- a/src/yuzu/main.h +++ b/src/yuzu/main.h @@ -100,8 +100,8 @@ signals: void UpdateThemedIcons(); public slots: - bool SoftwareKeyboardGetText(const Core::Frontend::SoftwareKeyboardParameters& parameters, - std::u16string& text); + std::optional<std::u16string> SoftwareKeyboardGetText( + const Core::Frontend::SoftwareKeyboardParameters& parameters); void SoftwareKeyboardInvokeCheckDialog(std::u16string error_message); private: |