yuzu-emu
/
yuzu-android
Archived
1
0
Fork 0

swkbd: Return result for Calc request for inlined swkbd

Fixes random swkbd popups in monster hunter
This commit is contained in:
David Marcec 2020-07-19 18:56:16 +10:00
parent ad0b295125
commit d7d2c27b48
2 changed files with 49 additions and 13 deletions

View File

@ -13,11 +13,23 @@
namespace Service::AM::Applets { namespace Service::AM::Applets {
namespace {
enum class Request : u32_le {
Finalize = 0x4,
SetUserWordInfo = 0x6,
SetCustomizeDic = 0x7,
Calc = 0xa,
SetCustomizedDictionaries = 0xb,
UnsetCustomizedDictionaries = 0xc,
UnknownD = 0xd,
UnknownE = 0xe,
};
constexpr std::size_t SWKBD_INLINE_INIT_SIZE = 0x8;
constexpr std::size_t SWKBD_OUTPUT_BUFFER_SIZE = 0x7D8; constexpr std::size_t SWKBD_OUTPUT_BUFFER_SIZE = 0x7D8;
constexpr std::size_t SWKBD_OUTPUT_INTERACTIVE_BUFFER_SIZE = 0x7D4; constexpr std::size_t SWKBD_OUTPUT_INTERACTIVE_BUFFER_SIZE = 0x7D4;
constexpr std::size_t DEFAULT_MAX_LENGTH = 500; constexpr std::size_t DEFAULT_MAX_LENGTH = 500;
constexpr bool INTERACTIVE_STATUS_OK = false; constexpr bool INTERACTIVE_STATUS_OK = false;
} // namespace
static Core::Frontend::SoftwareKeyboardParameters ConvertToFrontendParameters( static Core::Frontend::SoftwareKeyboardParameters ConvertToFrontendParameters(
KeyboardConfig config, std::u16string initial_text) { KeyboardConfig config, std::u16string initial_text) {
Core::Frontend::SoftwareKeyboardParameters params{}; Core::Frontend::SoftwareKeyboardParameters params{};
@ -47,6 +59,7 @@ SoftwareKeyboard::~SoftwareKeyboard() = default;
void SoftwareKeyboard::Initialize() { void SoftwareKeyboard::Initialize() {
complete = false; complete = false;
is_inline = false;
initial_text.clear(); initial_text.clear();
final_data.clear(); final_data.clear();
@ -56,6 +69,11 @@ void SoftwareKeyboard::Initialize() {
ASSERT(keyboard_config_storage != nullptr); ASSERT(keyboard_config_storage != nullptr);
const auto& keyboard_config = keyboard_config_storage->GetData(); const auto& keyboard_config = keyboard_config_storage->GetData();
if (keyboard_config.size() == SWKBD_INLINE_INIT_SIZE) {
is_inline = true;
return;
}
ASSERT(keyboard_config.size() >= sizeof(KeyboardConfig)); ASSERT(keyboard_config.size() >= sizeof(KeyboardConfig));
std::memcpy(&config, keyboard_config.data(), sizeof(KeyboardConfig)); std::memcpy(&config, keyboard_config.data(), sizeof(KeyboardConfig));
@ -87,16 +105,32 @@ void SoftwareKeyboard::ExecuteInteractive() {
const auto storage = broker.PopInteractiveDataToApplet(); const auto storage = broker.PopInteractiveDataToApplet();
ASSERT(storage != nullptr); ASSERT(storage != nullptr);
const auto data = storage->GetData(); const auto data = storage->GetData();
const auto status = static_cast<bool>(data[0]); if (!is_inline) {
const auto status = static_cast<bool>(data[0]);
if (status == INTERACTIVE_STATUS_OK) { if (status == INTERACTIVE_STATUS_OK) {
complete = true; complete = true;
} else {
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()),
[this] { broker.SignalStateChanged(); });
}
} else { } else {
std::array<char16_t, SWKBD_OUTPUT_INTERACTIVE_BUFFER_SIZE / 2 - 2> string; Request request{};
std::memcpy(string.data(), data.data() + 4, string.size() * 2); std::memcpy(&request, data.data(), sizeof(Request));
frontend.SendTextCheckDialog(
Common::UTF16StringFromFixedZeroTerminatedBuffer(string.data(), string.size()), switch (request) {
[this] { broker.SignalStateChanged(); }); case Request::Calc: {
broker.PushNormalDataFromApplet(
std::make_shared<IStorage>(std::move(std::vector<u8>{1})));
broker.SignalStateChanged();
break;
}
default:
UNIMPLEMENTED_MSG("Request {:X} is not implemented", request);
break;
}
} }
} }
@ -108,9 +142,10 @@ void SoftwareKeyboard::Execute() {
} }
const auto parameters = ConvertToFrontendParameters(config, initial_text); const auto parameters = ConvertToFrontendParameters(config, initial_text);
if (!is_inline) {
frontend.RequestText([this](std::optional<std::u16string> text) { WriteText(std::move(text)); }, frontend.RequestText(
parameters); [this](std::optional<std::u16string> text) { WriteText(std::move(text)); }, parameters);
}
} }
void SoftwareKeyboard::WriteText(std::optional<std::u16string> text) { void SoftwareKeyboard::WriteText(std::optional<std::u16string> text) {

View File

@ -78,6 +78,7 @@ private:
KeyboardConfig config; KeyboardConfig config;
std::u16string initial_text; std::u16string initial_text;
bool complete = false; bool complete = false;
bool is_inline = false;
std::vector<u8> final_data; std::vector<u8> final_data;
}; };