| 1 | /**************************************************************************** |
| 2 | ** |
| 3 | ** Copyright (C) 2016 The Qt Company Ltd. |
| 4 | ** Contact: https://www.qt.io/licensing/ |
| 5 | ** |
| 6 | ** This file is part of the Qt Virtual Keyboard module of the Qt Toolkit. |
| 7 | ** |
| 8 | ** $QT_BEGIN_LICENSE:GPL$ |
| 9 | ** Commercial License Usage |
| 10 | ** Licensees holding valid commercial Qt licenses may use this file in |
| 11 | ** accordance with the commercial license agreement provided with the |
| 12 | ** Software or, alternatively, in accordance with the terms contained in |
| 13 | ** a written agreement between you and The Qt Company. For licensing terms |
| 14 | ** and conditions see https://www.qt.io/terms-conditions. For further |
| 15 | ** information use the contact form at https://www.qt.io/contact-us. |
| 16 | ** |
| 17 | ** GNU General Public License Usage |
| 18 | ** Alternatively, this file may be used under the terms of the GNU |
| 19 | ** General Public License version 3 or (at your option) any later version |
| 20 | ** approved by the KDE Free Qt Foundation. The licenses are as published by |
| 21 | ** the Free Software Foundation and appearing in the file LICENSE.GPL3 |
| 22 | ** included in the packaging of this file. Please review the following |
| 23 | ** information to ensure the GNU General Public License requirements will |
| 24 | ** be met: https://www.gnu.org/licenses/gpl-3.0.html. |
| 25 | ** |
| 26 | ** $QT_END_LICENSE$ |
| 27 | ** |
| 28 | ****************************************************************************/ |
| 29 | |
| 30 | #include <QtVirtualKeyboard/qvirtualkeyboardinputengine.h> |
| 31 | #include <QtVirtualKeyboard/qvirtualkeyboardinputcontext.h> |
| 32 | #include <QtVirtualKeyboard/private/qvirtualkeyboardinputcontext_p.h> |
| 33 | #include <QtVirtualKeyboard/private/shifthandler_p.h> |
| 34 | #include <QtVirtualKeyboard/private/fallbackinputmethod_p.h> |
| 35 | #include <QtVirtualKeyboard/qvirtualkeyboardtrace.h> |
| 36 | #include <QtVirtualKeyboard/private/virtualkeyboarddebug_p.h> |
| 37 | |
| 38 | #include <QTimerEvent> |
| 39 | #include <QtCore/private/qobject_p.h> |
| 40 | |
| 41 | QT_BEGIN_NAMESPACE |
| 42 | using namespace QtVirtualKeyboard; |
| 43 | |
| 44 | class QVirtualKeyboardInputEnginePrivate : public QObjectPrivate |
| 45 | { |
| 46 | Q_DECLARE_PUBLIC(QVirtualKeyboardInputEngine) |
| 47 | |
| 48 | public: |
| 49 | QVirtualKeyboardInputEnginePrivate(QVirtualKeyboardInputEngine *q_ptr) : |
| 50 | QObjectPrivate(), |
| 51 | q_ptr(q_ptr), |
| 52 | inputContext(nullptr), |
| 53 | fallbackInputMethod(nullptr), |
| 54 | textCase(QVirtualKeyboardInputEngine::TextCase::Lower), |
| 55 | inputMode(QVirtualKeyboardInputEngine::InputMode::Latin), |
| 56 | activeKey(Qt::Key_unknown), |
| 57 | activeKeyModifiers(Qt::NoModifier), |
| 58 | previousKey(Qt::Key_unknown), |
| 59 | repeatTimer(0), |
| 60 | repeatCount(0), |
| 61 | recursiveMethodLock(0) |
| 62 | { |
| 63 | } |
| 64 | |
| 65 | virtual ~QVirtualKeyboardInputEnginePrivate() |
| 66 | { |
| 67 | } |
| 68 | |
| 69 | bool virtualKeyClick(Qt::Key key, const QString &text, Qt::KeyboardModifiers modifiers, bool isAutoRepeat) |
| 70 | { |
| 71 | Q_Q(QVirtualKeyboardInputEngine); |
| 72 | bool accept = false; |
| 73 | if (inputMethod) { |
| 74 | accept = inputMethod->keyEvent(key, text, modifiers); |
| 75 | if (!accept) { |
| 76 | accept = fallbackInputMethod->keyEvent(key, text, modifiers); |
| 77 | } |
| 78 | emit q->virtualKeyClicked(key, text, modifiers, isAutoRepeat); |
| 79 | } else if (QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS) { |
| 80 | accept = fallbackInputMethod->keyEvent(key, text, modifiers); |
| 81 | emit q->virtualKeyClicked(key, text, modifiers, isAutoRepeat); |
| 82 | } else { |
| 83 | qWarning() << "input method is not set" ; |
| 84 | } |
| 85 | return accept; |
| 86 | } |
| 87 | |
| 88 | QVirtualKeyboardInputEngine* q_ptr; |
| 89 | QVirtualKeyboardInputContext *inputContext; |
| 90 | QPointer<QVirtualKeyboardAbstractInputMethod> inputMethod; |
| 91 | QVirtualKeyboardAbstractInputMethod *fallbackInputMethod; |
| 92 | QVirtualKeyboardInputEngine::TextCase textCase; |
| 93 | QVirtualKeyboardInputEngine::InputMode inputMode; |
| 94 | QList<int> inputModes; |
| 95 | QMap<QVirtualKeyboardSelectionListModel::Type, QVirtualKeyboardSelectionListModel *> selectionListModels; |
| 96 | Qt::Key activeKey; |
| 97 | QString activeKeyText; |
| 98 | Qt::KeyboardModifiers activeKeyModifiers; |
| 99 | Qt::Key previousKey; |
| 100 | int repeatTimer; |
| 101 | int repeatCount; |
| 102 | int recursiveMethodLock; |
| 103 | }; |
| 104 | |
| 105 | class RecursiveMethodGuard |
| 106 | { |
| 107 | public: |
| 108 | explicit RecursiveMethodGuard(int &ref) : m_ref(ref) |
| 109 | { |
| 110 | m_ref++; |
| 111 | } |
| 112 | ~RecursiveMethodGuard() |
| 113 | { |
| 114 | m_ref--; |
| 115 | } |
| 116 | bool locked() const |
| 117 | { |
| 118 | return m_ref > 1; |
| 119 | } |
| 120 | private: |
| 121 | int &m_ref; |
| 122 | }; |
| 123 | |
| 124 | /*! |
| 125 | \qmltype InputEngine |
| 126 | \inqmlmodule QtQuick.VirtualKeyboard |
| 127 | \ingroup qtvirtualkeyboard-qml |
| 128 | \instantiates QVirtualKeyboardInputEngine |
| 129 | \brief Maps the user input to the input methods. |
| 130 | |
| 131 | The input engine is responsible for routing input events to input |
| 132 | methods. The actual input logic is implemented by the input methods. |
| 133 | |
| 134 | The input engine also includes the default input method, which takes |
| 135 | care of default processing if the active input method does not handle |
| 136 | the event. |
| 137 | */ |
| 138 | |
| 139 | /*! |
| 140 | \class QVirtualKeyboardInputEngine |
| 141 | \inmodule QtVirtualKeyboard |
| 142 | \brief The InputEngine class provides an input engine |
| 143 | that supports C++ and QML integration. |
| 144 | |
| 145 | The input engine is responsible for routing input events to input |
| 146 | methods. The actual input logic is implemented by the input methods. |
| 147 | |
| 148 | The input engine also includes the default input method, which takes |
| 149 | care of default processing if the active input method does not handle |
| 150 | the event. |
| 151 | */ |
| 152 | |
| 153 | /*! |
| 154 | \internal |
| 155 | Constructs an input engine with input context as \a parent. |
| 156 | */ |
| 157 | QVirtualKeyboardInputEngine::QVirtualKeyboardInputEngine(QVirtualKeyboardInputContext *parent) : |
| 158 | QObject(*new QVirtualKeyboardInputEnginePrivate(this), parent) |
| 159 | { |
| 160 | Q_D(QVirtualKeyboardInputEngine); |
| 161 | d->inputContext = parent; |
| 162 | } |
| 163 | |
| 164 | void QVirtualKeyboardInputEngine::init() |
| 165 | { |
| 166 | Q_D(QVirtualKeyboardInputEngine); |
| 167 | ShiftHandler *shiftHandler = d->inputContext->priv()->shiftHandler(); |
| 168 | QObject::connect(sender: shiftHandler, signal: &ShiftHandler::shiftActiveChanged, receiver: this, slot: &QVirtualKeyboardInputEngine::shiftChanged); |
| 169 | QObject::connect(sender: d->inputContext, signal: &QVirtualKeyboardInputContext::localeChanged, receiver: this, slot: &QVirtualKeyboardInputEngine::update); |
| 170 | QObject::connect(sender: d->inputContext, signal: &QVirtualKeyboardInputContext::inputMethodHintsChanged, receiver: this, slot: &QVirtualKeyboardInputEngine::updateSelectionListModels); |
| 171 | QObject::connect(sender: d->inputContext, signal: &QVirtualKeyboardInputContext::localeChanged, receiver: this, slot: &QVirtualKeyboardInputEngine::updateInputModes); |
| 172 | QObject::connect(sender: this, signal: &QVirtualKeyboardInputEngine::inputMethodChanged, receiver: this, slot: &QVirtualKeyboardInputEngine::updateInputModes); |
| 173 | d->fallbackInputMethod = new FallbackInputMethod(this); |
| 174 | if (d->fallbackInputMethod) |
| 175 | d->fallbackInputMethod->setInputEngine(this); |
| 176 | d->selectionListModels[QVirtualKeyboardSelectionListModel::Type::WordCandidateList] = new QVirtualKeyboardSelectionListModel(this); |
| 177 | } |
| 178 | |
| 179 | /*! |
| 180 | \internal |
| 181 | Destroys the input engine and frees all allocated resources. |
| 182 | */ |
| 183 | QVirtualKeyboardInputEngine::~QVirtualKeyboardInputEngine() |
| 184 | { |
| 185 | } |
| 186 | |
| 187 | /*! |
| 188 | \qmlmethod bool InputEngine::virtualKeyPress(int key, string text, int modifiers, bool repeat) |
| 189 | |
| 190 | Called by the keyboard layer to indicate that \a key was pressed, with |
| 191 | the given \a text and \a modifiers. |
| 192 | |
| 193 | The \a key is set as an active key (down key). The actual key event is |
| 194 | triggered when the key is released by the virtualKeyRelease() method. The |
| 195 | key press event can be discarded by calling virtualKeyCancel(). |
| 196 | |
| 197 | The key press also initiates the key repeat timer if \a repeat is \c true. |
| 198 | |
| 199 | Returns \c true if the key was accepted by this input engine. |
| 200 | |
| 201 | \sa virtualKeyCancel(), virtualKeyRelease() |
| 202 | */ |
| 203 | /*! |
| 204 | Called by the keyboard layer to indicate that \a key was pressed, with |
| 205 | the given \a text and \a modifiers. |
| 206 | |
| 207 | The \a key is set as an active key (down key). The actual key event is |
| 208 | triggered when the key is released by the virtualKeyRelease() method. The |
| 209 | key press event can be discarded by calling virtualKeyCancel(). |
| 210 | |
| 211 | The key press also initiates the key repeat timer if \a repeat is \c true. |
| 212 | |
| 213 | Returns \c true if the key was accepted by this input engine. |
| 214 | |
| 215 | \sa virtualKeyCancel(), virtualKeyRelease() |
| 216 | */ |
| 217 | bool QVirtualKeyboardInputEngine::virtualKeyPress(Qt::Key key, const QString &text, Qt::KeyboardModifiers modifiers, bool repeat) |
| 218 | { |
| 219 | Q_D(QVirtualKeyboardInputEngine); |
| 220 | VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::virtualKeyPress()" |
| 221 | #ifdef SENSITIVE_DEBUG |
| 222 | << key << text << modifiers << repeat |
| 223 | #endif |
| 224 | ; |
| 225 | |
| 226 | bool accept = false; |
| 227 | if (d->activeKey == Qt::Key_unknown || d->activeKey == key) { |
| 228 | d->activeKey = key; |
| 229 | d->activeKeyText = text; |
| 230 | d->activeKeyModifiers = modifiers; |
| 231 | if (repeat) { |
| 232 | d->repeatTimer = startTimer(interval: 600); |
| 233 | } |
| 234 | accept = true; |
| 235 | emit activeKeyChanged(key: d->activeKey); |
| 236 | } else { |
| 237 | qWarning(msg: "key press ignored; key is already active" ); |
| 238 | } |
| 239 | return accept; |
| 240 | } |
| 241 | |
| 242 | /*! |
| 243 | \qmlmethod void InputEngine::virtualKeyCancel() |
| 244 | |
| 245 | Reverts the active key state without emitting the key event. |
| 246 | This method is useful when the user discards the current key and |
| 247 | the key state needs to be restored. |
| 248 | */ |
| 249 | /*! |
| 250 | \fn void QVirtualKeyboardInputEngine::virtualKeyCancel() |
| 251 | |
| 252 | Reverts the active key state without emitting the key event. |
| 253 | This method is useful when the user discards the current key and |
| 254 | the key state needs to be restored. |
| 255 | */ |
| 256 | void QVirtualKeyboardInputEngine::virtualKeyCancel() |
| 257 | { |
| 258 | Q_D(QVirtualKeyboardInputEngine); |
| 259 | VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::virtualKeyCancel()" ; |
| 260 | if (d->activeKey != Qt::Key_unknown) { |
| 261 | d->activeKey = Qt::Key_unknown; |
| 262 | d->activeKeyText = QString(); |
| 263 | d->activeKeyModifiers = Qt::KeyboardModifiers(); |
| 264 | if (d->repeatTimer) { |
| 265 | killTimer(id: d->repeatTimer); |
| 266 | d->repeatTimer = 0; |
| 267 | d->repeatCount = 0; |
| 268 | } |
| 269 | emit activeKeyChanged(key: d->activeKey); |
| 270 | } |
| 271 | } |
| 272 | |
| 273 | /*! |
| 274 | \qmlmethod bool InputEngine::virtualKeyRelease(int key, string text, int modifiers) |
| 275 | |
| 276 | Releases the key at \a key. The method emits a key event for the input |
| 277 | method if the event has not been generated by a repeating timer. |
| 278 | The \a text and \a modifiers are passed to the input method. |
| 279 | |
| 280 | Returns \c true if the key was accepted by the input engine. |
| 281 | */ |
| 282 | /*! |
| 283 | Releases the key at \a key. The method emits a key event for the input |
| 284 | method if the event has not been generated by a repeating timer. |
| 285 | The \a text and \a modifiers are passed to the input method. |
| 286 | |
| 287 | Returns \c true if the key was accepted by the input engine. |
| 288 | */ |
| 289 | bool QVirtualKeyboardInputEngine::virtualKeyRelease(Qt::Key key, const QString &text, Qt::KeyboardModifiers modifiers) |
| 290 | { |
| 291 | Q_D(QVirtualKeyboardInputEngine); |
| 292 | VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::virtualKeyRelease()" |
| 293 | #ifdef SENSITIVE_DEBUG |
| 294 | << key << text << modifiers |
| 295 | #endif |
| 296 | ; |
| 297 | |
| 298 | bool accept = false; |
| 299 | if (d->activeKey == key) { |
| 300 | if (!d->repeatCount) { |
| 301 | accept = d->virtualKeyClick(key, text, modifiers, isAutoRepeat: false); |
| 302 | } else { |
| 303 | accept = true; |
| 304 | } |
| 305 | } else { |
| 306 | qWarning(msg: "key release ignored; key is not pressed" ); |
| 307 | } |
| 308 | if (d->activeKey != Qt::Key_unknown) { |
| 309 | d->previousKey = d->activeKey; |
| 310 | emit previousKeyChanged(key: d->previousKey); |
| 311 | d->activeKey = Qt::Key_unknown; |
| 312 | d->activeKeyText = QString(); |
| 313 | d->activeKeyModifiers = Qt::KeyboardModifiers(); |
| 314 | if (d->repeatTimer) { |
| 315 | killTimer(id: d->repeatTimer); |
| 316 | d->repeatTimer = 0; |
| 317 | d->repeatCount = 0; |
| 318 | } |
| 319 | emit activeKeyChanged(key: d->activeKey); |
| 320 | } |
| 321 | return accept; |
| 322 | } |
| 323 | |
| 324 | /*! |
| 325 | \qmlmethod bool InputEngine::virtualKeyClick(int key, string text, int modifiers) |
| 326 | |
| 327 | Emits a key click event for the given \a key, \a text and \a modifiers. |
| 328 | Returns \c true if the key event was accepted by the input engine. |
| 329 | */ |
| 330 | /*! |
| 331 | Emits a key click event for the given \a key, \a text and \a modifiers. |
| 332 | Returns \c true if the key event was accepted by the input engine. |
| 333 | */ |
| 334 | bool QVirtualKeyboardInputEngine::virtualKeyClick(Qt::Key key, const QString &text, Qt::KeyboardModifiers modifiers) |
| 335 | { |
| 336 | Q_D(QVirtualKeyboardInputEngine); |
| 337 | VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::virtualKeyClick()" |
| 338 | #ifdef SENSITIVE_DEBUG |
| 339 | << key << text << modifiers |
| 340 | #endif |
| 341 | ; |
| 342 | return d->virtualKeyClick(key, text, modifiers, isAutoRepeat: false); |
| 343 | } |
| 344 | |
| 345 | /*! |
| 346 | Returns the \c InputContext instance associated with the input |
| 347 | engine. |
| 348 | */ |
| 349 | QVirtualKeyboardInputContext *QVirtualKeyboardInputEngine::inputContext() const |
| 350 | { |
| 351 | Q_D(const QVirtualKeyboardInputEngine); |
| 352 | return d->inputContext; |
| 353 | } |
| 354 | |
| 355 | /*! |
| 356 | Returns the currently active key, or Qt::Key_unknown if no key is active. |
| 357 | */ |
| 358 | Qt::Key QVirtualKeyboardInputEngine::activeKey() const |
| 359 | { |
| 360 | Q_D(const QVirtualKeyboardInputEngine); |
| 361 | return d->activeKey; |
| 362 | } |
| 363 | |
| 364 | /*! |
| 365 | Returns the previously active key, or Qt::Key_unknown if no key has been |
| 366 | active. |
| 367 | */ |
| 368 | Qt::Key QVirtualKeyboardInputEngine::previousKey() const |
| 369 | { |
| 370 | Q_D(const QVirtualKeyboardInputEngine); |
| 371 | return d->previousKey; |
| 372 | } |
| 373 | |
| 374 | /*! |
| 375 | Returns the active input method. |
| 376 | */ |
| 377 | QVirtualKeyboardAbstractInputMethod *QVirtualKeyboardInputEngine::inputMethod() const |
| 378 | { |
| 379 | Q_D(const QVirtualKeyboardInputEngine); |
| 380 | return d->inputMethod; |
| 381 | } |
| 382 | |
| 383 | /*! |
| 384 | Sets \a inputMethod as the active input method. |
| 385 | */ |
| 386 | void QVirtualKeyboardInputEngine::setInputMethod(QVirtualKeyboardAbstractInputMethod *inputMethod) |
| 387 | { |
| 388 | Q_D(QVirtualKeyboardInputEngine); |
| 389 | VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::setInputMethod():" << inputMethod; |
| 390 | if (d->inputMethod != inputMethod) { |
| 391 | update(); |
| 392 | if (d->inputMethod) { |
| 393 | QObject::disconnect(sender: d->inputMethod.data(), signal: &QVirtualKeyboardAbstractInputMethod::selectionListsChanged, receiver: this, slot: &QVirtualKeyboardInputEngine::updateSelectionListModels); |
| 394 | d->inputMethod->setInputEngine(nullptr); |
| 395 | } |
| 396 | d->inputMethod = inputMethod; |
| 397 | if (d->inputMethod) { |
| 398 | d->inputMethod->setInputEngine(this); |
| 399 | QObject::connect(sender: d->inputMethod.data(), signal: &QVirtualKeyboardAbstractInputMethod::selectionListsChanged, receiver: this, slot: &QVirtualKeyboardInputEngine::updateSelectionListModels); |
| 400 | |
| 401 | // Set current text case |
| 402 | d->inputMethod->setTextCase(d->textCase); |
| 403 | } |
| 404 | updateSelectionListModels(); |
| 405 | emit inputMethodChanged(); |
| 406 | emit patternRecognitionModesChanged(); |
| 407 | } |
| 408 | } |
| 409 | |
| 410 | /*! |
| 411 | Returns the list of available input modes. |
| 412 | */ |
| 413 | QList<int> QVirtualKeyboardInputEngine::inputModes() const |
| 414 | { |
| 415 | Q_D(const QVirtualKeyboardInputEngine); |
| 416 | return d->inputModes; |
| 417 | } |
| 418 | |
| 419 | QVirtualKeyboardInputEngine::InputMode QVirtualKeyboardInputEngine::inputMode() const |
| 420 | { |
| 421 | Q_D(const QVirtualKeyboardInputEngine); |
| 422 | return d->inputMode; |
| 423 | } |
| 424 | |
| 425 | void QVirtualKeyboardInputEngine::setInputMode(QVirtualKeyboardInputEngine::InputMode inputMode) |
| 426 | { |
| 427 | Q_D(QVirtualKeyboardInputEngine); |
| 428 | VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::setInputMode():" << inputMode; |
| 429 | if (d->inputMethod) { |
| 430 | #ifdef QT_DEBUG |
| 431 | // Cached input modes should be in sync with the input method |
| 432 | // If the assert below fails, we have missed an update somewhere |
| 433 | QList<int> cachedInputModes(d->inputModes); |
| 434 | updateInputModes(); |
| 435 | Q_ASSERT(cachedInputModes == d->inputModes); |
| 436 | #endif |
| 437 | if (d->inputModes.contains(t: static_cast<int>(inputMode))) { |
| 438 | d->inputMethod->setInputMode(locale: d->inputContext->locale(), inputMode); |
| 439 | if (d->inputMode != inputMode) { |
| 440 | d->inputMode = inputMode; |
| 441 | emit inputModeChanged(); |
| 442 | } |
| 443 | } else { |
| 444 | qWarning() << "Input mode" << inputMode << |
| 445 | "is not in the list of available input modes" << d->inputModes; |
| 446 | } |
| 447 | } |
| 448 | } |
| 449 | |
| 450 | QVirtualKeyboardSelectionListModel *QVirtualKeyboardInputEngine::wordCandidateListModel() const |
| 451 | { |
| 452 | Q_D(const QVirtualKeyboardInputEngine); |
| 453 | return d->selectionListModels[QVirtualKeyboardSelectionListModel::Type::WordCandidateList]; |
| 454 | } |
| 455 | |
| 456 | bool QVirtualKeyboardInputEngine::wordCandidateListVisibleHint() const |
| 457 | { |
| 458 | Q_D(const QVirtualKeyboardInputEngine); |
| 459 | const auto it = d->selectionListModels.constFind(akey: QVirtualKeyboardSelectionListModel::Type::WordCandidateList); |
| 460 | if (it == d->selectionListModels.cend()) |
| 461 | return false; |
| 462 | return it.value()->dataSource() != nullptr; |
| 463 | } |
| 464 | |
| 465 | /*! |
| 466 | Returns list of supported pattern recognition modes. |
| 467 | */ |
| 468 | QList<int> QVirtualKeyboardInputEngine::patternRecognitionModes() const |
| 469 | { |
| 470 | Q_D(const QVirtualKeyboardInputEngine); |
| 471 | QList<PatternRecognitionMode> patterRecognitionModeList; |
| 472 | if (d->inputMethod) |
| 473 | patterRecognitionModeList = d->inputMethod->patternRecognitionModes(); |
| 474 | QList<int> resultList; |
| 475 | if (patterRecognitionModeList.isEmpty()) |
| 476 | return resultList; |
| 477 | resultList.reserve(alloc: patterRecognitionModeList.size()); |
| 478 | for (const PatternRecognitionMode &patternRecognitionMode : qAsConst(t&: patterRecognitionModeList)) |
| 479 | resultList.append(t: static_cast<int>(patternRecognitionMode)); |
| 480 | return resultList; |
| 481 | } |
| 482 | |
| 483 | /*! |
| 484 | \qmlmethod Trace InputEngine::traceBegin(int traceId, int patternRecognitionMode, var traceCaptureDeviceInfo, var traceScreenInfo) |
| 485 | \since QtQuick.VirtualKeyboard 2.0 |
| 486 | |
| 487 | Starts a trace interaction with the input engine. |
| 488 | |
| 489 | The trace is uniquely identified by the \a traceId. The input engine will assign |
| 490 | the id to the Trace object if the input method accepts the event. |
| 491 | |
| 492 | The \a patternRecognitionMode specifies the recognition mode used for the pattern. |
| 493 | |
| 494 | If the current input method accepts the event it returns a Trace object associated with this interaction. |
| 495 | If the input method discards the event, it returns a null value. |
| 496 | |
| 497 | The \a traceCaptureDeviceInfo provides information about the source device and the \a traceScreenInfo |
| 498 | provides information about the screen context. |
| 499 | |
| 500 | By definition, the Trace object remains valid until the traceEnd() method is called. |
| 501 | |
| 502 | The trace interaction is ended by calling the \l {InputEngine::traceEnd()} {InputEngine.traceEnd()} method. |
| 503 | */ |
| 504 | /*! |
| 505 | \since QtQuick.VirtualKeyboard 2.0 |
| 506 | |
| 507 | Starts a trace interaction with the input engine. |
| 508 | |
| 509 | The trace is uniquely identified by the \a traceId. The input engine will assign |
| 510 | the id to the QVirtualKeyboardTrace object if the input method accepts the event. |
| 511 | |
| 512 | The \a patternRecognitionMode specifies the recognition mode used for the pattern. |
| 513 | |
| 514 | If the current input method accepts the event it returns a QVirtualKeyboardTrace object associated with this interaction. |
| 515 | If the input method discards the event, it returns a NULL value. |
| 516 | |
| 517 | The \a traceCaptureDeviceInfo provides information about the source device and the \a traceScreenInfo |
| 518 | provides information about the screen context. |
| 519 | |
| 520 | By definition, the QVirtualKeyboardTrace object remains valid until the traceEnd() method is called. |
| 521 | |
| 522 | The trace interaction is ended by calling the traceEnd() method. |
| 523 | */ |
| 524 | QVirtualKeyboardTrace *QVirtualKeyboardInputEngine::traceBegin( |
| 525 | int traceId, PatternRecognitionMode patternRecognitionMode, |
| 526 | const QVariantMap &traceCaptureDeviceInfo, const QVariantMap &traceScreenInfo) |
| 527 | { |
| 528 | Q_D(QVirtualKeyboardInputEngine); |
| 529 | VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::traceBegin():" |
| 530 | << "traceId:" << traceId |
| 531 | << "patternRecognitionMode:" << patternRecognitionMode |
| 532 | << "traceCaptureDeviceInfo:" << traceCaptureDeviceInfo |
| 533 | << "traceScreenInfo:" << traceScreenInfo; |
| 534 | if (!d->inputMethod) |
| 535 | return nullptr; |
| 536 | if (patternRecognitionMode == PatternRecognitionMode::None) |
| 537 | return nullptr; |
| 538 | if (!d->inputMethod->patternRecognitionModes().contains(t: patternRecognitionMode)) |
| 539 | return nullptr; |
| 540 | QVirtualKeyboardTrace *trace = d->inputMethod->traceBegin(traceId, patternRecognitionMode, traceCaptureDeviceInfo, traceScreenInfo); |
| 541 | if (trace) |
| 542 | trace->setTraceId(traceId); |
| 543 | return trace; |
| 544 | } |
| 545 | |
| 546 | /*! |
| 547 | \qmlmethod bool InputEngine::traceEnd(Trace trace) |
| 548 | |
| 549 | Ends the trace interaction with the input engine. |
| 550 | |
| 551 | The \a trace object may be discarded at any point after calling this function. |
| 552 | |
| 553 | The function returns true if the trace interaction was accepted (i.e. the touch |
| 554 | events should not be used for anything else). |
| 555 | */ |
| 556 | /*! |
| 557 | Ends the trace interaction with the input engine. |
| 558 | |
| 559 | The \a trace object may be discarded at any point after calling this function. |
| 560 | |
| 561 | The function returns true if the trace interaction was accepted (i.e. the touch |
| 562 | events should not be used for anything else). |
| 563 | */ |
| 564 | bool QVirtualKeyboardInputEngine::traceEnd(QVirtualKeyboardTrace *trace) |
| 565 | { |
| 566 | Q_D(QVirtualKeyboardInputEngine); |
| 567 | VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::traceEnd():" << trace; |
| 568 | Q_ASSERT(trace); |
| 569 | if (!d->inputMethod) |
| 570 | return false; |
| 571 | return d->inputMethod->traceEnd(trace); |
| 572 | } |
| 573 | |
| 574 | /*! |
| 575 | \since QtQuick.VirtualKeyboard 2.0 |
| 576 | |
| 577 | This function attempts to reselect a word located at the \a cursorPosition. |
| 578 | The \a reselectFlags define the rules for how the word should be selected in |
| 579 | relation to the cursor position. |
| 580 | |
| 581 | The function returns \c true if the word was successfully reselected. |
| 582 | */ |
| 583 | bool QVirtualKeyboardInputEngine::reselect(int cursorPosition, const ReselectFlags &reselectFlags) |
| 584 | { |
| 585 | Q_D(QVirtualKeyboardInputEngine); |
| 586 | VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputEngine::reselect():" << cursorPosition << reselectFlags; |
| 587 | if (!d->inputMethod || !wordCandidateListVisibleHint()) |
| 588 | return false; |
| 589 | return d->inputMethod->reselect(cursorPosition, reselectFlags); |
| 590 | } |
| 591 | |
| 592 | /*! |
| 593 | \internal |
| 594 | This method is called when the current preedit text is clicked. |
| 595 | */ |
| 596 | bool QVirtualKeyboardInputEngine::clickPreeditText(int cursorPosition) |
| 597 | { |
| 598 | Q_D(QVirtualKeyboardInputEngine); |
| 599 | if (!d->inputMethod) |
| 600 | return false; |
| 601 | return d->inputMethod->clickPreeditText(cursorPosition); |
| 602 | } |
| 603 | |
| 604 | /*! |
| 605 | \internal |
| 606 | Resets the input method. |
| 607 | */ |
| 608 | void QVirtualKeyboardInputEngine::reset() |
| 609 | { |
| 610 | Q_D(QVirtualKeyboardInputEngine); |
| 611 | if (d->inputMethod) { |
| 612 | RecursiveMethodGuard guard(d->recursiveMethodLock); |
| 613 | if (!guard.locked()) { |
| 614 | emit inputMethodReset(); |
| 615 | updateInputModes(); |
| 616 | } |
| 617 | } else { |
| 618 | updateInputModes(); |
| 619 | } |
| 620 | } |
| 621 | |
| 622 | /*! |
| 623 | \internal |
| 624 | Updates the input method's state. This method is called whenever the input |
| 625 | context is changed. |
| 626 | */ |
| 627 | void QVirtualKeyboardInputEngine::update() |
| 628 | { |
| 629 | Q_D(QVirtualKeyboardInputEngine); |
| 630 | if (d->inputMethod) { |
| 631 | RecursiveMethodGuard guard(d->recursiveMethodLock); |
| 632 | if (!guard.locked()) { |
| 633 | emit inputMethodUpdate(); |
| 634 | } |
| 635 | } |
| 636 | } |
| 637 | |
| 638 | /*! |
| 639 | \internal |
| 640 | Updates the text case for the input method. |
| 641 | */ |
| 642 | void QVirtualKeyboardInputEngine::shiftChanged() |
| 643 | { |
| 644 | Q_D(QVirtualKeyboardInputEngine); |
| 645 | TextCase newCase = d->inputContext->priv()->shiftHandler()->isShiftActive() ? TextCase::Upper : TextCase::Lower; |
| 646 | if (d->textCase != newCase) { |
| 647 | d->textCase = newCase; |
| 648 | if (d->inputMethod) { |
| 649 | d->inputMethod->setTextCase(d->textCase); |
| 650 | } |
| 651 | } |
| 652 | } |
| 653 | |
| 654 | /*! |
| 655 | \internal |
| 656 | */ |
| 657 | void QVirtualKeyboardInputEngine::updateSelectionListModels() |
| 658 | { |
| 659 | Q_D(QVirtualKeyboardInputEngine); |
| 660 | QList<QVirtualKeyboardSelectionListModel::Type> inactiveSelectionLists = d->selectionListModels.keys(); |
| 661 | if (d->inputMethod) { |
| 662 | // Allocate selection lists for the input method |
| 663 | const QList<QVirtualKeyboardSelectionListModel::Type> activeSelectionLists = d->inputMethod->selectionLists(); |
| 664 | for (const QVirtualKeyboardSelectionListModel::Type &selectionListType : activeSelectionLists) { |
| 665 | auto it = d->selectionListModels.find(akey: selectionListType); |
| 666 | if (it == d->selectionListModels.end()) { |
| 667 | it = d->selectionListModels.insert(akey: selectionListType, avalue: new QVirtualKeyboardSelectionListModel(this)); |
| 668 | if (selectionListType == QVirtualKeyboardSelectionListModel::Type::WordCandidateList) |
| 669 | emit wordCandidateListModelChanged(); |
| 670 | } |
| 671 | it.value()->setDataSource(dataSource: d->inputMethod, type: selectionListType); |
| 672 | if (selectionListType == QVirtualKeyboardSelectionListModel::Type::WordCandidateList) |
| 673 | emit wordCandidateListVisibleHintChanged(); |
| 674 | inactiveSelectionLists.removeAll(t: selectionListType); |
| 675 | } |
| 676 | } |
| 677 | |
| 678 | // Deallocate inactive selection lists |
| 679 | for (const QVirtualKeyboardSelectionListModel::Type &selectionListType : qAsConst(t&: inactiveSelectionLists)) { |
| 680 | const auto it = d->selectionListModels.constFind(akey: selectionListType); |
| 681 | if (it != d->selectionListModels.cend()) { |
| 682 | it.value()->setDataSource(dataSource: nullptr, type: selectionListType); |
| 683 | if (selectionListType == QVirtualKeyboardSelectionListModel::Type::WordCandidateList) |
| 684 | emit wordCandidateListVisibleHintChanged(); |
| 685 | } |
| 686 | } |
| 687 | } |
| 688 | |
| 689 | /*! |
| 690 | \internal |
| 691 | */ |
| 692 | void QVirtualKeyboardInputEngine::updateInputModes() |
| 693 | { |
| 694 | Q_D(QVirtualKeyboardInputEngine); |
| 695 | QList<int> newInputModes; |
| 696 | if (d->inputMethod) { |
| 697 | QList<InputMode> tmpList(d->inputMethod->inputModes(locale: d->inputContext->locale())); |
| 698 | if (!tmpList.isEmpty()) { |
| 699 | std::transform(first: tmpList.constBegin(), last: tmpList.constEnd(), |
| 700 | result: std::back_inserter(x&: newInputModes), |
| 701 | unary_op: [tmpList] (InputMode inputMode) { |
| 702 | return static_cast<int>(inputMode); |
| 703 | }); |
| 704 | } |
| 705 | } |
| 706 | if (d->inputModes != newInputModes) { |
| 707 | d->inputModes = newInputModes; |
| 708 | emit inputModesChanged(); |
| 709 | } |
| 710 | } |
| 711 | |
| 712 | /*! |
| 713 | \internal |
| 714 | */ |
| 715 | void QVirtualKeyboardInputEngine::timerEvent(QTimerEvent *timerEvent) |
| 716 | { |
| 717 | Q_D(QVirtualKeyboardInputEngine); |
| 718 | if (timerEvent->timerId() == d->repeatTimer) { |
| 719 | d->virtualKeyClick(key: d->activeKey, text: d->activeKeyText, modifiers: d->activeKeyModifiers, isAutoRepeat: true); |
| 720 | if (!d->repeatCount) { |
| 721 | killTimer(id: d->repeatTimer); |
| 722 | d->repeatTimer = startTimer(interval: 50); |
| 723 | } |
| 724 | d->repeatCount++; |
| 725 | } |
| 726 | } |
| 727 | |
| 728 | /*! |
| 729 | \qmlproperty int InputEngine::activeKey |
| 730 | |
| 731 | Currently pressed key. |
| 732 | */ |
| 733 | |
| 734 | /*! |
| 735 | \property QVirtualKeyboardInputEngine::activeKey |
| 736 | \brief the active key. |
| 737 | |
| 738 | Currently pressed key. |
| 739 | */ |
| 740 | |
| 741 | /*! |
| 742 | \qmlproperty int InputEngine::previousKey |
| 743 | |
| 744 | Previously pressed key. |
| 745 | */ |
| 746 | /*! |
| 747 | \property QVirtualKeyboardInputEngine::previousKey |
| 748 | \brief the previous active key. |
| 749 | |
| 750 | Previously pressed key. |
| 751 | */ |
| 752 | |
| 753 | /*! |
| 754 | \qmlproperty InputMethod InputEngine::inputMethod |
| 755 | |
| 756 | Use this property to set the active input method, or to monitor when the |
| 757 | active input method changes. |
| 758 | */ |
| 759 | |
| 760 | /*! |
| 761 | \property QVirtualKeyboardInputEngine::inputMethod |
| 762 | \brief the active input method. |
| 763 | |
| 764 | Use this property to set active the input method, or to monitor when the |
| 765 | active input method changes. |
| 766 | */ |
| 767 | |
| 768 | /*! |
| 769 | \qmlproperty list<int> InputEngine::inputModes |
| 770 | |
| 771 | The list of available input modes is dependent on the input method and |
| 772 | locale. This property is updated when either of the dependencies change. |
| 773 | */ |
| 774 | |
| 775 | /*! |
| 776 | \property QVirtualKeyboardInputEngine::inputModes |
| 777 | \brief the available input modes for active input method. |
| 778 | |
| 779 | The list of available input modes is dependent on the input method and |
| 780 | locale. This property is updated when either of the dependencies changes. |
| 781 | */ |
| 782 | |
| 783 | /*! |
| 784 | \qmlproperty int InputEngine::inputMode |
| 785 | |
| 786 | Use this property to get or set the current input mode. The |
| 787 | InputEngine::inputModes property provides the list of valid input modes |
| 788 | for the current input method and locale. |
| 789 | |
| 790 | The predefined input modes are: |
| 791 | |
| 792 | \list |
| 793 | \li \c InputEngine.InputMode.Latin The default input mode for latin text. |
| 794 | \li \c InputEngine.InputMode.Numeric Only numeric input is allowed. |
| 795 | \li \c InputEngine.InputMode.Dialable Only dialable input is allowed. |
| 796 | \li \c InputEngine.InputMode.Pinyin Pinyin input mode for Chinese. |
| 797 | \li \c InputEngine.InputMode.Cangjie Cangjie input mode for Chinese. |
| 798 | \li \c InputEngine.InputMode.Zhuyin Zhuyin input mode for Chinese. |
| 799 | \li \c InputEngine.InputMode.Hangul Hangul input mode for Korean. |
| 800 | \li \c InputEngine.InputMode.Hiragana Hiragana input mode for Japanese. |
| 801 | \li \c InputEngine.InputMode.Katakana Katakana input mode for Japanese. |
| 802 | \li \c InputEngine.InputMode.FullwidthLatin Fullwidth latin input mode for East Asian languages. |
| 803 | \li \c InputEngine.InputMode.Greek Greek input mode. |
| 804 | \li \c InputEngine.InputMode.Cyrillic Cyrillic input mode. |
| 805 | \li \c InputEngine.InputMode.Arabic Arabic input mode. |
| 806 | \li \c InputEngine.InputMode.Hebrew Hebrew input mode. |
| 807 | \li \c InputEngine.InputMode.ChineseHandwriting Chinese handwriting. |
| 808 | \li \c InputEngine.InputMode.JapaneseHandwriting Japanese handwriting. |
| 809 | \li \c InputEngine.InputMode.KoreanHandwriting Korean handwriting. |
| 810 | \li \c InputEngine.InputMode.Thai Thai input mode. |
| 811 | \endlist |
| 812 | */ |
| 813 | |
| 814 | /*! |
| 815 | \property QVirtualKeyboardInputEngine::inputMode |
| 816 | \brief the current input mode. |
| 817 | |
| 818 | Use this property to get or set the current input mode. The |
| 819 | InputEngine::inputModes provides list of valid input modes |
| 820 | for current input method and locale. |
| 821 | */ |
| 822 | |
| 823 | /*! |
| 824 | \qmlproperty SelectionListModel InputEngine::wordCandidateListModel |
| 825 | |
| 826 | Use this property to access the list model for the word candidate |
| 827 | list. |
| 828 | */ |
| 829 | |
| 830 | /*! |
| 831 | \property QVirtualKeyboardInputEngine::wordCandidateListModel |
| 832 | \brief list model for the word candidate list. |
| 833 | |
| 834 | Use this property to access the list model for the word candidate |
| 835 | list. |
| 836 | */ |
| 837 | |
| 838 | /*! |
| 839 | \qmlproperty bool InputEngine::wordCandidateListVisibleHint |
| 840 | |
| 841 | Use this property to check if the word candidate list should be visible |
| 842 | in the UI. |
| 843 | */ |
| 844 | |
| 845 | /*! |
| 846 | \property QVirtualKeyboardInputEngine::wordCandidateListVisibleHint |
| 847 | \brief visible hint for the word candidate list. |
| 848 | |
| 849 | Use this property to check if the word candidate list should be visible |
| 850 | in the UI. |
| 851 | */ |
| 852 | |
| 853 | /*! |
| 854 | \enum QVirtualKeyboardInputEngine::InputMode |
| 855 | |
| 856 | This enum specifies the input mode for the input method. |
| 857 | |
| 858 | \value Latin |
| 859 | The default input mode for latin text. |
| 860 | \value Numeric |
| 861 | Only numeric input is allowed. |
| 862 | \value Dialable |
| 863 | Only dialable input is allowed. |
| 864 | \value Pinyin |
| 865 | Pinyin input mode for Chinese. |
| 866 | \value Cangjie |
| 867 | Cangjie input mode for Chinese. |
| 868 | \value Zhuyin |
| 869 | Zhuyin input mode for Chinese. |
| 870 | \value Hangul |
| 871 | Hangul input mode for Korean. |
| 872 | \value Hiragana |
| 873 | Hiragana input mode for Japanese. |
| 874 | \value Katakana |
| 875 | Katakana input mode for Japanese. |
| 876 | \value FullwidthLatin |
| 877 | Fullwidth latin input mode for East Asian languages. |
| 878 | \value Greek |
| 879 | Greek input mode. |
| 880 | \value Cyrillic |
| 881 | Cyrillic input mode. |
| 882 | \value Arabic |
| 883 | Arabic input mode. |
| 884 | \value Hebrew |
| 885 | Hebrew input mode. |
| 886 | \value ChineseHandwriting |
| 887 | Chinese handwriting input mode. |
| 888 | \value JapaneseHandwriting |
| 889 | Japanese handwriting input mode. |
| 890 | \value KoreanHandwriting |
| 891 | Korean handwriting input mode. |
| 892 | \value Thai |
| 893 | Thai input mode. |
| 894 | */ |
| 895 | |
| 896 | /*! |
| 897 | \enum QVirtualKeyboardInputEngine::TextCase |
| 898 | |
| 899 | This enum specifies the text case for the input method. |
| 900 | |
| 901 | \value Lower |
| 902 | Lower case text. |
| 903 | \value Upper |
| 904 | Upper case text. |
| 905 | */ |
| 906 | |
| 907 | /*! |
| 908 | \enum QVirtualKeyboardInputEngine::PatternRecognitionMode |
| 909 | |
| 910 | This enum specifies the input mode for the input method. |
| 911 | |
| 912 | \value None |
| 913 | Pattern recognition is not available. |
| 914 | \value PatternRecognitionDisabled |
| 915 | \c obsolete Use PatternRecognitionMode::None |
| 916 | \value Handwriting |
| 917 | Pattern recognition mode for handwriting recognition. |
| 918 | \value HandwritingRecoginition |
| 919 | \c obsolete Use PatternRecognitionMode::Handwriting |
| 920 | */ |
| 921 | |
| 922 | /*! |
| 923 | \enum QVirtualKeyboardInputEngine::ReselectFlag |
| 924 | |
| 925 | This enum specifies the rules for word reselection. |
| 926 | |
| 927 | \value WordBeforeCursor |
| 928 | Activate the word before the cursor. When this flag is used exclusively, the word must end exactly at the cursor. |
| 929 | \value WordAfterCursor |
| 930 | Activate the word after the cursor. When this flag is used exclusively, the word must start exactly at the cursor. |
| 931 | \value WordAtCursor |
| 932 | 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. |
| 933 | */ |
| 934 | |
| 935 | /*! |
| 936 | \qmlsignal void InputEngine::virtualKeyClicked(int key, string text, int modifiers) |
| 937 | |
| 938 | Indicates that the virtual \a key was clicked with the given \a text and |
| 939 | \a modifiers. |
| 940 | This signal is emitted after the input method has processed the key event. |
| 941 | */ |
| 942 | |
| 943 | /*! |
| 944 | \fn void QVirtualKeyboardInputEngine::virtualKeyClicked(Qt::Key key, const QString &text, Qt::KeyboardModifiers modifiers, bool isAutoRepeat) |
| 945 | |
| 946 | Indicates that the virtual \a key was clicked with the given \a text and |
| 947 | \a modifiers. The \a isAutoRepeat indicates if the event is automatically |
| 948 | repeated while the key is being pressed. |
| 949 | This signal is emitted after the input method has processed the key event. |
| 950 | */ |
| 951 | |
| 952 | /*! |
| 953 | \qmlproperty list<int> InputEngine::patternRecognitionModes |
| 954 | \since QtQuick.VirtualKeyboard 2.0 |
| 955 | |
| 956 | The list of available pattern recognition modes. |
| 957 | |
| 958 | Possible values: |
| 959 | |
| 960 | \value InputEngine.PatternRecognitionMode.None |
| 961 | Pattern recognition is not available. |
| 962 | \value InputEngine.PatternRecognitionMode.PatternRecognitionDisabled |
| 963 | \c obsolete - Use \c None instead. |
| 964 | \value InputEngine.PatternRecognitionMode.Handwriting |
| 965 | Pattern recognition mode for handwriting recognition. |
| 966 | \value InputEngine.PatternRecognitionMode.HandwritingRecoginition |
| 967 | \c obsolete - Use \c Handwriting instead. |
| 968 | |
| 969 | */ |
| 970 | |
| 971 | /*! |
| 972 | \property QVirtualKeyboardInputEngine::patternRecognitionModes |
| 973 | \since QtQuick.VirtualKeyboard 2.0 |
| 974 | \brief the list of available pattern recognition modes. |
| 975 | |
| 976 | The list of available pattern recognition modes. |
| 977 | */ |
| 978 | |
| 979 | /*! |
| 980 | \qmlsignal void InputEngine::activeKeyChanged(int key) |
| 981 | |
| 982 | Indicates that the active \a key has changed. |
| 983 | */ |
| 984 | |
| 985 | /*! |
| 986 | \fn void QVirtualKeyboardInputEngine::activeKeyChanged(Qt::Key key) |
| 987 | |
| 988 | Indicates that the active \a key has changed. |
| 989 | */ |
| 990 | |
| 991 | /*! |
| 992 | \qmlsignal void InputEngine::previousKeyChanged(int key) |
| 993 | |
| 994 | Indicates that the previous \a key has changed. |
| 995 | */ |
| 996 | |
| 997 | /*! |
| 998 | \fn void QVirtualKeyboardInputEngine::previousKeyChanged(Qt::Key key) |
| 999 | |
| 1000 | Indicates that the previous \a key has changed. |
| 1001 | */ |
| 1002 | |
| 1003 | /*! |
| 1004 | \qmlsignal void InputEngine::inputMethodChanged() |
| 1005 | |
| 1006 | Indicates that the input method has changed. |
| 1007 | */ |
| 1008 | |
| 1009 | /*! |
| 1010 | \fn void QVirtualKeyboardInputEngine::inputMethodChanged() |
| 1011 | |
| 1012 | Indicates that the input method has changed. |
| 1013 | */ |
| 1014 | |
| 1015 | /*! |
| 1016 | \qmlsignal void InputEngine::inputMethodReset() |
| 1017 | |
| 1018 | Emitted when the input method needs to be reset. |
| 1019 | |
| 1020 | \note This signal is automatically connected to QVirtualKeyboardAbstractInputMethod::reset() |
| 1021 | and InputMethod::reset() when the input method is activated. |
| 1022 | */ |
| 1023 | |
| 1024 | /*! |
| 1025 | \fn void QVirtualKeyboardInputEngine::inputMethodReset() |
| 1026 | |
| 1027 | Emitted when the input method needs to be reset. |
| 1028 | |
| 1029 | \note This signal is automatically connected to QVirtualKeyboardAbstractInputMethod::reset() |
| 1030 | and InputMethod::reset() when the input method is activated. |
| 1031 | */ |
| 1032 | |
| 1033 | /*! |
| 1034 | \qmlsignal void InputEngine::inputMethodUpdate() |
| 1035 | |
| 1036 | \note This signal is automatically connected to QVirtualKeyboardAbstractInputMethod::update() |
| 1037 | and InputMethod::update() when the input method is activated. |
| 1038 | */ |
| 1039 | |
| 1040 | /*! |
| 1041 | \fn void QVirtualKeyboardInputEngine::inputMethodUpdate() |
| 1042 | |
| 1043 | \note This signal is automatically connected to QVirtualKeyboardAbstractInputMethod::update() |
| 1044 | and InputMethod::update() when the input method is activated. |
| 1045 | */ |
| 1046 | |
| 1047 | /*! |
| 1048 | \qmlsignal void InputEngine::inputModesChanged() |
| 1049 | |
| 1050 | Indicates that the available input modes have changed. |
| 1051 | */ |
| 1052 | |
| 1053 | /*! |
| 1054 | \fn void QVirtualKeyboardInputEngine::inputModesChanged() |
| 1055 | |
| 1056 | Indicates that the available input modes have changed. |
| 1057 | */ |
| 1058 | |
| 1059 | /*! |
| 1060 | \qmlsignal void InputEngine::inputModeChanged() |
| 1061 | |
| 1062 | Indicates that the input mode has changed. |
| 1063 | */ |
| 1064 | |
| 1065 | /*! |
| 1066 | \fn void QVirtualKeyboardInputEngine::inputModeChanged() |
| 1067 | |
| 1068 | Indicates that the input mode has changed. |
| 1069 | */ |
| 1070 | |
| 1071 | /*! |
| 1072 | \qmlsignal void InputEngine::patternRecognitionModesChanged() |
| 1073 | \since QtQuick.VirtualKeyboard 2.0 |
| 1074 | |
| 1075 | Indicates that the available pattern recognition modes have changed. |
| 1076 | |
| 1077 | The predefined pattern recognition modes are: |
| 1078 | |
| 1079 | \list |
| 1080 | \li \c InputEngine.PatternRecognitionMode.None Pattern recognition is not available. |
| 1081 | \li \c InputEngine.PatternRecognitionMode.PatternRecognitionDisabled \c obsolete Use InputEngine.PatternRecognitionMode.None |
| 1082 | \li \c InputEngine.PatternRecognitionMode.Handwriting Pattern recognition mode for handwriting recognition. |
| 1083 | \li \c InputEngine.PatternRecognitionMode.HandwritingRecoginition \c obsolete Use InputEngine.PatternRecognitionMode.Handwriting |
| 1084 | \endlist |
| 1085 | */ |
| 1086 | |
| 1087 | /*! |
| 1088 | \fn void QVirtualKeyboardInputEngine::patternRecognitionModesChanged() |
| 1089 | \since QtQuick.VirtualKeyboard 2.0 |
| 1090 | |
| 1091 | Indicates that the available pattern recognition modes have changed. |
| 1092 | */ |
| 1093 | |
| 1094 | QT_END_NAMESPACE |
| 1095 | |