aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJarkko Koivikko <jarkko.koivikko@code-q.fi>2021-09-02 11:46:59 +0300
committerJarkko Koivikko <jarkko.koivikko@code-q.fi>2021-09-02 16:21:51 +0300
commit3d402c7d33772a39415cf47842ef855c59a49acd (patch)
treebc90f7ff2da480a12c6a9a054812332001aa3512 /src
parent3d65eb1bd0a4b6e2468bdfcbbcd427c7d92763ad (diff)
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 <mitch.curtis@qt.io> Reviewed-by: Jarkko Koivikko <jarkko.koivikko@code-q.fi>
Diffstat (limited to 'src')
-rw-r--r--src/plugins/cerence/xt9/plugin/xt9inputmethodprivate.cpp58
-rw-r--r--src/plugins/cerence/xt9/plugin/xt9inputmethodprivate_p.h1
-rw-r--r--src/plugins/cerence/xt9/xt9common/xt9awime.cpp3
-rw-r--r--src/plugins/cerence/xt9/xt9common/xt9awime.h2
-rw-r--r--src/plugins/cerence/xt9/xt9common/xt9cpime.cpp5
-rw-r--r--src/plugins/cerence/xt9/xt9common/xt9cpime.h2
-rw-r--r--src/plugins/cerence/xt9/xt9common/xt9ime.cpp6
-rw-r--r--src/plugins/cerence/xt9/xt9common/xt9ime.h3
8 files changed, 68 insertions, 12 deletions
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
@@ -279,9 +279,17 @@ 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<ET9U8>(defaultListIndex);
const ET9BOOL bInitialSymCheck = 1;
- const ET9U32 dwTimeMS = static_cast<ET9U32>(QDateTime::currentMSecsSinceEpoch());
+ ET9U32 dwTimeMS = static_cast<ET9U32>(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<ET9U32>(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<int>(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();