diff --git a/src/core/libraries/ime/ime.cpp b/src/core/libraries/ime/ime.cpp index acfce53d6..7deef405c 100644 --- a/src/core/libraries/ime/ime.cpp +++ b/src/core/libraries/ime/ime.cpp @@ -21,8 +21,12 @@ public: LOG_INFO(Lib_Ime, "Creating ImeHandler for keyboard"); Init(param, false); } - ImeHandler(const OrbisImeParam* param) { + ImeHandler(const OrbisImeParam* param, const OrbisImeParamExtended* extended = nullptr) { LOG_INFO(Lib_Ime, "Creating ImeHandler for IME"); + if (extended) { + m_extended = *extended; + m_has_extended = true; + } Init(param, true); } ~ImeHandler() = default; @@ -61,8 +65,8 @@ public: }*/ if (ime_mode) { - g_ime_state = ImeState(&m_param.ime); - g_ime_ui = ImeUi(&g_ime_state, &m_param.ime); + g_ime_state = ImeState(&m_param.ime, m_has_extended ? &m_extended : nullptr); + g_ime_ui = ImeUi(&g_ime_state, &m_param.ime, m_has_extended ? &m_extended : nullptr); } } @@ -121,6 +125,9 @@ private: OrbisImeParam ime; } m_param{}; bool m_ime_mode = false; + + OrbisImeParamExtended m_extended{}; + bool m_has_extended = false; }; static std::unique_ptr g_ime_handler; @@ -616,7 +623,7 @@ Error PS4_SYSV_ABI sceImeOpen(const OrbisImeParam* param, const OrbisImeParamExt return Error::BUSY; } - g_ime_handler = std::make_unique(param); + g_ime_handler = std::make_unique(param, extended); if (!g_ime_handler) { LOG_ERROR(Lib_Ime, "Failed to create IME handler"); return Error::NO_MEMORY; // or Error::INTERNAL diff --git a/src/core/libraries/ime/ime_dialog_ui.cpp b/src/core/libraries/ime/ime_dialog_ui.cpp index f0a8de994..1d1638bd0 100644 --- a/src/core/libraries/ime/ime_dialog_ui.cpp +++ b/src/core/libraries/ime/ime_dialog_ui.cpp @@ -324,8 +324,8 @@ void ImeDialogUi::DrawInputText() { } const char* placeholder = state->placeholder.empty() ? nullptr : state->placeholder.data(); if (InputTextEx("##ImeDialogInput", placeholder, state->current_text.begin(), - state->max_text_length + 1, input_size, ImGuiInputTextFlags_CallbackCharFilter, - InputTextCallback, this)) { + state->max_text_length * 4 + 1, input_size, + ImGuiInputTextFlags_CallbackCharFilter, InputTextCallback, this)) { state->input_changed = true; } } @@ -340,7 +340,7 @@ void ImeDialogUi::DrawMultiLineInputText() { } const char* placeholder = state->placeholder.empty() ? nullptr : state->placeholder.data(); if (InputTextEx("##ImeDialogInput", placeholder, state->current_text.begin(), - state->max_text_length + 1, input_size, flags, InputTextCallback, this)) { + state->max_text_length * 4 + 1, input_size, flags, InputTextCallback, this)) { state->input_changed = true; } } diff --git a/src/core/libraries/ime/ime_dialog_ui.h b/src/core/libraries/ime/ime_dialog_ui.h index 48ddb3291..a0e03a523 100644 --- a/src/core/libraries/ime/ime_dialog_ui.h +++ b/src/core/libraries/ime/ime_dialog_ui.h @@ -33,7 +33,7 @@ class ImeDialogState final { std::vector placeholder; // A character can hold up to 4 bytes in UTF-8 - Common::CString current_text; + Common::CString current_text; public: /* diff --git a/src/core/libraries/ime/ime_ui.cpp b/src/core/libraries/ime/ime_ui.cpp index bf4f06507..e5ca681a7 100644 --- a/src/core/libraries/ime/ime_ui.cpp +++ b/src/core/libraries/ime/ime_ui.cpp @@ -10,7 +10,7 @@ using namespace ImGui; static constexpr ImVec2 BUTTON_SIZE{100.0f, 30.0f}; -ImeState::ImeState(const OrbisImeParam* param) { +ImeState::ImeState(const OrbisImeParam* param, const OrbisImeParamExtended* extended) { if (!param) { return; } @@ -18,6 +18,11 @@ ImeState::ImeState(const OrbisImeParam* param) { work_buffer = param->work; text_buffer = param->inputTextBuffer; + if (extended) { + extended_param = *extended; + has_extended = true; + } + std::size_t text_len = std::char_traits::length(text_buffer); if (!ConvertOrbisToUTF8(text_buffer, text_len, current_text.begin(), ORBIS_IME_MAX_TEXT_LENGTH * 4)) { @@ -82,7 +87,8 @@ bool ImeState::ConvertUTF8ToOrbis(const char* utf8_text, std::size_t utf8_text_l return true; } -ImeUi::ImeUi(ImeState* state, const OrbisImeParam* param) : state(state), ime_param(param) { +ImeUi::ImeUi(ImeState* state, const OrbisImeParam* param, const OrbisImeParamExtended* extended) + : state(state), ime_param(param), extended_param(extended) { if (param) { AddLayer(this); } @@ -182,8 +188,9 @@ void ImeUi::DrawInputText() { if (first_render) { SetKeyboardFocusHere(); } - if (InputTextEx("##ImeInput", nullptr, state->current_text.begin(), ime_param->maxTextLength, - input_size, ImGuiInputTextFlags_CallbackAlways, InputTextCallback, this)) { + if (InputTextEx("##ImeInput", nullptr, state->current_text.begin(), + ime_param->maxTextLength * 4 + 1, input_size, + ImGuiInputTextFlags_CallbackAlways, InputTextCallback, this)) { } } diff --git a/src/core/libraries/ime/ime_ui.h b/src/core/libraries/ime/ime_ui.h index 3eea22b8c..3e71200ed 100644 --- a/src/core/libraries/ime/ime_ui.h +++ b/src/core/libraries/ime/ime_ui.h @@ -25,14 +25,17 @@ class ImeState { void* work_buffer{}; char16_t* text_buffer{}; + OrbisImeParamExtended extended_param{}; + bool has_extended = false; + // A character can hold up to 4 bytes in UTF-8 - Common::CString current_text; + Common::CString current_text; std::queue event_queue; std::mutex queue_mutex; public: - ImeState(const OrbisImeParam* param = nullptr); + ImeState(const OrbisImeParam* param = nullptr, const OrbisImeParamExtended* extended = nullptr); ImeState(ImeState&& other) noexcept; ImeState& operator=(ImeState&& other) noexcept; @@ -53,12 +56,14 @@ private: class ImeUi : public ImGui::Layer { ImeState* state{}; const OrbisImeParam* ime_param{}; + const OrbisImeParamExtended* extended_param{}; bool first_render = true; std::mutex draw_mutex; public: - explicit ImeUi(ImeState* state = nullptr, const OrbisImeParam* param = nullptr); + explicit ImeUi(ImeState* state = nullptr, const OrbisImeParam* param = nullptr, + const OrbisImeParamExtended* extended = nullptr); ~ImeUi() override; ImeUi(const ImeUi& other) = delete; ImeUi& operator=(ImeUi&& other);