summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-11-12 11:08:09 -0500
committerGravatar Zach Hilman2018-11-18 10:53:47 -0500
commit8b433beff34c382e50334bb59c4f71394845558c (patch)
treef52f432b2ee5f4ef3917c1c0e2fa052930d68f3a /src/core
parentam: Allow applets to push multiple and different channels of data (diff)
downloadyuzu-8b433beff34c382e50334bb59c4f71394845558c.tar.gz
yuzu-8b433beff34c382e50334bb59c4f71394845558c.tar.xz
yuzu-8b433beff34c382e50334bb59c4f71394845558c.zip
software_keyboard: Make GetText asynchronous
a
Diffstat (limited to 'src/core')
-rw-r--r--src/core/frontend/applets/software_keyboard.cpp7
-rw-r--r--src/core/frontend/applets/software_keyboard.h7
-rw-r--r--src/core/hle/service/am/am.cpp2
-rw-r--r--src/core/hle/service/am/applets/software_keyboard.cpp19
-rw-r--r--src/core/hle/service/am/applets/software_keyboard.h5
5 files changed, 29 insertions, 11 deletions
diff --git a/src/core/frontend/applets/software_keyboard.cpp b/src/core/frontend/applets/software_keyboard.cpp
index 2445a980d..4105101b3 100644
--- a/src/core/frontend/applets/software_keyboard.cpp
+++ b/src/core/frontend/applets/software_keyboard.cpp
@@ -9,12 +9,13 @@
9namespace Core::Frontend { 9namespace Core::Frontend {
10SoftwareKeyboardApplet::~SoftwareKeyboardApplet() = default; 10SoftwareKeyboardApplet::~SoftwareKeyboardApplet() = default;
11 11
12std::optional<std::u16string> DefaultSoftwareKeyboardApplet::GetText( 12void DefaultSoftwareKeyboardApplet::RequestText(
13 std::function<void(std::optional<std::u16string>)> out,
13 SoftwareKeyboardParameters parameters) const { 14 SoftwareKeyboardParameters parameters) const {
14 if (parameters.initial_text.empty()) 15 if (parameters.initial_text.empty())
15 return u"yuzu"; 16 out(u"yuzu");
16 17
17 return parameters.initial_text; 18 out(parameters.initial_text);
18} 19}
19 20
20void DefaultSoftwareKeyboardApplet::SendTextCheckDialog(std::u16string error_message) const { 21void 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 7387ee8d7..5420ea883 100644
--- a/src/core/frontend/applets/software_keyboard.h
+++ b/src/core/frontend/applets/software_keyboard.h
@@ -4,6 +4,7 @@
4 4
5#pragma once 5#pragma once
6 6
7#include <functional>
7#include <optional> 8#include <optional>
8#include <string> 9#include <string>
9#include "common/bit_field.h" 10#include "common/bit_field.h"
@@ -36,13 +37,15 @@ class SoftwareKeyboardApplet {
36public: 37public:
37 virtual ~SoftwareKeyboardApplet(); 38 virtual ~SoftwareKeyboardApplet();
38 39
39 virtual std::optional<std::u16string> GetText(SoftwareKeyboardParameters parameters) const = 0; 40 virtual void RequestText(std::function<void(std::optional<std::u16string>)> out,
41 SoftwareKeyboardParameters parameters) const = 0;
40 virtual void SendTextCheckDialog(std::u16string error_message) const = 0; 42 virtual void SendTextCheckDialog(std::u16string error_message) const = 0;
41}; 43};
42 44
43class DefaultSoftwareKeyboardApplet final : public SoftwareKeyboardApplet { 45class DefaultSoftwareKeyboardApplet final : public SoftwareKeyboardApplet {
44public: 46public:
45 std::optional<std::u16string> GetText(SoftwareKeyboardParameters parameters) const override; 47 void RequestText(std::function<void(std::optional<std::u16string>)> out,
48 SoftwareKeyboardParameters parameters) const override;
46 void SendTextCheckDialog(std::u16string error_message) const override; 49 void SendTextCheckDialog(std::u16string error_message) const override;
47}; 50};
48 51
diff --git a/src/core/hle/service/am/am.cpp b/src/core/hle/service/am/am.cpp
index 3f8d97d31..d040d4776 100644
--- a/src/core/hle/service/am/am.cpp
+++ b/src/core/hle/service/am/am.cpp
@@ -718,7 +718,7 @@ void IStorageAccessor::Write(Kernel::HLERequestContext& ctx) {
718 const u64 offset{rp.Pop<u64>()}; 718 const u64 offset{rp.Pop<u64>()};
719 const std::vector<u8> data{ctx.ReadBuffer()}; 719 const std::vector<u8> data{ctx.ReadBuffer()};
720 720
721 const auto size = std::min(data.size(), backing.buffer.size() - offset); 721 const auto size = std::min<std::size_t>(data.size(), backing.buffer.size() - offset);
722 722
723 std::memcpy(&backing.buffer[offset], data.data(), size); 723 std::memcpy(&backing.buffer[offset], data.data(), size);
724 724
diff --git a/src/core/hle/service/am/applets/software_keyboard.cpp b/src/core/hle/service/am/applets/software_keyboard.cpp
index 7352f3bdf..66b34d5ac 100644
--- a/src/core/hle/service/am/applets/software_keyboard.cpp
+++ b/src/core/hle/service/am/applets/software_keyboard.cpp
@@ -43,6 +43,10 @@ SoftwareKeyboard::SoftwareKeyboard() = default;
43SoftwareKeyboard::~SoftwareKeyboard() = default; 43SoftwareKeyboard::~SoftwareKeyboard() = default;
44 44
45void SoftwareKeyboard::Initialize(std::vector<std::shared_ptr<IStorage>> storage_) { 45void SoftwareKeyboard::Initialize(std::vector<std::shared_ptr<IStorage>> storage_) {
46 complete = false;
47 initial_text.clear();
48 final_data.clear();
49
46 Applet::Initialize(std::move(storage_)); 50 Applet::Initialize(std::move(storage_));
47 51
48 ASSERT(storage_stack.size() >= 2); 52 ASSERT(storage_stack.size() >= 2);
@@ -96,20 +100,25 @@ void SoftwareKeyboard::Execute(AppletStorageProxyFunction out_data,
96 100
97 const auto parameters = ConvertToFrontendParameters(config, initial_text); 101 const auto parameters = ConvertToFrontendParameters(config, initial_text);
98 102
99 const auto res = frontend.GetText(parameters); 103 this->out_data = out_data;
104 this->out_interactive_data = out_interactive_data;
105 frontend.RequestText([this](std::optional<std::u16string> text) { WriteText(text); },
106 parameters);
107}
100 108
109void SoftwareKeyboard::WriteText(std::optional<std::u16string> text) {
101 std::vector<u8> output(SWKBD_OUTPUT_BUFFER_SIZE); 110 std::vector<u8> output(SWKBD_OUTPUT_BUFFER_SIZE);
102 111
103 if (res.has_value()) { 112 if (text.has_value()) {
104 if (config.text_check) { 113 if (config.text_check) {
105 const auto size = static_cast<u32>(res->size() * 2 + 4); 114 const auto size = static_cast<u32>(text->size() * 2 + 4);
106 std::memcpy(output.data(), &size, sizeof(u32)); 115 std::memcpy(output.data(), &size, sizeof(u32));
107 } else { 116 } else {
108 output[0] = 1; 117 output[0] = 1;
109 } 118 }
110 119
111 std::memcpy(output.data() + 4, res->data(), 120 std::memcpy(output.data() + 4, text->data(),
112 std::min(res->size() * 2, SWKBD_OUTPUT_BUFFER_SIZE - 4)); 121 std::min(text->size() * 2, SWKBD_OUTPUT_BUFFER_SIZE - 4));
113 } else { 122 } else {
114 complete = true; 123 complete = true;
115 out_data(IStorage{output}); 124 out_data(IStorage{output});
diff --git a/src/core/hle/service/am/applets/software_keyboard.h b/src/core/hle/service/am/applets/software_keyboard.h
index 66de4bc59..b08bff3d7 100644
--- a/src/core/hle/service/am/applets/software_keyboard.h
+++ b/src/core/hle/service/am/applets/software_keyboard.h
@@ -57,11 +57,16 @@ public:
57 void Execute(AppletStorageProxyFunction out_data, 57 void Execute(AppletStorageProxyFunction out_data,
58 AppletStorageProxyFunction out_interactive_data) override; 58 AppletStorageProxyFunction out_interactive_data) override;
59 59
60 void WriteText(std::optional<std::u16string> text);
61
60private: 62private:
61 KeyboardConfig config; 63 KeyboardConfig config;
62 std::u16string initial_text; 64 std::u16string initial_text;
63 bool complete = false; 65 bool complete = false;
64 std::vector<u8> final_data; 66 std::vector<u8> final_data;
67
68 AppletStorageProxyFunction out_data;
69 AppletStorageProxyFunction out_interactive_data;
65}; 70};
66 71
67} // namespace Service::AM::Applets 72} // namespace Service::AM::Applets