From 2d41bbb6c4c171d7e5a873b5b441eb0b8749cdfe Mon Sep 17 00:00:00 2001 From: fanlusky <1730976608@qq.com> Date: Mon, 22 Jun 2026 12:37:55 +0800 Subject: [PATCH] Fix the preedit behavior during full-pinyin word creation. --- server/src/ipc/event_listener.cpp | 10 +++++++--- server/src/session/engine_input_session.cpp | 10 +--------- .../tests/src/test_engine_shuangpin_session.cpp | 16 ++++++++++++++++ 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/server/src/ipc/event_listener.cpp b/server/src/ipc/event_listener.cpp index faa8df1c..8d0244bb 100644 --- a/server/src/ipc/event_listener.cpp +++ b/server/src/ipc/event_listener.cpp @@ -40,6 +40,11 @@ static UINT s_punc_switch_keycode = 0; namespace { +std::wstring BuildCreateWordPipePayload(const std::string &remaining_raw_input_with_cases, const std::string ¤t_word) +{ + return string_to_wstring(remaining_raw_input_with_cases + "\t" + current_word); +} + std::string BuildCurrentCandidatePage() { auto &ui = Global::candidate_ui; @@ -945,9 +950,8 @@ void ProcessSelectionKey(UINT keycode) GlobalIme::composition.creating_word.word = creating_word_progress.word; GlobalIme::composition.creating_word.preedit = creating_word_progress.preedit; /* 更新一下中间态的造词时 tsf 端所需的数据 */ - Global::candidate_ui.selected_text = - string_to_wstring(GlobalIme::composition.creating_word.pinyin + "," + - GlobalIme::composition.creating_word.word); + Global::candidate_ui.selected_text = BuildCreateWordPipePayload( + g_inputSession->get_pinyin_sequence_with_cases(), GlobalIme::composition.creating_word.word); if (creating_word_progress.completed) { /* 最终的造词 */ #ifdef FANY_DEBUG diff --git a/server/src/session/engine_input_session.cpp b/server/src/session/engine_input_session.cpp index 54f7f4ac..94cf2923 100644 --- a/server/src/session/engine_input_session.cpp +++ b/server/src/session/engine_input_session.cpp @@ -298,15 +298,7 @@ IInputSession::SelectionTransition EngineInputSession::advance_composition_after const std::string current_segmentation_with_cases = get_pinyin_segmentation_with_cases(); const std::string selected_pure_pinyin = remove_delimiters(selected_pinyin); - size_t consumed_raw_length = 0; - if (!selected_pinyin.empty() && current_segmentation_with_cases.rfind(selected_pinyin, 0) == 0) - { - consumed_raw_length = selected_pinyin.size(); - } - else - { - consumed_raw_length = raw_length_for_normalized_prefix(request().raw_input_with_cases, selected_pure_pinyin.size()); - } + size_t consumed_raw_length = raw_length_for_normalized_prefix(request().raw_input_with_cases, selected_pure_pinyin.size()); transition.continues_composition = !selected_pure_pinyin.empty() && selected_pure_pinyin.size() < transition.full_pure_pinyin.size() && diff --git a/server/tests/src/test_engine_shuangpin_session.cpp b/server/tests/src/test_engine_shuangpin_session.cpp index 90aaac41..07a25c4c 100644 --- a/server/tests/src/test_engine_shuangpin_session.cpp +++ b/server/tests/src/test_engine_shuangpin_session.cpp @@ -132,3 +132,19 @@ TEST_CASE(EngineQuanpinSessionCompletesCreatingWordProgress) REQUIRE_EQ(second_progress.pinyin, std::string("xitele")); REQUIRE_EQ(second_progress.word, std::string("西特乐")); } + +TEST_CASE(EngineQuanpinSessionContinuesCompositionAfterMultiSyllableSelection) +{ + EngineInputSession session(SchemeType::Quanpin); + InputLetters(session, "zhengxianghuafen"); + + const auto transition = session.advance_composition_after_selection("zheng'xiang", "正向"); + REQUIRE(transition.continues_composition); + REQUIRE_EQ(session.get_pinyin_sequence(), std::string("huafen")); + REQUIRE_EQ(session.get_pinyin_segmentation_with_cases(), std::string("hua'fen")); + + const auto progress = session.update_creating_word_progress("", "", "正向", transition); + REQUIRE_EQ(progress.pinyin, std::string("zhengxianghuafen")); + REQUIRE_EQ(progress.word, std::string("正向")); + REQUIRE_EQ(progress.preedit, std::string("正向hua'fen")); +}