mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	Merge pull request #4380 from ogniK5377/swkbd-inline-1
swkbd: Return result for Calc request for inlined swkbd
This commit is contained in:
		
						commit
						d046e9b458
					
				| @ -13,11 +13,23 @@ | |||||||
| 
 | 
 | ||||||
| namespace Service::AM::Applets { | namespace Service::AM::Applets { | ||||||
| 
 | 
 | ||||||
|  | namespace { | ||||||
|  | enum class Request : u32 { | ||||||
|  |     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; | ||||||
| 
 | } // Anonymous 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) { | ||||||
|  | |||||||
| @ -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; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 bunnei
						bunnei