From 14fe2163f8c5f5f5a3292cc4394554d68d093a6a Mon Sep 17 00:00:00 2001 From: zonble Date: Tue, 26 Dec 2023 22:28:21 +0800 Subject: [PATCH 1/3] Asks the input method to use the vertical candidate window when there is a long candidate. --- src/McBopomofo.cpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/McBopomofo.cpp b/src/McBopomofo.cpp index a865d9d..d862972 100644 --- a/src/McBopomofo.cpp +++ b/src/McBopomofo.cpp @@ -741,6 +741,24 @@ void McBopomofoEngine::handleMarkingState(fcitx::InputContext* context, fcitx::CandidateLayoutHint McBopomofoEngine::getCandidateLayoutHint() const { fcitx::CandidateLayoutHint layoutHint = fcitx::CandidateLayoutHint::NotSet; + + auto choosingCandidate = + dynamic_cast(state_.get()); + if (choosingCandidate != nullptr) { + auto candidates = choosingCandidate->candidates; + for (auto candidate : candidates) { + if (candidate.value.length() > 8) { + return fcitx::CandidateLayoutHint::Vertical; + } + } + if (candidates.size() > 0) { + auto firstCandidate = candidates[0]; + if (firstCandidate.value.length() > 8) { + return fcitx::CandidateLayoutHint::Vertical; + } + } + } + switch (config_.candidateLayout.value()) { case McBopomofo::CandidateLayoutHint::Vertical: layoutHint = fcitx::CandidateLayoutHint::Vertical; From 51bf2e6cb6de49c0e32b8bd25102524b2a76defd Mon Sep 17 00:00:00 2001 From: zonble Date: Tue, 26 Dec 2023 22:40:44 +0800 Subject: [PATCH 2/3] Uses exact UTF32 code point count. --- src/McBopomofo.cpp | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/McBopomofo.cpp b/src/McBopomofo.cpp index d862972..ce673e1 100644 --- a/src/McBopomofo.cpp +++ b/src/McBopomofo.cpp @@ -747,13 +747,9 @@ fcitx::CandidateLayoutHint McBopomofoEngine::getCandidateLayoutHint() const { if (choosingCandidate != nullptr) { auto candidates = choosingCandidate->candidates; for (auto candidate : candidates) { - if (candidate.value.length() > 8) { - return fcitx::CandidateLayoutHint::Vertical; - } - } - if (candidates.size() > 0) { - auto firstCandidate = candidates[0]; - if (firstCandidate.value.length() > 8) { + std::wstring_convert, char32_t> conv; + auto u32 = conv.from_bytes(candidate.value); + if (u32.size() > 8) { return fcitx::CandidateLayoutHint::Vertical; } } From 36e26b8250d2a38055c64d48c40427030707ea3b Mon Sep 17 00:00:00 2001 From: zonble Date: Wed, 27 Dec 2023 01:36:00 +0800 Subject: [PATCH 3/3] Uses McBopomofo::CodePointCount to count code points. --- src/McBopomofo.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/McBopomofo.cpp b/src/McBopomofo.cpp index ce673e1..3173eb0 100644 --- a/src/McBopomofo.cpp +++ b/src/McBopomofo.cpp @@ -37,6 +37,7 @@ #include "Key.h" #include "Log.h" +#include "UTF8Helper.h" namespace McBopomofo { @@ -746,10 +747,9 @@ fcitx::CandidateLayoutHint McBopomofoEngine::getCandidateLayoutHint() const { dynamic_cast(state_.get()); if (choosingCandidate != nullptr) { auto candidates = choosingCandidate->candidates; - for (auto candidate : candidates) { - std::wstring_convert, char32_t> conv; - auto u32 = conv.from_bytes(candidate.value); - if (u32.size() > 8) { + for (InputStates::ChoosingCandidate::Candidate candidate : candidates) { + std::string value = candidate.value; + if (McBopomofo::CodePointCount(value) > 8) { return fcitx::CandidateLayoutHint::Vertical; } }