From 3d402c7d33772a39415cf47842ef855c59a49acd Mon Sep 17 00:00:00 2001 From: Jarkko Koivikko Date: Thu, 2 Sep 2021 11:46:59 +0300 Subject: cerence: xt9: Add special case for an invalid input (as reported by xt9) If the xt9 selection list build fails due to ET9STATUS_INVALID_INPUT, remove the symbol and select preferred candidate from the previous selection list. After this, start new input sequence using the rejected symbol as initial symbol. Pick-to: 6.2 Change-Id: Ib55d7391045c8d9c1db109e3ecd3855c71f45449 Reviewed-by: Mitch Curtis Reviewed-by: Jarkko Koivikko --- .../cerence/xt9/plugin/xt9inputmethodprivate.cpp | 58 ++++++++++++++++++++-- .../cerence/xt9/plugin/xt9inputmethodprivate_p.h | 1 + src/plugins/cerence/xt9/xt9common/xt9awime.cpp | 3 +- src/plugins/cerence/xt9/xt9common/xt9awime.h | 2 +- src/plugins/cerence/xt9/xt9common/xt9cpime.cpp | 5 +- src/plugins/cerence/xt9/xt9common/xt9cpime.h | 2 +- src/plugins/cerence/xt9/xt9common/xt9ime.cpp | 6 +++ src/plugins/cerence/xt9/xt9common/xt9ime.h | 3 +- 8 files changed, 68 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/plugins/cerence/xt9/plugin/xt9inputmethodprivate.cpp b/src/plugins/cerence/xt9/plugin/xt9inputmethodprivate.cpp index aee3197b..66510475 100644 --- a/src/plugins/cerence/xt9/plugin/xt9inputmethodprivate.cpp +++ b/src/plugins/cerence/xt9/plugin/xt9inputmethodprivate.cpp @@ -278,10 +278,18 @@ void Xt9InputMethodPrivate::updatePreeditText() } void Xt9InputMethodPrivate::buildSelectionList() +{ + ET9STATUS eStatus = ET9STATUS_NONE; + buildSelectionList(eStatus); +} + +void Xt9InputMethodPrivate::buildSelectionList(ET9STATUS &eStatus) { ET9U16 gestureValue; Xt9DeferredSelectionListUpdate deferredSelectionListUpdate(this); + eStatus = ET9STATUS_NONE; + if (xt9Ime()->exactWord().isEmpty()) { // Check if next word prediction is not allowed Q_Q(Xt9InputMethod); @@ -296,7 +304,7 @@ void Xt9InputMethodPrivate::buildSelectionList() xt9Ime()->cursorMoved(); } - selectionList = xt9Ime()->buildSelectionList(&defaultListIndex, &gestureValue); + selectionList = xt9Ime()->buildSelectionList(&defaultListIndex, &gestureValue, eStatus); } void Xt9InputMethodPrivate::selectionListUpdate() @@ -357,7 +365,7 @@ bool Xt9InputMethodPrivate::processKeyBySymbol(const QChar &symbol) const ET9U8 currIndexInList = defaultListIndex < 0 ? ET9_NO_ACTIVE_INDEX : static_cast(defaultListIndex); const ET9BOOL bInitialSymCheck = 1; - const ET9U32 dwTimeMS = static_cast(QDateTime::currentMSecsSinceEpoch()); + ET9U32 dwTimeMS = static_cast(QDateTime::currentMSecsSinceEpoch()); eStatus = XT9_API(ET9KDB_ProcessKeyBySymbol, &xt9Ime()->sKdbInfo, @@ -367,14 +375,56 @@ bool Xt9InputMethodPrivate::processKeyBySymbol(const QChar &symbol) &functionKey, bInitialSymCheck); - if (eStatus == ET9STATUS_NO_KEY) { + const bool noKey = eStatus == ET9STATUS_NO_KEY; + if (noKey) { const ET9INPUTSHIFTSTATE eShiftState = ET9SHIFT_STATE(&xt9Ime()->sWordSymbInfo); eStatus = XT9_API(ET9AddExplicitSymb, &xt9Ime()->sWordSymbInfo, symbol.unicode(), dwTimeMS, eShiftState, 0); + } else if (eStatus == ET9STATUS_FULL) { + /* + Reject input when buffer is full. If we would return false, + the input would be added as an explicit symbol to text editor, + which is not what is wanted. + */ + return true; } else if (eStatus) { return false; } - buildSelectionList(); + Xt9DeferredSelectionListUpdate deferredSelectionListUpdate(this); + buildSelectionList(eStatus); + if (eStatus == ET9STATUS_INVALID_INPUT) { + /* + The symbol rejected as an invalid input: + 1. Remove the symbol and rebuild selection list + 2. Select the default candidate from selection list and finalize input (update) + 3. Start new input with the symbol + */ + + XT9_API(ET9ClearOneSymb, &xt9Ime()->sWordSymbInfo); + buildSelectionList(eStatus); + + Q_Q(Xt9InputMethod); + q->update(); + + dwTimeMS = static_cast(QDateTime::currentMSecsSinceEpoch()); + if (noKey) { + const ET9INPUTSHIFTSTATE eShiftState = ET9SHIFT_STATE(&xt9Ime()->sWordSymbInfo); + XT9_API(ET9AddExplicitSymb, + &xt9Ime()->sWordSymbInfo, + symbol.unicode(), + dwTimeMS, + eShiftState, 0); + } else { + XT9_API(ET9KDB_ProcessKeyBySymbol, + &xt9Ime()->sKdbInfo, + symbol.unicode(), + dwTimeMS, + ET9_NO_ACTIVE_INDEX, + &functionKey, + bInitialSymCheck); + } + buildSelectionList(); + } updatePreeditText(); return true; diff --git a/src/plugins/cerence/xt9/plugin/xt9inputmethodprivate_p.h b/src/plugins/cerence/xt9/plugin/xt9inputmethodprivate_p.h index 70f5dda4..145f79c9 100644 --- a/src/plugins/cerence/xt9/plugin/xt9inputmethodprivate_p.h +++ b/src/plugins/cerence/xt9/plugin/xt9inputmethodprivate_p.h @@ -66,6 +66,7 @@ public: bool updateLayout(); virtual void updatePreeditText(); void buildSelectionList(); + void buildSelectionList(ET9STATUS &eStatus); void selectionListUpdate(); virtual void selectionListSelectItem(int index) = 0; void updatePunctuationBreaking(); diff --git a/src/plugins/cerence/xt9/xt9common/xt9awime.cpp b/src/plugins/cerence/xt9/xt9common/xt9awime.cpp index 912b65e3..fa84efc9 100644 --- a/src/plugins/cerence/xt9/xt9common/xt9awime.cpp +++ b/src/plugins/cerence/xt9/xt9common/xt9awime.cpp @@ -86,9 +86,8 @@ bool Xt9AwIme::dlmInit(void *data, qint64 size) return !eStatus; } -QStringList Xt9AwIme::buildSelectionList(int *defaultListIndex, ET9U16 *gestureValue) +QStringList Xt9AwIme::buildSelectionList(int *defaultListIndex, ET9U16 *gestureValue, ET9STATUS &eStatus) { - ET9STATUS eStatus; ET9U8 totalWords; ET9U8 listIndex; diff --git a/src/plugins/cerence/xt9/xt9common/xt9awime.h b/src/plugins/cerence/xt9/xt9common/xt9awime.h index 5a1c688f..29d0ad89 100644 --- a/src/plugins/cerence/xt9/xt9common/xt9awime.h +++ b/src/plugins/cerence/xt9/xt9common/xt9awime.h @@ -46,7 +46,7 @@ public: qint64 dlmPreferredSize() const override; bool dlmInit(void *data, qint64 size) override; - QStringList buildSelectionList(int *defaultListIndex, ET9U16 *gestureValue) override; + QStringList buildSelectionList(int *defaultListIndex, ET9U16 *gestureValue, ET9STATUS &eStatus) override; void selectWord(int index, bool isUserExplicitChoice); void noteWordDone(const QString &word); diff --git a/src/plugins/cerence/xt9/xt9common/xt9cpime.cpp b/src/plugins/cerence/xt9/xt9common/xt9cpime.cpp index 17ae0526..69efa6bc 100644 --- a/src/plugins/cerence/xt9/xt9common/xt9cpime.cpp +++ b/src/plugins/cerence/xt9/xt9common/xt9cpime.cpp @@ -147,7 +147,7 @@ QString Xt9CpIme::exactWord(int *wordCompLen) ET9CPPhrase phrase; ET9CPSpell spell; ET9U8 selSymbCount = 0; - if (!ET9CPGetSelection(&sLingInfo, &phrase, &spell, &selSymbCount) && selSymbCount) + if (!XT9_API(ET9CPGetSelection, &sLingInfo, &phrase, &spell, &selSymbCount) && selSymbCount) exactWord.remove(0, static_cast(selSymbCount)); replaceSpecialSymbol(exactWord); @@ -202,9 +202,8 @@ QString Xt9CpIme::spell() return result; } -QStringList Xt9CpIme::buildSelectionList(int *defaultListIndex, ET9U16 *gestureValue) +QStringList Xt9CpIme::buildSelectionList(int *defaultListIndex, ET9U16 *gestureValue, ET9STATUS &eStatus) { - ET9STATUS eStatus; ET9U16 totalWords; eStatus = XT9_API(ET9CPBuildSelectionList, &sLingInfo, gestureValue); diff --git a/src/plugins/cerence/xt9/xt9common/xt9cpime.h b/src/plugins/cerence/xt9/xt9common/xt9cpime.h index 8aa6e7ca..9c7da104 100644 --- a/src/plugins/cerence/xt9/xt9common/xt9cpime.h +++ b/src/plugins/cerence/xt9/xt9common/xt9cpime.h @@ -50,7 +50,7 @@ public: QString exactWord(int *wordCompLen = nullptr) override; void replaceSpecialSymbol(QString &exactWord) const; QString spell(); - QStringList buildSelectionList(int *defaultListIndex, ET9U16 *gestureValue) override; + QStringList buildSelectionList(int *defaultListIndex, ET9U16 *gestureValue, ET9STATUS &eStatus) override; ET9STATUS selectWord(int index); void cursorMoved() override; diff --git a/src/plugins/cerence/xt9/xt9common/xt9ime.cpp b/src/plugins/cerence/xt9/xt9common/xt9ime.cpp index 93c50bd3..de28dfbf 100644 --- a/src/plugins/cerence/xt9/xt9common/xt9ime.cpp +++ b/src/plugins/cerence/xt9/xt9common/xt9ime.cpp @@ -109,6 +109,12 @@ bool Xt9Ime::hasActiveInput() const return ET9HasActiveInput(&sWordSymbInfo); } +QStringList Xt9Ime::buildSelectionList(int *defaultListIndex, unsigned short *gestureValue) +{ + ET9STATUS eStatus = ET9STATUS_NONE; + return buildSelectionList(defaultListIndex, gestureValue, eStatus); +} + void Xt9Ime::cursorMoved() { XT9_API(ET9CursorMoved, &sWordSymbInfo, 1); diff --git a/src/plugins/cerence/xt9/xt9common/xt9ime.h b/src/plugins/cerence/xt9/xt9common/xt9ime.h index 759898ad..f9227dd9 100644 --- a/src/plugins/cerence/xt9/xt9common/xt9ime.h +++ b/src/plugins/cerence/xt9/xt9common/xt9ime.h @@ -84,7 +84,8 @@ public: virtual QString exactWord(int *wordCompLen = nullptr); bool hasActiveInput() const; - virtual QStringList buildSelectionList(int *defaultListIndex, ET9U16 *gestureValue) = 0; + virtual QStringList buildSelectionList(int *defaultListIndex, ET9U16 *gestureValue); + virtual QStringList buildSelectionList(int *defaultListIndex, ET9U16 *gestureValue, ET9STATUS &eStatus) = 0; virtual void cursorMoved(); void clearInput(); void setCapsLock(); -- cgit v1.2.3