aboutsummaryrefslogtreecommitdiffstats
path: root/src/virtualkeyboard/qvirtualkeyboardinputengine.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/virtualkeyboard/qvirtualkeyboardinputengine.cpp')
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputengine.cpp1054
1 files changed, 1054 insertions, 0 deletions
diff --git a/src/virtualkeyboard/qvirtualkeyboardinputengine.cpp b/src/virtualkeyboard/qvirtualkeyboardinputengine.cpp
new file mode 100644
index 00000000..ddc793bf
--- /dev/null
+++ b/src/virtualkeyboard/qvirtualkeyboardinputengine.cpp
@@ -0,0 +1,1054 @@
+/****************************************************************************
+**
+** Copyright (C) 2016 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 or (at your option) any later version
+** approved by the KDE Free Qt Foundation. The licenses are as published by
+** the Free Software Foundation and appearing in the file LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QtVirtualKeyboard/qvirtualkeyboardinputengine.h>
+#include <QtVirtualKeyboard/qvirtualkeyboardinputcontext.h>
+#include <QtVirtualKeyboard/private/qvirtualkeyboardinputcontext_p.h>
+#include <QtVirtualKeyboard/private/shifthandler_p.h>
+#include <QtVirtualKeyboard/private/fallbackinputmethod_p.h>
+#include <QtVirtualKeyboard/qvirtualkeyboardtrace.h>
+#include <QtVirtualKeyboard/private/virtualkeyboarddebug_p.h>
+
+#include <QTimerEvent>
+#include <QtCore/private/qobject_p.h>
+
+QT_BEGIN_NAMESPACE
+using namespace QtVirtualKeyboard;
+
+class QVirtualKeyboardInputEnginePrivate : public QObjectPrivate
+{
+ Q_DECLARE_PUBLIC(QVirtualKeyboardInputEngine)
+
+public:
+ QVirtualKeyboardInputEnginePrivate(QVirtualKeyboardInputEngine *q_ptr) :
+ QObjectPrivate(),
+ q_ptr(q_ptr),
+ inputContext(nullptr),
+ fallbackInputMethod(nullptr),
+ textCase(QVirtualKeyboardInputEngine::TextCase::Lower),
+ inputMode(QVirtualKeyboardInputEngine::InputMode::Latin),
+ activeKey(Qt::Key_unknown),
+ activeKeyModifiers(Qt::NoModifier),
+ previousKey(Qt::Key_unknown),
+ repeatTimer(0),
+ repeatCount(0),
+ recursiveMethodLock(0)
+ {
+ }
+
+ virtual ~QVirtualKeyboardInputEnginePrivate()
+ {
+ }
+
+ bool virtualKeyClick(Qt::Key key, const QString &text, Qt::KeyboardModifiers modifiers, bool isAutoRepeat)
+ {
+ Q_Q(QVirtualKeyboardInputEngine);
+ bool accept = false;
+ if (inputMethod) {
+ accept = inputMethod->keyEvent(key, text, modifiers);
+ if (!accept) {
+ accept = fallbackInputMethod->keyEvent(key, text, modifiers);
+ }
+ emit q->virtualKeyClicked(key, text, modifiers, isAutoRepeat);
+ } else {
+ qWarning() << "input method is not set";
+ }
+ return accept;
+ }
+
+ QVirtualKeyboardInputEngine* q_ptr;
+ QVirtualKeyboardInputContext *inputContext;
+ QPointer<QVirtualKeyboardAbstractInputMethod> inputMethod;
+ QVirtualKeyboardAbstractInputMethod *fallbackInputMethod;
+ QVirtualKeyboardInputEngine::TextCase textCase;
+ QVirtualKeyboardInputEngine::InputMode inputMode;
+ QList<int> inputModes;
+ QMap<QVirtualKeyboardSelectionListModel::Type, QVirtualKeyboardSelectionListModel *> selectionListModels;
+ Qt::Key activeKey;
+ QString activeKeyText;
+ Qt::KeyboardModifiers activeKeyModifiers;
+ Qt::Key previousKey;
+ int repeatTimer;
+ int repeatCount;
+ int recursiveMethodLock;
+};
+
+class RecursiveMethodGuard
+{
+public:
+ explicit RecursiveMethodGuard(int &ref) : m_ref(ref)
+ {
+ m_ref++;
+ }
+ ~RecursiveMethodGuard()
+ {
+ m_ref--;
+ }
+ bool locked() const
+ {
+ return m_ref > 1;
+ }
+private:
+ int &m_ref;
+};
+
+/*!
+ \qmltype InputEngine
+ \inqmlmodule QtQuick.VirtualKeyboard
+ \ingroup qtvirtualkeyboard-qml
+ \instantiates QVirtualKeyboardInputEngine
+ \brief Maps the user input to the input methods.
+
+ The input engine is responsible for routing input events to input
+ methods. The actual input logic is implemented by the input methods.
+
+ The input engine also includes the default input method, which takes
+ care of default processing if the active input method does not handle
+ the event.
+*/
+
+/*!
+ \class QVirtualKeyboardInputEngine
+ \inmodule QtVirtualKeyboard
+ \brief The InputEngine class provides an input engine
+ that supports C++ and QML integration.
+
+ The input engine is responsible for routing input events to input
+ methods. The actual input logic is implemented by the input methods.
+
+ The input engine also includes the default input method, which takes
+ care of default processing if the active input method does not handle
+ the event.
+*/
+
+/*!
+ \internal
+ Constructs an input engine with input context as \a parent.
+*/
+QVirtualKeyboardInputEngine::QVirtualKeyboardInputEngine(QVirtualKeyboardInputContext *parent) :
+ QObject(*new QVirtualKeyboardInputEnginePrivate(this), parent)
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ d->inputContext = parent;
+}
+
+void QVirtualKeyboardInputEngine::init()
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ ShiftHandler *shiftHandler = d->inputContext->priv()->shiftHandler();
+ QObject::connect(shiftHandler, &ShiftHandler::shiftActiveChanged, this, &QVirtualKeyboardInputEngine::shiftChanged);
+ QObject::connect(d->inputContext, &QVirtualKeyboardInputContext::localeChanged, this, &QVirtualKeyboardInputEngine::update);
+ QObject::connect(d->inputContext, &QVirtualKeyboardInputContext::inputMethodHintsChanged, this, &QVirtualKeyboardInputEngine::updateSelectionListModels);
+ QObject::connect(d->inputContext, &QVirtualKeyboardInputContext::localeChanged, this, &QVirtualKeyboardInputEngine::updateInputModes);
+ QObject::connect(this, &QVirtualKeyboardInputEngine::inputMethodChanged, this, &QVirtualKeyboardInputEngine::updateInputModes);
+ d->fallbackInputMethod = new FallbackInputMethod(this);
+ if (d->fallbackInputMethod)
+ d->fallbackInputMethod->setInputEngine(this);
+ d->selectionListModels[QVirtualKeyboardSelectionListModel::Type::WordCandidateList] = new QVirtualKeyboardSelectionListModel(this);
+}
+
+/*!
+ \internal
+ Destroys the input engine and frees all allocated resources.
+*/
+QVirtualKeyboardInputEngine::~QVirtualKeyboardInputEngine()
+{
+}
+
+/*!
+ \qmlmethod bool InputEngine::virtualKeyPress(int key, string text, int modifiers, bool repeat)
+
+ Called by the keyboard layer to indicate that \a key was pressed, with
+ the given \a text and \a modifiers.
+
+ The \a key is set as an active key (down key). The actual key event is
+ triggered when the key is released by the virtualKeyRelease() method. The
+ key press event can be discarded by calling virtualKeyCancel().
+
+ The key press also initiates the key repeat timer if \a repeat is \c true.
+
+ Returns \c true if the key was accepted by this input engine.
+
+ \sa virtualKeyCancel(), virtualKeyRelease()
+*/
+/*!
+ Called by the keyboard layer to indicate that \a key was pressed, with
+ the given \a text and \a modifiers.
+
+ The \a key is set as an active key (down key). The actual key event is
+ triggered when the key is released by the virtualKeyRelease() method. The
+ key press event can be discarded by calling virtualKeyCancel().
+
+ The key press also initiates the key repeat timer if \a repeat is \c true.
+
+ Returns \c true if the key was accepted by this input engine.
+
+ \sa virtualKeyCancel(), virtualKeyRelease()
+*/
+bool QVirtualKeyboardInputEngine::virtualKeyPress(Qt::Key key, const QString &text, Qt::KeyboardModifiers modifiers, bool repeat)
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::virtualKeyPress():" << key << text << modifiers << repeat;
+ bool accept = false;
+ if (d->activeKey == Qt::Key_unknown || d->activeKey == key) {
+ d->activeKey = key;
+ d->activeKeyText = text;
+ d->activeKeyModifiers = modifiers;
+ if (repeat) {
+ d->repeatTimer = startTimer(600);
+ }
+ accept = true;
+ emit activeKeyChanged(d->activeKey);
+ } else {
+ qWarning("key press ignored; key is already active");
+ }
+ return accept;
+}
+
+/*!
+ \qmlmethod void InputEngine::virtualKeyCancel()
+
+ Reverts the active key state without emitting the key event.
+ This method is useful when the user discards the current key and
+ the key state needs to be restored.
+*/
+/*!
+ \fn void QVirtualKeyboardInputEngine::virtualKeyCancel()
+
+ Reverts the active key state without emitting the key event.
+ This method is useful when the user discards the current key and
+ the key state needs to be restored.
+*/
+void QVirtualKeyboardInputEngine::virtualKeyCancel()
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::virtualKeyCancel()";
+ if (d->activeKey != Qt::Key_unknown) {
+ d->activeKey = Qt::Key_unknown;
+ d->activeKeyText = QString();
+ d->activeKeyModifiers = Qt::KeyboardModifiers();
+ if (d->repeatTimer) {
+ killTimer(d->repeatTimer);
+ d->repeatTimer = 0;
+ d->repeatCount = 0;
+ }
+ emit activeKeyChanged(d->activeKey);
+ }
+}
+
+/*!
+ \qmlmethod bool InputEngine::virtualKeyRelease(int key, string text, int modifiers)
+
+ Releases the key at \a key. The method emits a key event for the input
+ method if the event has not been generated by a repeating timer.
+ The \a text and \a modifiers are passed to the input method.
+
+ Returns \c true if the key was accepted by the input engine.
+*/
+/*!
+ Releases the key at \a key. The method emits a key event for the input
+ method if the event has not been generated by a repeating timer.
+ The \a text and \a modifiers are passed to the input method.
+
+ Returns \c true if the key was accepted by the input engine.
+*/
+bool QVirtualKeyboardInputEngine::virtualKeyRelease(Qt::Key key, const QString &text, Qt::KeyboardModifiers modifiers)
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::virtualKeyRelease():" << key << text << modifiers;
+ bool accept = false;
+ if (d->activeKey == key) {
+ if (!d->repeatCount) {
+ accept = d->virtualKeyClick(key, text, modifiers, false);
+ } else {
+ accept = true;
+ }
+ } else {
+ qWarning("key release ignored; key is not pressed");
+ }
+ if (d->activeKey != Qt::Key_unknown) {
+ d->previousKey = d->activeKey;
+ emit previousKeyChanged(d->previousKey);
+ d->activeKey = Qt::Key_unknown;
+ d->activeKeyText = QString();
+ d->activeKeyModifiers = Qt::KeyboardModifiers();
+ if (d->repeatTimer) {
+ killTimer(d->repeatTimer);
+ d->repeatTimer = 0;
+ d->repeatCount = 0;
+ }
+ emit activeKeyChanged(d->activeKey);
+ }
+ return accept;
+}
+
+/*!
+ \qmlmethod bool InputEngine::virtualKeyClick(int key, string text, int modifiers)
+
+ Emits a key click event for the given \a key, \a text and \a modifiers.
+ Returns \c true if the key event was accepted by the input engine.
+*/
+/*!
+ Emits a key click event for the given \a key, \a text and \a modifiers.
+ Returns \c true if the key event was accepted by the input engine.
+*/
+bool QVirtualKeyboardInputEngine::virtualKeyClick(Qt::Key key, const QString &text, Qt::KeyboardModifiers modifiers)
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::virtualKeyClick():" << key << text << modifiers;
+ return d->virtualKeyClick(key, text, modifiers, false);
+}
+
+/*!
+ Returns the \c InputContext instance associated with the input
+ engine.
+*/
+QVirtualKeyboardInputContext *QVirtualKeyboardInputEngine::inputContext() const
+{
+ Q_D(const QVirtualKeyboardInputEngine);
+ return d->inputContext;
+}
+
+/*!
+ Returns the currently active key, or Qt::Key_unknown if no key is active.
+*/
+Qt::Key QVirtualKeyboardInputEngine::activeKey() const
+{
+ Q_D(const QVirtualKeyboardInputEngine);
+ return d->activeKey;
+}
+
+/*!
+ Returns the previously active key, or Qt::Key_unknown if no key has been
+ active.
+*/
+Qt::Key QVirtualKeyboardInputEngine::previousKey() const
+{
+ Q_D(const QVirtualKeyboardInputEngine);
+ return d->previousKey;
+}
+
+/*!
+ Returns the active input method.
+*/
+QVirtualKeyboardAbstractInputMethod *QVirtualKeyboardInputEngine::inputMethod() const
+{
+ Q_D(const QVirtualKeyboardInputEngine);
+ return d->inputMethod;
+}
+
+/*!
+ Sets \a inputMethod as the active input method.
+*/
+void QVirtualKeyboardInputEngine::setInputMethod(QVirtualKeyboardAbstractInputMethod *inputMethod)
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::setInputMethod():" << inputMethod;
+ if (d->inputMethod != inputMethod) {
+ update();
+ if (d->inputMethod) {
+ QObject::disconnect(d->inputMethod.data(), &QVirtualKeyboardAbstractInputMethod::selectionListsChanged, this, &QVirtualKeyboardInputEngine::updateSelectionListModels);
+ d->inputMethod->setInputEngine(nullptr);
+ }
+ d->inputMethod = inputMethod;
+ if (d->inputMethod) {
+ d->inputMethod->setInputEngine(this);
+ QObject::connect(d->inputMethod.data(), &QVirtualKeyboardAbstractInputMethod::selectionListsChanged, this, &QVirtualKeyboardInputEngine::updateSelectionListModels);
+
+ // Set current text case
+ d->inputMethod->setTextCase(d->textCase);
+ }
+ updateSelectionListModels();
+ emit inputMethodChanged();
+ emit patternRecognitionModesChanged();
+ }
+}
+
+/*!
+ Returns the list of available input modes.
+*/
+QList<int> QVirtualKeyboardInputEngine::inputModes() const
+{
+ Q_D(const QVirtualKeyboardInputEngine);
+ return d->inputModes;
+}
+
+QVirtualKeyboardInputEngine::InputMode QVirtualKeyboardInputEngine::inputMode() const
+{
+ Q_D(const QVirtualKeyboardInputEngine);
+ return d->inputMode;
+}
+
+void QVirtualKeyboardInputEngine::setInputMode(QVirtualKeyboardInputEngine::InputMode inputMode)
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::setInputMode():" << inputMode;
+ if (d->inputMethod) {
+#ifdef QT_DEBUG
+ // Cached input modes should be in sync with the input method
+ // If the assert below fails, we have missed an update somewhere
+ QList<int> cachedInputModes(d->inputModes);
+ updateInputModes();
+ Q_ASSERT(cachedInputModes == d->inputModes);
+#endif
+ if (d->inputModes.contains(static_cast<const int>(inputMode))) {
+ d->inputMethod->setInputMode(d->inputContext->locale(), inputMode);
+ if (d->inputMode != inputMode) {
+ d->inputMode = inputMode;
+ emit inputModeChanged();
+ }
+ } else {
+ qWarning() << "Input mode" << inputMode <<
+ "is not in the list of available input modes" << d->inputModes;
+ }
+ }
+}
+
+QVirtualKeyboardSelectionListModel *QVirtualKeyboardInputEngine::wordCandidateListModel() const
+{
+ Q_D(const QVirtualKeyboardInputEngine);
+ return d->selectionListModels[QVirtualKeyboardSelectionListModel::Type::WordCandidateList];
+}
+
+bool QVirtualKeyboardInputEngine::wordCandidateListVisibleHint() const
+{
+ Q_D(const QVirtualKeyboardInputEngine);
+ const auto it = d->selectionListModels.constFind(QVirtualKeyboardSelectionListModel::Type::WordCandidateList);
+ if (it == d->selectionListModels.cend())
+ return false;
+ return it.value()->dataSource() != nullptr;
+}
+
+/*!
+ Returns list of supported pattern recognition modes.
+*/
+QList<int> QVirtualKeyboardInputEngine::patternRecognitionModes() const
+{
+ Q_D(const QVirtualKeyboardInputEngine);
+ QList<PatternRecognitionMode> patterRecognitionModeList;
+ if (d->inputMethod)
+ patterRecognitionModeList = d->inputMethod->patternRecognitionModes();
+ QList<int> resultList;
+ if (patterRecognitionModeList.isEmpty())
+ return resultList;
+ resultList.reserve(patterRecognitionModeList.size());
+ for (const PatternRecognitionMode &patternRecognitionMode : qAsConst(patterRecognitionModeList))
+ resultList.append(static_cast<int>(patternRecognitionMode));
+ return resultList;
+}
+
+/*!
+ \qmlmethod QVirtualKeyboardTrace InputEngine::traceBegin(int traceId, int patternRecognitionMode, var traceCaptureDeviceInfo, var traceScreenInfo)
+ \since QtQuick.VirtualKeyboard 2.0
+
+ Starts a trace interaction with the input engine.
+
+ The trace is uniquely identified by the \a traceId. The input engine will assign
+ the id to the Trace object if the input method accepts the event.
+
+ The \a patternRecognitionMode specifies the recognition mode used for the pattern.
+
+ If the current input method accepts the event it returns a Trace object associated with this interaction.
+ If the input method discards the event, it returns a null value.
+
+ The \a traceCaptureDeviceInfo provides information about the source device and the \a traceScreenInfo
+ provides information about the screen context.
+
+ By definition, the Trace object remains valid until the traceEnd() method is called.
+
+ The trace interaction is ended by calling the \l {InputEngine::traceEnd()} {InputEngine.traceEnd()} method.
+*/
+/*!
+ \since QtQuick.VirtualKeyboard 2.0
+
+ Starts a trace interaction with the input engine.
+
+ The trace is uniquely identified by the \a traceId. The input engine will assign
+ the id to the QVirtualKeyboardTrace object if the input method accepts the event.
+
+ The \a patternRecognitionMode specifies the recognition mode used for the pattern.
+
+ If the current input method accepts the event it returns a QVirtualKeyboardTrace object associated with this interaction.
+ If the input method discards the event, it returns a NULL value.
+
+ The \a traceCaptureDeviceInfo provides information about the source device and the \a traceScreenInfo
+ provides information about the screen context.
+
+ By definition, the QVirtualKeyboardTrace object remains valid until the traceEnd() method is called.
+
+ The trace interaction is ended by calling the traceEnd() method.
+*/
+QVirtualKeyboardTrace *QVirtualKeyboardInputEngine::traceBegin(
+ int traceId, PatternRecognitionMode patternRecognitionMode,
+ const QVariantMap &traceCaptureDeviceInfo, const QVariantMap &traceScreenInfo)
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::traceBegin():"
+ << "traceId:" << traceId
+ << "patternRecognitionMode:" << patternRecognitionMode
+ << "traceCaptureDeviceInfo:" << traceCaptureDeviceInfo
+ << "traceScreenInfo:" << traceScreenInfo;
+ if (!d->inputMethod)
+ return nullptr;
+ if (patternRecognitionMode == PatternRecognitionMode::None)
+ return nullptr;
+ if (!d->inputMethod->patternRecognitionModes().contains(patternRecognitionMode))
+ return nullptr;
+ QVirtualKeyboardTrace *trace = d->inputMethod->traceBegin(traceId, patternRecognitionMode, traceCaptureDeviceInfo, traceScreenInfo);
+ if (trace)
+ trace->setTraceId(traceId);
+ return trace;
+}
+
+/*!
+ \qmlmethod bool InputEngine::traceEnd(Trace trace)
+
+ Ends the trace interaction with the input engine.
+
+ The \a trace object may be discarded at any point after calling this function.
+
+ The function returns true if the trace interaction was accepted (i.e. the touch
+ events should not be used for anything else).
+*/
+/*!
+ Ends the trace interaction with the input engine.
+
+ The \a trace object may be discarded at any point after calling this function.
+
+ The function returns true if the trace interaction was accepted (i.e. the touch
+ events should not be used for anything else).
+*/
+bool QVirtualKeyboardInputEngine::traceEnd(QVirtualKeyboardTrace *trace)
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::traceEnd():" << trace;
+ Q_ASSERT(trace);
+ if (!d->inputMethod)
+ return false;
+ return d->inputMethod->traceEnd(trace);
+}
+
+/*!
+ \since QtQuick.VirtualKeyboard 2.0
+
+ This function attempts to reselect a word located at the \a cursorPosition.
+ The \a reselectFlags define the rules for how the word should be selected in
+ relation to the cursor position.
+
+ The function returns \c true if the word was successfully reselected.
+*/
+bool QVirtualKeyboardInputEngine::reselect(int cursorPosition, const ReselectFlags &reselectFlags)
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::reselect():" << cursorPosition << reselectFlags;
+ if (!d->inputMethod || !wordCandidateListVisibleHint())
+ return false;
+ return d->inputMethod->reselect(cursorPosition, reselectFlags);
+}
+
+/*!
+ \internal
+ This method is called when the current preedit text is clicked.
+*/
+bool QVirtualKeyboardInputEngine::clickPreeditText(int cursorPosition)
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ if (!d->inputMethod)
+ return false;
+ return d->inputMethod->clickPreeditText(cursorPosition);
+}
+
+/*!
+ \internal
+ Resets the input method.
+*/
+void QVirtualKeyboardInputEngine::reset()
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ if (d->inputMethod) {
+ RecursiveMethodGuard guard(d->recursiveMethodLock);
+ if (!guard.locked()) {
+ emit inputMethodReset();
+ updateInputModes();
+ }
+ } else {
+ updateInputModes();
+ }
+}
+
+/*!
+ \internal
+ Updates the input method's state. This method is called whenever the input
+ context is changed.
+*/
+void QVirtualKeyboardInputEngine::update()
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ if (d->inputMethod) {
+ RecursiveMethodGuard guard(d->recursiveMethodLock);
+ if (!guard.locked()) {
+ emit inputMethodUpdate();
+ }
+ }
+}
+
+/*!
+ \internal
+ Updates the text case for the input method.
+*/
+void QVirtualKeyboardInputEngine::shiftChanged()
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ TextCase newCase = d->inputContext->priv()->shiftHandler()->isShiftActive() ? TextCase::Upper : TextCase::Lower;
+ if (d->textCase != newCase) {
+ d->textCase = newCase;
+ if (d->inputMethod) {
+ d->inputMethod->setTextCase(d->textCase);
+ }
+ }
+}
+
+/*!
+ \internal
+*/
+void QVirtualKeyboardInputEngine::updateSelectionListModels()
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ QList<QVirtualKeyboardSelectionListModel::Type> inactiveSelectionLists = d->selectionListModels.keys();
+ if (d->inputMethod) {
+ // Allocate selection lists for the input method
+ const QList<QVirtualKeyboardSelectionListModel::Type> activeSelectionLists = d->inputMethod->selectionLists();
+ for (const QVirtualKeyboardSelectionListModel::Type &selectionListType : activeSelectionLists) {
+ auto it = d->selectionListModels.find(selectionListType);
+ if (it == d->selectionListModels.end()) {
+ it = d->selectionListModels.insert(selectionListType, new QVirtualKeyboardSelectionListModel(this));
+ if (selectionListType == QVirtualKeyboardSelectionListModel::Type::WordCandidateList)
+ emit wordCandidateListModelChanged();
+ }
+ it.value()->setDataSource(d->inputMethod, selectionListType);
+ if (selectionListType == QVirtualKeyboardSelectionListModel::Type::WordCandidateList)
+ emit wordCandidateListVisibleHintChanged();
+ inactiveSelectionLists.removeAll(selectionListType);
+ }
+ }
+
+ // Deallocate inactive selection lists
+ for (const QVirtualKeyboardSelectionListModel::Type &selectionListType : qAsConst(inactiveSelectionLists)) {
+ const auto it = d->selectionListModels.constFind(selectionListType);
+ if (it != d->selectionListModels.cend()) {
+ it.value()->setDataSource(nullptr, selectionListType);
+ if (selectionListType == QVirtualKeyboardSelectionListModel::Type::WordCandidateList)
+ emit wordCandidateListVisibleHintChanged();
+ }
+ }
+}
+
+/*!
+ \internal
+*/
+void QVirtualKeyboardInputEngine::updateInputModes()
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ QList<int> newInputModes;
+ if (d->inputMethod) {
+ QList<InputMode> tmpList(d->inputMethod->inputModes(d->inputContext->locale()));
+ if (!tmpList.isEmpty()) {
+ std::transform(tmpList.constBegin(), tmpList.constEnd(),
+ std::back_inserter(newInputModes),
+ [tmpList] (InputMode inputMode) {
+ return static_cast<int>(inputMode);
+ });
+ }
+ }
+ if (d->inputModes != newInputModes) {
+ d->inputModes = newInputModes;
+ emit inputModesChanged();
+ }
+}
+
+/*!
+ \internal
+*/
+void QVirtualKeyboardInputEngine::timerEvent(QTimerEvent *timerEvent)
+{
+ Q_D(QVirtualKeyboardInputEngine);
+ if (timerEvent->timerId() == d->repeatTimer) {
+ d->repeatTimer = 0;
+ d->virtualKeyClick(d->activeKey, d->activeKeyText, d->activeKeyModifiers, true);
+ d->repeatTimer = startTimer(50);
+ d->repeatCount++;
+ }
+}
+
+/*!
+ \qmlproperty int InputEngine::activeKey
+
+ Currently pressed key.
+*/
+
+/*!
+ \property QVirtualKeyboardInputEngine::activeKey
+ \brief the active key.
+
+ Currently pressed key.
+*/
+
+/*!
+ \qmlproperty int InputEngine::previousKey
+
+ Previously pressed key.
+*/
+/*!
+ \property QVirtualKeyboardInputEngine::previousKey
+ \brief the previous active key.
+
+ Previously pressed key.
+*/
+
+/*!
+ \qmlproperty InputMethod InputEngine::inputMethod
+
+ Use this property to set the active input method, or to monitor when the
+ active input method changes.
+*/
+
+/*!
+ \property QVirtualKeyboardInputEngine::inputMethod
+ \brief the active input method.
+
+ Use this property to set active the input method, or to monitor when the
+ active input method changes.
+*/
+
+/*!
+ \qmlproperty list<int> InputEngine::inputModes
+
+ The list of available input modes is dependent on the input method and
+ locale. This property is updated when either of the dependencies change.
+*/
+
+/*!
+ \property QVirtualKeyboardInputEngine::inputModes
+ \brief the available input modes for active input method.
+
+ The list of available input modes is dependent on the input method and
+ locale. This property is updated when either of the dependencies changes.
+*/
+
+/*!
+ \qmlproperty int InputEngine::inputMode
+
+ Use this property to get or set the current input mode. The
+ InputEngine::inputModes property provides the list of valid input modes
+ for the current input method and locale.
+
+ The predefined input modes are:
+
+ \list
+ \li \c InputEngine.InputMode.Latin The default input mode for latin text.
+ \li \c InputEngine.InputMode.Numeric Only numeric input is allowed.
+ \li \c InputEngine.InputMode.Dialable Only dialable input is allowed.
+ \li \c InputEngine.InputMode.Pinyin Pinyin input mode for Chinese.
+ \li \c InputEngine.InputMode.Cangjie Cangjie input mode for Chinese.
+ \li \c InputEngine.InputMode.Zhuyin Zhuyin input mode for Chinese.
+ \li \c InputEngine.InputMode.Hangul Hangul input mode for Korean.
+ \li \c InputEngine.InputMode.Hiragana Hiragana input mode for Japanese.
+ \li \c InputEngine.InputMode.Katakana Katakana input mode for Japanese.
+ \li \c InputEngine.InputMode.FullwidthLatin Fullwidth latin input mode for East Asian languages.
+ \li \c InputEngine.InputMode.Greek Greek input mode.
+ \li \c InputEngine.InputMode.Cyrillic Cyrillic input mode.
+ \li \c InputEngine.InputMode.Arabic Arabic input mode.
+ \li \c InputEngine.InputMode.Hebrew Hebrew input mode.
+ \li \c InputEngine.InputMode.ChineseHandwriting Chinese handwriting.
+ \li \c InputEngine.InputMode.JapaneseHandwriting Japanese handwriting.
+ \li \c InputEngine.InputMode.KoreanHandwriting Korean handwriting.
+ \endlist
+*/
+
+/*!
+ \property QVirtualKeyboardInputEngine::inputMode
+ \brief the current input mode.
+
+ Use this property to get or set the current input mode. The
+ InputEngine::inputModes provides list of valid input modes
+ for current input method and locale.
+*/
+
+/*!
+ \qmlproperty QVirtualKeyboardSelectionListModel InputEngine::wordCandidateListModel
+
+ Use this property to access the list model for the word candidate
+ list.
+*/
+
+/*!
+ \property QVirtualKeyboardInputEngine::wordCandidateListModel
+ \brief list model for the word candidate list.
+
+ Use this property to access the list model for the word candidate
+ list.
+*/
+
+/*!
+ \qmlproperty bool InputEngine::wordCandidateListVisibleHint
+
+ Use this property to check if the word candidate list should be visible
+ in the UI.
+*/
+
+/*!
+ \property QVirtualKeyboardInputEngine::wordCandidateListVisibleHint
+ \brief visible hint for the word candidate list.
+
+ Use this property to check if the word candidate list should be visible
+ in the UI.
+*/
+
+/*!
+ \enum QVirtualKeyboardInputEngine::InputMode
+
+ This enum specifies the input mode for the input method.
+
+ \value InputMode::Latin
+ The default input mode for latin text.
+ \value InputMode::Numeric
+ Only numeric input is allowed.
+ \value InputMode::Dialable
+ Only dialable input is allowed.
+ \value InputMode::Pinyin
+ Pinyin input mode for Chinese.
+ \value InputMode::Cangjie
+ Cangjie input mode for Chinese.
+ \value InputMode::Zhuyin
+ Zhuyin input mode for Chinese.
+ \value InputMode::Hangul
+ Hangul input mode for Korean.
+ \value InputMode::Hiragana
+ Hiragana input mode for Japanese.
+ \value InputMode::Katakana
+ Katakana input mode for Japanese.
+ \value InputMode::FullwidthLatin
+ Fullwidth latin input mode for East Asian languages.
+ \value InputMode::Greek
+ Greek input mode.
+ \value InputMode::Cyrillic
+ Cyrillic input mode.
+ \value InputMode::Arabic
+ Arabic input mode.
+ \value InputMode::Hebrew
+ Hebrew input mode.
+*/
+
+/*!
+ \enum QVirtualKeyboardInputEngine::TextCase
+
+ This enum specifies the text case for the input method.
+
+ \value TextCase::Lower
+ Lower case text.
+ \value TextCase::Upper
+ Upper case text.
+*/
+
+/*!
+ \enum QVirtualKeyboardInputEngine::PatternRecognitionMode
+
+ This enum specifies the input mode for the input method.
+
+ \value PatternRecognitionMode::None
+ Pattern recognition is not available.
+ \value PatternRecognitionMode::PatternRecognitionDisabled
+ \c obsolete Use PatternRecognitionMode::None
+ \value PatternRecognitionMode::Handwriting
+ Pattern recognition mode for handwriting recognition.
+ \value PatternRecognitionMode::HandwritingRecoginition
+ \c obsolete Use PatternRecognitionMode::Handwriting
+*/
+
+/*!
+ \enum QVirtualKeyboardInputEngine::ReselectFlag
+
+ This enum specifies the rules for word reselection.
+
+ \value ReselectFlag::WordBeforeCursor
+ Activate the word before the cursor. When this flag is used exclusively, the word must end exactly at the cursor.
+ \value ReselectFlag::WordAfterCursor
+ Activate the word after the cursor. When this flag is used exclusively, the word must start exactly at the cursor.
+ \value ReselectFlag::WordAtCursor
+ Activate the word at the cursor. This flag is a combination of the above flags with the exception that the word cannot start or stop at the cursor.
+*/
+
+/*!
+ \qmlsignal void InputEngine::virtualKeyClicked(int key, string text, int modifiers)
+
+ Indicates that the virtual \a key was clicked with the given \a text and
+ \a modifiers.
+ This signal is emitted after the input method has processed the key event.
+*/
+
+/*!
+ \fn void QVirtualKeyboardInputEngine::virtualKeyClicked(Qt::Key key, const QString &text, Qt::KeyboardModifiers modifiers, bool isAutoRepeat)
+
+ Indicates that the virtual \a key was clicked with the given \a text and
+ \a modifiers. The \a isAutoRepeat indicates if the event is automatically
+ repeated while the key is being pressed.
+ This signal is emitted after the input method has processed the key event.
+*/
+
+/*!
+ \qmlproperty list<int> InputEngine::patternRecognitionModes
+ \since QtQuick.VirtualKeyboard 2.0
+
+ The list of available pattern recognition modes.
+*/
+
+/*!
+ \property QVirtualKeyboardInputEngine::patternRecognitionModes
+ \since QtQuick.VirtualKeyboard 2.0
+ \brief the list of available pattern recognition modes.
+
+ The list of available pattern recognition modes.
+*/
+
+/*!
+ \qmlsignal void InputEngine::activeKeyChanged(int key)
+
+ Indicates that the active \a key has changed.
+*/
+
+/*!
+ \fn void QVirtualKeyboardInputEngine::activeKeyChanged(Qt::Key key)
+
+ Indicates that the active \a key has changed.
+*/
+
+/*!
+ \qmlsignal void InputEngine::previousKeyChanged(int key)
+
+ Indicates that the previous \a key has changed.
+*/
+
+/*!
+ \fn void QVirtualKeyboardInputEngine::previousKeyChanged(Qt::Key key)
+
+ Indicates that the previous \a key has changed.
+*/
+
+/*!
+ \qmlsignal void InputEngine::inputMethodChanged()
+
+ Indicates that the input method has changed.
+*/
+
+/*!
+ \fn void QVirtualKeyboardInputEngine::inputMethodChanged()
+
+ Indicates that the input method has changed.
+*/
+
+/*!
+ \qmlsignal void InputEngine::inputMethodReset()
+
+ Emitted when the input method needs to be reset.
+
+ \note This signal is automatically connected to QVirtualKeyboardAbstractInputMethod::reset()
+ and InputMethod::reset() when the input method is activated.
+*/
+
+/*!
+ \fn void QVirtualKeyboardInputEngine::inputMethodReset()
+
+ Emitted when the input method needs to be reset.
+
+ \note This signal is automatically connected to QVirtualKeyboardAbstractInputMethod::reset()
+ and InputMethod::reset() when the input method is activated.
+*/
+
+/*!
+ \qmlsignal void InputEngine::inputMethodUpdate()
+
+ \note This signal is automatically connected to QVirtualKeyboardAbstractInputMethod::update()
+ and InputMethod::update() when the input method is activated.
+*/
+
+/*!
+ \fn void QVirtualKeyboardInputEngine::inputMethodUpdate()
+
+ \note This signal is automatically connected to QVirtualKeyboardAbstractInputMethod::update()
+ and InputMethod::update() when the input method is activated.
+*/
+
+/*!
+ \qmlsignal void InputEngine::inputModesChanged()
+
+ Indicates that the available input modes have changed.
+*/
+
+/*!
+ \fn void QVirtualKeyboardInputEngine::inputModesChanged()
+
+ Indicates that the available input modes have changed.
+*/
+
+/*!
+ \qmlsignal void InputEngine::inputModeChanged()
+
+ Indicates that the input mode has changed.
+*/
+
+/*!
+ \fn void QVirtualKeyboardInputEngine::inputModeChanged()
+
+ Indicates that the input mode has changed.
+*/
+
+/*!
+ \qmlsignal void InputEngine::patternRecognitionModesChanged()
+ \since QtQuick.VirtualKeyboard 2.0
+
+ Indicates that the available pattern recognition modes have changed.
+
+ The predefined pattern recognition modes are:
+
+ \list
+ \li \c InputEngine.PatternRecognitionMode.None Pattern recognition is not available.
+ \li \c InputEngine.PatternRecognitionMode.PatternRecognitionDisabled \c obsolete Use InputEngine.PatternRecognitionMode.None
+ \li \c InputEngine.PatternRecognitionMode.Handwriting Pattern recognition mode for handwriting recognition.
+ \li \c InputEngine.PatternRecognitionMode.HandwritingRecoginition \c obsolete Use InputEngine.PatternRecognitionMode.Handwriting
+ \endlist
+*/
+
+/*!
+ \fn void QVirtualKeyboardInputEngine::patternRecognitionModesChanged()
+ \since QtQuick.VirtualKeyboard 2.0
+
+ Indicates that the available pattern recognition modes have changed.
+*/
+
+QT_END_NAMESPACE