aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarkko Koivikko <jarkko.koivikko@code-q.fi>2018-08-23 18:02:36 +0300
committerJarkko Koivikko <jarkko.koivikko@code-q.fi>2018-08-28 07:55:48 +0000
commitb253a3f14af12588966687d66cfa8829e3b1758f (patch)
tree03a29c96d239ad8a8a0ea7fd48c51d3f0ae7ae7e
parent84f96372584c37149fe6df751f937b61e3b7abe5 (diff)
Use enum class in the input context private state flags
Rename enum QVirtualKeyboardInputContextPrivate::StateFlag to ::State and use strongly typed enum. Simplify the state handling with new class QVirtualKeyboardScopedState. Change-Id: I124d53e7094e3b8056b7697d5e6f88d5e8b71b78 Reviewed-by: Jarkko Koivikko <jarkko.koivikko@code-q.fi> Reviewed-by: Frederik Gladhorn <frederik.gladhorn@qt.io>
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp12
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp51
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h45
3 files changed, 67 insertions, 41 deletions
diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp b/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp
index 4161f909..6b1b7819 100644
--- a/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp
+++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp
@@ -222,11 +222,11 @@ void QVirtualKeyboardInputContext::sendKeyClick(int key, const QString &text, in
QKeyEvent releaseEvent(QEvent::KeyRelease, key, Qt::KeyboardModifiers(modifiers), text);
VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputContext::sendKeyClick():" << key;
- d->stateFlags |= QVirtualKeyboardInputContextPrivate::KeyEventState;
+ d->setState(QVirtualKeyboardInputContextPrivate::State::KeyEvent);
d->platformInputContext->sendKeyEvent(&pressEvent);
d->platformInputContext->sendKeyEvent(&releaseEvent);
if (d->activeKeys.isEmpty())
- d->stateFlags &= ~QVirtualKeyboardInputContextPrivate::KeyEventState;
+ d->clearState(QVirtualKeyboardInputContextPrivate::State::KeyEvent);
} else {
qWarning() << "QVirtualKeyboardInputContext::sendKeyClick(): no focus to send key click" << key << text
<< "- QGuiApplication::focusWindow() is:" << QGuiApplication::focusWindow();
@@ -279,9 +279,7 @@ void QVirtualKeyboardInputContext::commit(const QString &text, int replaceFrom,
d->preeditTextAttributes.clear();
QInputMethodEvent inputEvent(QString(), attributes);
inputEvent.setCommitString(text, replaceFrom, replaceLength);
- d->stateFlags |= QVirtualKeyboardInputContextPrivate::InputMethodEventState;
- d->platformInputContext->sendEvent(&inputEvent);
- d->stateFlags &= ~QVirtualKeyboardInputContextPrivate::InputMethodEventState;
+ d->sendInputMethodEvent(&inputEvent);
} else {
d->preeditText.clear();
d->preeditTextAttributes.clear();
@@ -312,9 +310,7 @@ void QVirtualKeyboardInputContext::clear()
QList<QInputMethodEvent::Attribute> attributes;
d->addSelectionAttribute(attributes);
QInputMethodEvent event(QString(), attributes);
- d->stateFlags |= QVirtualKeyboardInputContextPrivate::InputMethodEventState;
- d->platformInputContext->sendEvent(&event);
- d->stateFlags &= ~QVirtualKeyboardInputContextPrivate::InputMethodEventState;
+ d->sendInputMethodEvent(&event);
}
if (preeditChanged)
diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp
index 9e55d121..529545c1 100644
--- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp
+++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp
@@ -219,9 +219,9 @@ void QVirtualKeyboardInputContextPrivate::forceCursorPosition(int anchorPosition
return;
if (!platformInputContext->m_visible)
return;
- if (stateFlags.testFlag(QVirtualKeyboardInputContextPrivate::ReselectEventState))
+ if (testState(State::Reselect))
return;
- if (stateFlags.testFlag(QVirtualKeyboardInputContextPrivate::SyncShadowInputState))
+ if (testState(State::SyncShadowInput))
return;
VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputContextPrivate::forceCursorPosition():" << cursorPosition << "anchorPosition:" << anchorPosition;
@@ -238,10 +238,9 @@ void QVirtualKeyboardInputContextPrivate::forceCursorPosition(int anchorPosition
q->setPreeditText(QString());
if (!inputMethodHints.testFlag(Qt::ImhNoPredictiveText) &&
cursorPosition > 0 && selectedText.isEmpty()) {
- stateFlags |= QVirtualKeyboardInputContextPrivate::ReselectEventState;
+ QVirtualKeyboardScopedState reselectState(this, State::Reselect);
if (inputEngine->reselect(cursorPosition, QVirtualKeyboardInputEngine::ReselectFlag::WordAtCursor))
- stateFlags |= QVirtualKeyboardInputContextPrivate::InputMethodClickState;
- stateFlags &= ~QVirtualKeyboardInputContextPrivate::ReselectEventState;
+ setState(State::InputMethodClick);
}
}
}
@@ -251,9 +250,9 @@ void QVirtualKeyboardInputContextPrivate::onInputItemChanged()
if (!inputItem() && !activeKeys.isEmpty()) {
// After losing keyboard focus it is impossible to track pressed keys
activeKeys.clear();
- stateFlags &= ~QVirtualKeyboardInputContextPrivate::KeyEventState;
+ clearState(State::KeyEvent);
}
- stateFlags &= ~QVirtualKeyboardInputContextPrivate::InputMethodClickState;
+ clearState(State::InputMethodClick);
}
void QVirtualKeyboardInputContextPrivate::sendPreedit(const QString &text, const QList<QInputMethodEvent::Attribute> &attributes, int replaceFrom, int replaceLength)
@@ -272,9 +271,8 @@ void QVirtualKeyboardInputContextPrivate::sendPreedit(const QString &text, const
const bool replace = replaceFrom != 0 || replaceLength > 0;
if (replace)
event.setCommitString(QString(), replaceFrom, replaceLength);
- stateFlags |= QVirtualKeyboardInputContextPrivate::InputMethodEventState;
- platformInputContext->sendEvent(&event);
- stateFlags &= ~QVirtualKeyboardInputContextPrivate::InputMethodEventState;
+
+ sendInputMethodEvent(&event);
// Send also to shadow input if only attributes changed.
// In this case the update() may not be called, so the shadow
@@ -297,6 +295,12 @@ void QVirtualKeyboardInputContextPrivate::sendPreedit(const QString &text, const
preeditTextAttributes.clear();
}
+void QVirtualKeyboardInputContextPrivate::sendInputMethodEvent(QInputMethodEvent *event)
+{
+ QVirtualKeyboardScopedState inputMethodEventState(this, State::InputMethodEvent);
+ platformInputContext->sendEvent(event);
+}
+
void QVirtualKeyboardInputContextPrivate::reset()
{
inputEngine->reset();
@@ -369,7 +373,7 @@ void QVirtualKeyboardInputContextPrivate::update(Qt::InputMethodQueries queries)
// update input engine
if ((newSurroundingText || newCursorPosition) &&
- !stateFlags.testFlag(QVirtualKeyboardInputContextPrivate::InputMethodEventState)) {
+ !testState(State::InputMethodEvent)) {
commit();
}
if (newInputMethodHints) {
@@ -410,20 +414,18 @@ void QVirtualKeyboardInputContextPrivate::update(Qt::InputMethodQueries queries)
// word reselection
if (newInputMethodHints || newSurroundingText || newSelectedText)
- stateFlags &= ~QVirtualKeyboardInputContextPrivate::InputMethodClickState;
- if ((newSurroundingText || newCursorPosition) && !newSelectedText && (int)stateFlags == 0 &&
+ clearState(State::InputMethodClick);
+ if ((newSurroundingText || newCursorPosition) && !newSelectedText && isEmptyState() &&
!inputMethodHints.testFlag(Qt::ImhNoPredictiveText) &&
cursorPosition > 0 && this->selectedText.isEmpty()) {
- stateFlags |= QVirtualKeyboardInputContextPrivate::ReselectEventState;
+ QVirtualKeyboardScopedState reselectState(this, State::Reselect);
if (inputEngine->reselect(cursorPosition, QVirtualKeyboardInputEngine::ReselectFlag::WordAtCursor))
- stateFlags |= QVirtualKeyboardInputContextPrivate::InputMethodClickState;
- stateFlags &= ~QVirtualKeyboardInputContextPrivate::ReselectEventState;
+ setState(State::InputMethodClick);
}
- if (!stateFlags.testFlag(QVirtualKeyboardInputContextPrivate::SyncShadowInputState)) {
- stateFlags |= QVirtualKeyboardInputContextPrivate::SyncShadowInputState;
+ if (!testState(State::SyncShadowInput)) {
+ QVirtualKeyboardScopedState syncShadowInputState(this, State::SyncShadowInput);
_shadow.update(queries);
- stateFlags &= ~QVirtualKeyboardInputContextPrivate::SyncShadowInputState;
}
}
@@ -431,22 +433,21 @@ void QVirtualKeyboardInputContextPrivate::invokeAction(QInputMethod::Action acti
{
switch (action) {
case QInputMethod::Click:
- if ((int)stateFlags == 0) {
+ if (isEmptyState()) {
if (inputEngine->clickPreeditText(cursorPosition))
break;
bool reselect = !inputMethodHints.testFlag(Qt::ImhNoPredictiveText) && selectedText.isEmpty() && cursorPosition < preeditText.length();
if (reselect) {
- stateFlags |= QVirtualKeyboardInputContextPrivate::ReselectEventState;
+ QVirtualKeyboardScopedState reselectState(this, State::Reselect);
_forceCursorPosition = this->cursorPosition + cursorPosition;
commit();
inputEngine->reselect(this->cursorPosition, QVirtualKeyboardInputEngine::ReselectFlag::WordBeforeCursor);
- stateFlags &= ~QVirtualKeyboardInputContextPrivate::ReselectEventState;
} else if (!preeditText.isEmpty() && cursorPosition == preeditText.length()) {
commit();
}
}
- stateFlags &= ~QVirtualKeyboardInputContextPrivate::InputMethodClickState;
+ clearState(State::InputMethodClick);
break;
case QInputMethod::ContextMenu:
@@ -467,9 +468,9 @@ bool QVirtualKeyboardInputContextPrivate::filterEvent(const QEvent *event)
activeKeys -= keyEvent->nativeScanCode();
if (activeKeys.isEmpty())
- stateFlags &= ~QVirtualKeyboardInputContextPrivate::KeyEventState;
+ clearState(State::KeyEvent);
else
- stateFlags |= QVirtualKeyboardInputContextPrivate::KeyEventState;
+ setState(State::KeyEvent);
#ifdef QT_VIRTUALKEYBOARD_ARROW_KEY_NAVIGATION
int key = keyEvent->key();
diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h
index 0b1772dc..c836e6c5 100644
--- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h
+++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h
@@ -73,15 +73,15 @@ class QVIRTUALKEYBOARD_EXPORT QVirtualKeyboardInputContextPrivate : public QObje
void init();
public:
- enum StateFlag {
- ReselectEventState = 0x1,
- InputMethodEventState = 0x2,
- KeyEventState = 0x4,
- InputMethodClickState = 0x8,
- SyncShadowInputState = 0x10
+ enum class State {
+ Reselect = 0x1,
+ InputMethodEvent = 0x2,
+ KeyEvent = 0x4,
+ InputMethodClick = 0x8,
+ SyncShadowInput = 0x10
};
- Q_FLAG(StateFlag)
- Q_DECLARE_FLAGS(StateFlags, StateFlag)
+ Q_FLAG(State)
+ Q_DECLARE_FLAGS(StateFlags, QVirtualKeyboardInputContextPrivate::State)
~QVirtualKeyboardInputContextPrivate();
@@ -123,6 +123,7 @@ private Q_SLOTS:
private:
void sendPreedit(const QString &text, const QList<QInputMethodEvent::Attribute> &attributes, int replaceFrom, int replaceLength);
+ void sendInputMethodEvent(QInputMethodEvent *event);
void reset();
void commit();
void update(Qt::InputMethodQueries queries);
@@ -131,6 +132,10 @@ private:
void addSelectionAttribute(QList<QInputMethodEvent::Attribute> &attributes);
bool testAttribute(const QList<QInputMethodEvent::Attribute> &attributes, QInputMethodEvent::AttributeType attributeType) const;
int findAttribute(const QList<QInputMethodEvent::Attribute> &attributes, QInputMethodEvent::AttributeType attributeType) const;
+ inline void setState(const State &state) { stateFlags.setFlag(state); }
+ inline void clearState(const State &state) { stateFlags &= ~StateFlags(state); }
+ inline bool testState(const State &state) const { return stateFlags.testFlag(state); }
+ inline bool isEmptyState() const { return !stateFlags; }
private:
QVirtualKeyboardInputContext *q_ptr;
@@ -164,10 +169,34 @@ private:
QtVirtualKeyboard::ShadowInputContext _shadow;
friend class QtVirtualKeyboard::PlatformInputContext;
+ friend class QVirtualKeyboardScopedState;
+};
+
+class QVirtualKeyboardScopedState
+{
+ Q_DISABLE_COPY(QVirtualKeyboardScopedState)
+public:
+ QVirtualKeyboardScopedState(QVirtualKeyboardInputContextPrivate *d, QVirtualKeyboardInputContextPrivate::State state) :
+ d(d),
+ state(state)
+ {
+ d->setState(state);
+ }
+
+ ~QVirtualKeyboardScopedState()
+ {
+ d->clearState(state);
+ }
+
+private:
+ QVirtualKeyboardInputContextPrivate *d;
+ QVirtualKeyboardInputContextPrivate::State state;
};
Q_DECLARE_OPERATORS_FOR_FLAGS(QVirtualKeyboardInputContextPrivate::StateFlags)
QT_END_NAMESPACE
+Q_DECLARE_METATYPE(QVirtualKeyboardInputContextPrivate::State)
+
#endif // QVIRTUALKEYBOARDINPUTCONTEXT_P_H