4 changed files with 1488 additions and 13 deletions
-
1src/core/CMakeLists.txt
-
1067src/core/hle/service/am/applets/software_keyboard.cpp
-
138src/core/hle/service/am/applets/software_keyboard.h
-
295src/core/hle/service/am/applets/software_keyboard_types.h
1067
src/core/hle/service/am/applets/software_keyboard.cpp
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -0,0 +1,295 @@ |
|||||
|
// Copyright 2021 yuzu Emulator Project |
||||
|
// Licensed under GPLv2 or any later version |
||||
|
// Refer to the license.txt file included. |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
#include <array> |
||||
|
|
||||
|
#include "common/bit_field.h" |
||||
|
#include "common/common_funcs.h" |
||||
|
#include "common/common_types.h" |
||||
|
#include "common/swap.h" |
||||
|
|
||||
|
namespace Service::AM::Applets { |
||||
|
|
||||
|
constexpr std::size_t MAX_OK_TEXT_LENGTH = 8; |
||||
|
constexpr std::size_t MAX_HEADER_TEXT_LENGTH = 64; |
||||
|
constexpr std::size_t MAX_SUB_TEXT_LENGTH = 128; |
||||
|
constexpr std::size_t MAX_GUIDE_TEXT_LENGTH = 256; |
||||
|
constexpr std::size_t STRING_BUFFER_SIZE = 0x7D4; |
||||
|
|
||||
|
enum class SwkbdAppletVersion : u32_le { |
||||
|
Version5 = 0x5, // 1.0.0 |
||||
|
Version65542 = 0x10006, // 2.0.0 - 2.3.0 |
||||
|
Version196615 = 0x30007, // 3.0.0 - 3.0.2 |
||||
|
Version262152 = 0x40008, // 4.0.0 - 4.1.0 |
||||
|
Version327689 = 0x50009, // 5.0.0 - 5.1.0 |
||||
|
Version393227 = 0x6000B, // 6.0.0 - 7.0.1 |
||||
|
Version524301 = 0x8000D, // 8.0.0+ |
||||
|
}; |
||||
|
|
||||
|
enum class SwkbdType : u32 { |
||||
|
Normal, |
||||
|
NumberPad, |
||||
|
Qwerty, |
||||
|
Unknown3, |
||||
|
Latin, |
||||
|
SimplifiedChinese, |
||||
|
TraditionalChinese, |
||||
|
Korean, |
||||
|
}; |
||||
|
|
||||
|
enum class SwkbdInitialCursorPosition : u32 { |
||||
|
Start, |
||||
|
End, |
||||
|
}; |
||||
|
|
||||
|
enum class SwkbdPasswordMode : u32 { |
||||
|
Disabled, |
||||
|
Enabled, |
||||
|
}; |
||||
|
|
||||
|
enum class SwkbdTextDrawType : u32 { |
||||
|
Line, |
||||
|
Box, |
||||
|
DownloadCode, |
||||
|
}; |
||||
|
|
||||
|
enum class SwkbdResult : u32 { |
||||
|
Ok, |
||||
|
Cancel, |
||||
|
}; |
||||
|
|
||||
|
enum class SwkbdTextCheckResult : u32 { |
||||
|
Success, |
||||
|
Failure, |
||||
|
Confirm, |
||||
|
Silent, |
||||
|
}; |
||||
|
|
||||
|
enum class SwkbdState : u32 { |
||||
|
NotInitialized = 0x0, |
||||
|
InitializedIsHidden = 0x1, |
||||
|
InitializedIsAppearing = 0x2, |
||||
|
InitializedIsShown = 0x3, |
||||
|
InitializedIsDisappearing = 0x4, |
||||
|
}; |
||||
|
|
||||
|
enum class SwkbdRequestCommand : u32 { |
||||
|
Finalize = 0x4, |
||||
|
SetUserWordInfo = 0x6, |
||||
|
SetCustomizeDic = 0x7, |
||||
|
Calc = 0xA, |
||||
|
SetCustomizedDictionaries = 0xB, |
||||
|
UnsetCustomizedDictionaries = 0xC, |
||||
|
SetChangedStringV2Flag = 0xD, |
||||
|
SetMovedCursorV2Flag = 0xE, |
||||
|
}; |
||||
|
|
||||
|
enum class SwkbdReplyType : u32 { |
||||
|
FinishedInitialize = 0x0, |
||||
|
Default = 0x1, |
||||
|
ChangedString = 0x2, |
||||
|
MovedCursor = 0x3, |
||||
|
MovedTab = 0x4, |
||||
|
DecidedEnter = 0x5, |
||||
|
DecidedCancel = 0x6, |
||||
|
ChangedStringUtf8 = 0x7, |
||||
|
MovedCursorUtf8 = 0x8, |
||||
|
DecidedEnterUtf8 = 0x9, |
||||
|
UnsetCustomizeDic = 0xA, |
||||
|
ReleasedUserWordInfo = 0xB, |
||||
|
UnsetCustomizedDictionaries = 0xC, |
||||
|
ChangedStringV2 = 0xD, |
||||
|
MovedCursorV2 = 0xE, |
||||
|
ChangedStringUtf8V2 = 0xF, |
||||
|
MovedCursorUtf8V2 = 0x10, |
||||
|
}; |
||||
|
|
||||
|
struct SwkbdKeyDisableFlags { |
||||
|
union { |
||||
|
u32 raw{}; |
||||
|
|
||||
|
BitField<1, 1, u32> space; |
||||
|
BitField<2, 1, u32> at; |
||||
|
BitField<3, 1, u32> percent; |
||||
|
BitField<4, 1, u32> slash; |
||||
|
BitField<5, 1, u32> backslash; |
||||
|
BitField<6, 1, u32> numbers; |
||||
|
BitField<7, 1, u32> download_code; |
||||
|
BitField<8, 1, u32> username; |
||||
|
}; |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdKeyDisableFlags) == 0x4, "SwkbdKeyDisableFlags has incorrect size."); |
||||
|
|
||||
|
struct SwkbdConfigCommon { |
||||
|
SwkbdType type{}; |
||||
|
std::array<char16_t, MAX_OK_TEXT_LENGTH + 1> ok_text{}; |
||||
|
char16_t left_optional_symbol_key{}; |
||||
|
char16_t right_optional_symbol_key{}; |
||||
|
bool use_prediction{}; |
||||
|
INSERT_PADDING_BYTES(1); |
||||
|
SwkbdKeyDisableFlags key_disable_flags{}; |
||||
|
SwkbdInitialCursorPosition initial_cursor_position{}; |
||||
|
std::array<char16_t, MAX_HEADER_TEXT_LENGTH + 1> header_text{}; |
||||
|
std::array<char16_t, MAX_SUB_TEXT_LENGTH + 1> sub_text{}; |
||||
|
std::array<char16_t, MAX_GUIDE_TEXT_LENGTH + 1> guide_text{}; |
||||
|
u32 max_text_length{}; |
||||
|
u32 min_text_length{}; |
||||
|
SwkbdPasswordMode password_mode{}; |
||||
|
SwkbdTextDrawType text_draw_type{}; |
||||
|
bool enable_return_button{}; |
||||
|
bool use_utf8{}; |
||||
|
bool use_blur_background{}; |
||||
|
INSERT_PADDING_BYTES(1); |
||||
|
u32 initial_string_offset{}; |
||||
|
u32 initial_string_length{}; |
||||
|
u32 user_dictionary_offset{}; |
||||
|
u32 user_dictionary_entries{}; |
||||
|
bool use_text_check{}; |
||||
|
INSERT_PADDING_BYTES(3); |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdConfigCommon) == 0x3D4, "SwkbdConfigCommon has incorrect size."); |
||||
|
|
||||
|
#pragma pack(push, 4) |
||||
|
// SwkbdAppletVersion 0x5, 0x10006 |
||||
|
struct SwkbdConfigOld { |
||||
|
INSERT_PADDING_WORDS(1); |
||||
|
VAddr text_check_callback{}; |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdConfigOld) == 0x3E0 - sizeof(SwkbdConfigCommon), |
||||
|
"SwkbdConfigOld has incorrect size."); |
||||
|
|
||||
|
// SwkbdAppletVersion 0x30007, 0x40008, 0x50009 |
||||
|
struct SwkbdConfigOld2 { |
||||
|
INSERT_PADDING_WORDS(1); |
||||
|
VAddr text_check_callback{}; |
||||
|
std::array<u32, 8> text_grouping{}; |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdConfigOld2) == 0x400 - sizeof(SwkbdConfigCommon), |
||||
|
"SwkbdConfigOld2 has incorrect size."); |
||||
|
|
||||
|
// SwkbdAppletVersion 0x6000B, 0x8000D |
||||
|
struct SwkbdConfigNew { |
||||
|
std::array<u32, 8> text_grouping{}; |
||||
|
std::array<u64, 24> customized_dictionary_set_entries{}; |
||||
|
u8 total_customized_dictionary_set_entries{}; |
||||
|
bool disable_cancel_button{}; |
||||
|
INSERT_PADDING_BYTES(18); |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdConfigNew) == 0x4C8 - sizeof(SwkbdConfigCommon), |
||||
|
"SwkbdConfigNew has incorrect size."); |
||||
|
#pragma pack(pop) |
||||
|
|
||||
|
struct SwkbdTextCheck { |
||||
|
SwkbdTextCheckResult text_check_result{}; |
||||
|
std::array<char16_t, STRING_BUFFER_SIZE / 2> text_check_message{}; |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdTextCheck) == 0x7D8, "SwkbdTextCheck has incorrect size."); |
||||
|
|
||||
|
struct SwkbdCalcArgFlags { |
||||
|
union { |
||||
|
u64 raw{}; |
||||
|
|
||||
|
BitField<0, 1, u64> set_initialize_arg; |
||||
|
BitField<1, 1, u64> set_volume; |
||||
|
BitField<2, 1, u64> appear; |
||||
|
BitField<3, 1, u64> set_input_text; |
||||
|
BitField<4, 1, u64> set_cursor_position; |
||||
|
BitField<5, 1, u64> set_utf8_mode; |
||||
|
BitField<6, 1, u64> unset_customize_dic; |
||||
|
BitField<7, 1, u64> disappear; |
||||
|
BitField<8, 1, u64> unknown; |
||||
|
BitField<9, 1, u64> set_key_top_translate_scale; |
||||
|
BitField<10, 1, u64> unset_user_word_info; |
||||
|
BitField<11, 1, u64> set_disable_hardware_keyboard; |
||||
|
}; |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdCalcArgFlags) == 0x8, "SwkbdCalcArgFlags has incorrect size."); |
||||
|
|
||||
|
struct SwkbdInitializeArg { |
||||
|
u32 unknown{}; |
||||
|
bool library_applet_mode_flag{}; |
||||
|
bool is_above_hos_500{}; |
||||
|
INSERT_PADDING_BYTES(2); |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdInitializeArg) == 0x8, "SwkbdInitializeArg has incorrect size."); |
||||
|
|
||||
|
struct SwkbdAppearArg { |
||||
|
SwkbdType type{}; |
||||
|
std::array<char16_t, MAX_OK_TEXT_LENGTH + 1> ok_text{}; |
||||
|
char16_t left_optional_symbol_key{}; |
||||
|
char16_t right_optional_symbol_key{}; |
||||
|
bool use_prediction{}; |
||||
|
bool disable_cancel_button{}; |
||||
|
SwkbdKeyDisableFlags key_disable_flags{}; |
||||
|
u32 max_text_length{}; |
||||
|
u32 min_text_length{}; |
||||
|
bool enable_return_button{}; |
||||
|
INSERT_PADDING_BYTES(3); |
||||
|
u32 flags{}; |
||||
|
INSERT_PADDING_WORDS(6); |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdAppearArg) == 0x48, "SwkbdAppearArg has incorrect size."); |
||||
|
|
||||
|
struct SwkbdCalcArg { |
||||
|
u32 unknown{}; |
||||
|
u16 calc_arg_size{}; |
||||
|
INSERT_PADDING_BYTES(2); |
||||
|
SwkbdCalcArgFlags flags{}; |
||||
|
SwkbdInitializeArg initialize_arg{}; |
||||
|
f32 volume{}; |
||||
|
s32 cursor_position{}; |
||||
|
SwkbdAppearArg appear_arg{}; |
||||
|
std::array<char16_t, 0x1FA> input_text{}; |
||||
|
bool utf8_mode{}; |
||||
|
INSERT_PADDING_BYTES(1); |
||||
|
bool enable_backspace_button{}; |
||||
|
INSERT_PADDING_BYTES(3); |
||||
|
bool key_top_as_floating{}; |
||||
|
bool footer_scalable{}; |
||||
|
bool alpha_enabled_in_input_mode{}; |
||||
|
u8 input_mode_fade_type{}; |
||||
|
bool disable_touch{}; |
||||
|
bool disable_hardware_keyboard{}; |
||||
|
INSERT_PADDING_BYTES(8); |
||||
|
f32 key_top_scale_x{}; |
||||
|
f32 key_top_scale_y{}; |
||||
|
f32 key_top_translate_x{}; |
||||
|
f32 key_top_translate_y{}; |
||||
|
f32 key_top_bg_alpha{}; |
||||
|
f32 footer_bg_alpha{}; |
||||
|
f32 balloon_scale{}; |
||||
|
INSERT_PADDING_WORDS(4); |
||||
|
u8 se_group{}; |
||||
|
INSERT_PADDING_BYTES(3); |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdCalcArg) == 0x4A0, "SwkbdCalcArg has incorrect size."); |
||||
|
|
||||
|
struct SwkbdChangedStringArg { |
||||
|
u32 text_length{}; |
||||
|
s32 dictionary_start_cursor_position{}; |
||||
|
s32 dictionary_end_cursor_position{}; |
||||
|
s32 cursor_position{}; |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdChangedStringArg) == 0x10, "SwkbdChangedStringArg has incorrect size."); |
||||
|
|
||||
|
struct SwkbdMovedCursorArg { |
||||
|
u32 text_length{}; |
||||
|
s32 cursor_position{}; |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdMovedCursorArg) == 0x8, "SwkbdMovedCursorArg has incorrect size."); |
||||
|
|
||||
|
struct SwkbdMovedTabArg { |
||||
|
u32 text_length{}; |
||||
|
s32 cursor_position{}; |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdMovedTabArg) == 0x8, "SwkbdMovedTabArg has incorrect size."); |
||||
|
|
||||
|
struct SwkbdDecidedEnterArg { |
||||
|
u32 text_length{}; |
||||
|
}; |
||||
|
static_assert(sizeof(SwkbdDecidedEnterArg) == 0x4, "SwkbdDecidedEnterArg has incorrect size."); |
||||
|
|
||||
|
} // namespace Service::AM::Applets |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue