summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZach Hilman <zachhilman@gmail.com>2018-11-12 02:16:38 +0100
committerZach Hilman <zachhilman@gmail.com>2018-11-18 16:53:47 +0100
commit7cfb29de23836aa1873bbb108e3d25a0e9dcfa6d (patch)
tree6ed63f8c93a0d9b4e0cb6ac8d41e0a94aa149e99
parentam: Implement ILibraryAppletAccessor IsCompleted and GetResult (diff)
downloadyuzu-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.cpp10
-rw-r--r--src/core/frontend/applets/software_keyboard.h5
-rw-r--r--src/core/hle/service/am/am.cpp34
-rw-r--r--src/core/hle/service/am/applets/applets.h6
-rw-r--r--src/core/hle/service/am/applets/software_keyboard.cpp27
-rw-r--r--src/core/hle/service/am/applets/software_keyboard.h3
-rw-r--r--src/yuzu/applets/software_keyboard.cpp15
-rw-r--r--src/yuzu/applets/software_keyboard.h8
-rw-r--r--src/yuzu/main.cpp14
-rw-r--r--src/yuzu/main.h4
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: