2 changed files with 236 additions and 2 deletions
-
140src/core/frontend/applets/software_keyboard.cpp
-
98src/core/frontend/applets/software_keyboard.h
@ -1,11 +1,149 @@ |
|||||
// Copyright 2018 yuzu emulator team
|
|
||||
|
// Copyright 2021 yuzu Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||
|
|
||||
|
#include <thread>
|
||||
|
|
||||
|
#include "common/logging/log.h"
|
||||
|
#include "common/string_util.h"
|
||||
#include "core/frontend/applets/software_keyboard.h"
|
#include "core/frontend/applets/software_keyboard.h"
|
||||
|
|
||||
namespace Core::Frontend { |
namespace Core::Frontend { |
||||
|
|
||||
SoftwareKeyboardApplet::~SoftwareKeyboardApplet() = default; |
SoftwareKeyboardApplet::~SoftwareKeyboardApplet() = default; |
||||
|
|
||||
|
DefaultSoftwareKeyboardApplet::~DefaultSoftwareKeyboardApplet() = default; |
||||
|
|
||||
|
void DefaultSoftwareKeyboardApplet::InitializeKeyboard( |
||||
|
bool is_inline, KeyboardInitializeParameters initialize_parameters, |
||||
|
std::function<void(Service::AM::Applets::SwkbdResult, std::u16string)> submit_normal_callback_, |
||||
|
std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)> |
||||
|
submit_inline_callback_) { |
||||
|
if (is_inline) { |
||||
|
LOG_WARNING( |
||||
|
Service_AM, |
||||
|
"(STUBBED) called, backend requested to initialize the inline software keyboard."); |
||||
|
|
||||
|
submit_inline_callback = std::move(submit_inline_callback_); |
||||
|
} else { |
||||
|
LOG_WARNING( |
||||
|
Service_AM, |
||||
|
"(STUBBED) called, backend requested to initialize the normal software keyboard."); |
||||
|
|
||||
|
submit_normal_callback = std::move(submit_normal_callback_); |
||||
|
} |
||||
|
|
||||
|
parameters = std::move(initialize_parameters); |
||||
|
|
||||
|
LOG_INFO(Service_AM, |
||||
|
"\nKeyboardInitializeParameters:" |
||||
|
"\nok_text={}" |
||||
|
"\nheader_text={}" |
||||
|
"\nsub_text={}" |
||||
|
"\nguide_text={}" |
||||
|
"\ninitial_text={}" |
||||
|
"\nmax_text_length={}" |
||||
|
"\nmin_text_length={}" |
||||
|
"\ninitial_cursor_position={}" |
||||
|
"\ntype={}" |
||||
|
"\npassword_mode={}" |
||||
|
"\ntext_draw_type={}" |
||||
|
"\nkey_disable_flags={}" |
||||
|
"\nuse_blur_background={}" |
||||
|
"\nenable_backspace_button={}" |
||||
|
"\nenable_return_button={}" |
||||
|
"\ndisable_cancel_button={}", |
||||
|
Common::UTF16ToUTF8(parameters.ok_text), Common::UTF16ToUTF8(parameters.header_text), |
||||
|
Common::UTF16ToUTF8(parameters.sub_text), Common::UTF16ToUTF8(parameters.guide_text), |
||||
|
Common::UTF16ToUTF8(parameters.initial_text), parameters.max_text_length, |
||||
|
parameters.min_text_length, parameters.initial_cursor_position, parameters.type, |
||||
|
parameters.password_mode, parameters.text_draw_type, parameters.key_disable_flags.raw, |
||||
|
parameters.use_blur_background, parameters.enable_backspace_button, |
||||
|
parameters.enable_return_button, parameters.disable_cancel_button); |
||||
|
} |
||||
|
|
||||
|
void DefaultSoftwareKeyboardApplet::ShowNormalKeyboard() const { |
||||
|
LOG_WARNING(Service_AM, |
||||
|
"(STUBBED) called, backend requested to show the normal software keyboard."); |
||||
|
|
||||
|
SubmitNormalText(u"yuzu"); |
||||
|
} |
||||
|
|
||||
|
void DefaultSoftwareKeyboardApplet::ShowTextCheckDialog( |
||||
|
Service::AM::Applets::SwkbdTextCheckResult text_check_result, |
||||
|
std::u16string text_check_message) const { |
||||
|
LOG_WARNING(Service_AM, "(STUBBED) called, backend requested to show the text check dialog."); |
||||
|
} |
||||
|
|
||||
|
void DefaultSoftwareKeyboardApplet::ShowInlineKeyboard( |
||||
|
InlineAppearParameters appear_parameters) const { |
||||
|
LOG_WARNING(Service_AM, |
||||
|
"(STUBBED) called, backend requested to show the inline software keyboard."); |
||||
|
|
||||
|
LOG_INFO(Service_AM, |
||||
|
"\nInlineAppearParameters:" |
||||
|
"\nmax_text_length={}" |
||||
|
"\nmin_text_length={}" |
||||
|
"\nkey_top_scale_x={}" |
||||
|
"\nkey_top_scale_y={}" |
||||
|
"\nkey_top_translate_x={}" |
||||
|
"\nkey_top_translate_y={}" |
||||
|
"\ntype={}" |
||||
|
"\nkey_disable_flags={}" |
||||
|
"\nkey_top_as_floating={}" |
||||
|
"\nenable_backspace_button={}" |
||||
|
"\nenable_return_button={}" |
||||
|
"\ndisable_cancel_button={}", |
||||
|
appear_parameters.max_text_length, appear_parameters.min_text_length, |
||||
|
appear_parameters.key_top_scale_x, appear_parameters.key_top_scale_y, |
||||
|
appear_parameters.key_top_translate_x, appear_parameters.key_top_translate_y, |
||||
|
appear_parameters.type, appear_parameters.key_disable_flags.raw, |
||||
|
appear_parameters.key_top_as_floating, appear_parameters.enable_backspace_button, |
||||
|
appear_parameters.enable_return_button, appear_parameters.disable_cancel_button); |
||||
|
|
||||
|
std::thread([this] { SubmitInlineText(u"yuzu"); }).detach(); |
||||
|
} |
||||
|
|
||||
|
void DefaultSoftwareKeyboardApplet::HideInlineKeyboard() const { |
||||
|
LOG_WARNING(Service_AM, |
||||
|
"(STUBBED) called, backend requested to hide the inline software keyboard."); |
||||
|
} |
||||
|
|
||||
|
void DefaultSoftwareKeyboardApplet::InlineTextChanged(InlineTextParameters text_parameters) const { |
||||
|
LOG_WARNING(Service_AM, |
||||
|
"(STUBBED) called, backend requested to change the inline keyboard text."); |
||||
|
|
||||
|
LOG_INFO(Service_AM, |
||||
|
"\nInlineTextParameters:" |
||||
|
"\ninput_text={}" |
||||
|
"\ncursor_position={}", |
||||
|
Common::UTF16ToUTF8(text_parameters.input_text), text_parameters.cursor_position); |
||||
|
|
||||
|
submit_inline_callback(Service::AM::Applets::SwkbdReplyType::ChangedString, |
||||
|
text_parameters.input_text, text_parameters.cursor_position); |
||||
|
} |
||||
|
|
||||
|
void DefaultSoftwareKeyboardApplet::ExitKeyboard() const { |
||||
|
LOG_WARNING(Service_AM, "(STUBBED) called, backend requested to exit the software keyboard."); |
||||
|
} |
||||
|
|
||||
|
void DefaultSoftwareKeyboardApplet::SubmitNormalText(std::u16string text) const { |
||||
|
submit_normal_callback(Service::AM::Applets::SwkbdResult::Ok, text); |
||||
|
} |
||||
|
|
||||
|
void DefaultSoftwareKeyboardApplet::SubmitInlineText(std::u16string_view text) const { |
||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(500)); |
||||
|
|
||||
|
for (std::size_t index = 0; index < text.size(); ++index) { |
||||
|
submit_inline_callback(Service::AM::Applets::SwkbdReplyType::ChangedString, |
||||
|
std::u16string(text.data(), text.data() + index + 1), |
||||
|
static_cast<s32>(index) + 1); |
||||
|
|
||||
|
std::this_thread::sleep_for(std::chrono::milliseconds(250)); |
||||
|
} |
||||
|
|
||||
|
submit_inline_callback(Service::AM::Applets::SwkbdReplyType::DecidedEnter, std::u16string(text), |
||||
|
static_cast<s32>(text.size())); |
||||
|
} |
||||
|
|
||||
} // namespace Core::Frontend
|
} // namespace Core::Frontend
|
||||
@ -1,20 +1,116 @@ |
|||||
// Copyright 2018 yuzu emulator team |
|
||||
|
// Copyright 2021 yuzu Emulator Project |
||||
// Licensed under GPLv2 or any later version |
// Licensed under GPLv2 or any later version |
||||
// Refer to the license.txt file included. |
// Refer to the license.txt file included. |
||||
|
|
||||
#pragma once |
#pragma once |
||||
|
|
||||
|
#include <functional> |
||||
|
#include <thread> |
||||
|
|
||||
#include "common/common_types.h" |
#include "common/common_types.h" |
||||
|
|
||||
|
#include "core/hle/service/am/applets/software_keyboard_types.h" |
||||
|
|
||||
namespace Core::Frontend { |
namespace Core::Frontend { |
||||
|
|
||||
|
struct KeyboardInitializeParameters { |
||||
|
std::u16string ok_text; |
||||
|
std::u16string header_text; |
||||
|
std::u16string sub_text; |
||||
|
std::u16string guide_text; |
||||
|
std::u16string initial_text; |
||||
|
u32 max_text_length; |
||||
|
u32 min_text_length; |
||||
|
s32 initial_cursor_position; |
||||
|
Service::AM::Applets::SwkbdType type; |
||||
|
Service::AM::Applets::SwkbdPasswordMode password_mode; |
||||
|
Service::AM::Applets::SwkbdTextDrawType text_draw_type; |
||||
|
Service::AM::Applets::SwkbdKeyDisableFlags key_disable_flags; |
||||
|
bool use_blur_background; |
||||
|
bool enable_backspace_button; |
||||
|
bool enable_return_button; |
||||
|
bool disable_cancel_button; |
||||
|
}; |
||||
|
|
||||
|
struct InlineAppearParameters { |
||||
|
u32 max_text_length; |
||||
|
u32 min_text_length; |
||||
|
f32 key_top_scale_x; |
||||
|
f32 key_top_scale_y; |
||||
|
f32 key_top_translate_x; |
||||
|
f32 key_top_translate_y; |
||||
|
Service::AM::Applets::SwkbdType type; |
||||
|
Service::AM::Applets::SwkbdKeyDisableFlags key_disable_flags; |
||||
|
bool key_top_as_floating; |
||||
|
bool enable_backspace_button; |
||||
|
bool enable_return_button; |
||||
|
bool disable_cancel_button; |
||||
|
}; |
||||
|
|
||||
|
struct InlineTextParameters { |
||||
|
std::u16string input_text; |
||||
|
s32 cursor_position; |
||||
|
}; |
||||
|
|
||||
class SoftwareKeyboardApplet { |
class SoftwareKeyboardApplet { |
||||
public: |
public: |
||||
virtual ~SoftwareKeyboardApplet(); |
virtual ~SoftwareKeyboardApplet(); |
||||
|
|
||||
|
virtual void InitializeKeyboard( |
||||
|
bool is_inline, KeyboardInitializeParameters initialize_parameters, |
||||
|
std::function<void(Service::AM::Applets::SwkbdResult, std::u16string)> |
||||
|
submit_normal_callback_, |
||||
|
std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)> |
||||
|
submit_inline_callback_) = 0; |
||||
|
|
||||
|
virtual void ShowNormalKeyboard() const = 0; |
||||
|
|
||||
|
virtual void ShowTextCheckDialog(Service::AM::Applets::SwkbdTextCheckResult text_check_result, |
||||
|
std::u16string text_check_message) const = 0; |
||||
|
|
||||
|
virtual void ShowInlineKeyboard(InlineAppearParameters appear_parameters) const = 0; |
||||
|
|
||||
|
virtual void HideInlineKeyboard() const = 0; |
||||
|
|
||||
|
virtual void InlineTextChanged(InlineTextParameters text_parameters) const = 0; |
||||
|
|
||||
|
virtual void ExitKeyboard() const = 0; |
||||
}; |
}; |
||||
|
|
||||
class DefaultSoftwareKeyboardApplet final : public SoftwareKeyboardApplet { |
class DefaultSoftwareKeyboardApplet final : public SoftwareKeyboardApplet { |
||||
public: |
public: |
||||
|
~DefaultSoftwareKeyboardApplet() override; |
||||
|
|
||||
|
void InitializeKeyboard( |
||||
|
bool is_inline, KeyboardInitializeParameters initialize_parameters, |
||||
|
std::function<void(Service::AM::Applets::SwkbdResult, std::u16string)> |
||||
|
submit_normal_callback_, |
||||
|
std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)> |
||||
|
submit_inline_callback_) override; |
||||
|
|
||||
|
void ShowNormalKeyboard() const override; |
||||
|
|
||||
|
void ShowTextCheckDialog(Service::AM::Applets::SwkbdTextCheckResult text_check_result, |
||||
|
std::u16string text_check_message) const override; |
||||
|
|
||||
|
void ShowInlineKeyboard(InlineAppearParameters appear_parameters) const override; |
||||
|
|
||||
|
void HideInlineKeyboard() const override; |
||||
|
|
||||
|
void InlineTextChanged(InlineTextParameters text_parameters) const override; |
||||
|
|
||||
|
void ExitKeyboard() const override; |
||||
|
|
||||
|
private: |
||||
|
void SubmitNormalText(std::u16string text) const; |
||||
|
void SubmitInlineText(std::u16string_view text) const; |
||||
|
|
||||
|
KeyboardInitializeParameters parameters; |
||||
|
|
||||
|
mutable std::function<void(Service::AM::Applets::SwkbdResult, std::u16string)> |
||||
|
submit_normal_callback; |
||||
|
mutable std::function<void(Service::AM::Applets::SwkbdReplyType, std::u16string, s32)> |
||||
|
submit_inline_callback; |
||||
}; |
}; |
||||
|
|
||||
} // namespace Core::Frontend |
} // namespace Core::Frontend |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue