applets/swkbd: Implement the Default Software Keyboard frontend
This commit is contained in:
parent
5bc9f15c6d
commit
578e6c5a57
|
@ -1,11 +1,149 @@
|
|||
// Copyright 2018 yuzu emulator team
|
||||
// Copyright 2021 yuzu Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// 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"
|
||||
|
||||
namespace Core::Frontend {
|
||||
|
||||
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
|
||||
|
|
|
@ -1,20 +1,116 @@
|
|||
// Copyright 2018 yuzu emulator team
|
||||
// Copyright 2021 yuzu Emulator Project
|
||||
// Licensed under GPLv2 or any later version
|
||||
// Refer to the license.txt file included.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <functional>
|
||||
#include <thread>
|
||||
|
||||
#include "common/common_types.h"
|
||||
|
||||
#include "core/hle/service/am/applets/software_keyboard_types.h"
|
||||
|
||||
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 {
|
||||
public:
|
||||
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 {
|
||||
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
|
||||
|
|
Reference in New Issue