diff options
author | Santhosh Kumar <santhosh.kumar.selvaraj@qt.io> | 2024-01-24 10:26:54 +0100 |
---|---|---|
committer | Jarkko Koivikko <jarkko.koivikko@code-q.fi> | 2024-03-12 16:42:10 +0200 |
commit | a3080e86bfd5d784ab8ba5552793bc11938a7877 (patch) | |
tree | e49cff96d8e12a802a9e8e0b57a919ecedf4616e /src/virtualkeyboard | |
parent | 90c9e25827de29dd0ace6d4d2dab0f2af5c86bbb (diff) |
Make hide behavior of qt vkb configurable through its settings
The patch 6da66ff611902d8c4d485568d746f49c69f1330f (introdued in Qt6)
changed the behavior to handle the hide through platform plugins. But
this cause issue for some users, with the concern that the qt virtual
keyboard hides after input accepted in Qt5 and not in Qt6.
This patch introduced new virtual keyboard settings property
closeOnReturn to control the hiding behavior of virtual keyboard.
Task-number: QTBUG-112963
Change-Id: Ia9433a7fe14eb896758e05f0943ad461f2790a98
Reviewed-by: Jarkko Koivikko <jarkko.koivikko@code-q.fi>
Reviewed-by: Santhosh Kumar <santhosh.kumar.selvaraj@qt.io>
Diffstat (limited to 'src/virtualkeyboard')
-rw-r--r-- | src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp | 4 | ||||
-rw-r--r-- | src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp | 45 | ||||
-rw-r--r-- | src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h | 1 | ||||
-rw-r--r-- | src/virtualkeyboard/settings.cpp | 22 | ||||
-rw-r--r-- | src/virtualkeyboard/settings_p.h | 4 |
5 files changed, 74 insertions, 2 deletions
diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp b/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp index f8f07cca..1da578d3 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext.cpp @@ -208,6 +208,10 @@ void QVirtualKeyboardInputContext::sendKeyClick(int key, const QString &text, in d->setState(QVirtualKeyboardInputContextPrivate::State::KeyEvent); d->platformInputContext->sendKeyEvent(&pressEvent); d->platformInputContext->sendKeyEvent(&releaseEvent); + + if (key == Qt::Key_Return || key == Qt::Key_Enter) + d->maybeCloseOnReturn(); + if (d->activeKeys.isEmpty()) d->clearState(QVirtualKeyboardInputContextPrivate::State::KeyEvent); } else { diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp index 5d2db42b..3483a6cc 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp @@ -9,6 +9,7 @@ #include <QtVirtualKeyboard/private/enterkeyaction_p.h> #include <QtVirtualKeyboard/qvirtualkeyboardinputengine.h> #include <QtVirtualKeyboard/qvirtualkeyboardobserver.h> +#include <QtVirtualKeyboard/private/enterkeyactionattachedtype_p.h> #include <QtVirtualKeyboard/private/virtualkeyboardattachedtype_p.h> #include <QtVirtualKeyboard/qvirtualkeyboarddictionarymanager.h> @@ -534,6 +535,46 @@ void QVirtualKeyboardInputContextPrivate::invokeAction(QInputMethod::Action acti } } +void QVirtualKeyboardInputContextPrivate::maybeCloseOnReturn() +{ + if (!Settings::instance()->closeOnReturn()) + return; + + const int imHints = QInputMethod::queryFocusObject(Qt::ImHints, QVariant()).toInt(); + if (imHints & Qt::ImhMultiLine) + return; + + const Qt::EnterKeyType keyType = static_cast<Qt::EnterKeyType>(QInputMethod::queryFocusObject(Qt::ImEnterKeyType, QVariant()).toInt()); + switch (keyType) { + case Qt::EnterKeyDefault: + case Qt::EnterKeyDone: + case Qt::EnterKeyGo: + case Qt::EnterKeySend: + case Qt::EnterKeySearch: + break; + case Qt::EnterKeyReturn: + case Qt::EnterKeyNext: + case Qt::EnterKeyPrevious: + return; + } + + if (EnterKeyActionAttachedType *enterKeyActionAttachedType = static_cast<EnterKeyActionAttachedType *>(qmlAttachedPropertiesObject<EnterKeyAction>(inputItem(), false))) { + const EnterKeyAction::Id enterKeyActionId = static_cast<EnterKeyAction::Id>(enterKeyActionAttachedType->actionId()); + switch (enterKeyActionId) { + case EnterKeyAction::None: + case EnterKeyAction::Done: + case EnterKeyAction::Go: + case EnterKeyAction::Search: + case EnterKeyAction::Send: + break; + case EnterKeyAction::Next: + return; + } + } + + hideInputPanel(); +} + bool QVirtualKeyboardInputContextPrivate::filterEvent(const QEvent *event) { QEvent::Type type = event->type(); @@ -566,6 +607,10 @@ bool QVirtualKeyboardInputContextPrivate::filterEvent(const QEvent *event) } #endif + if (type == QEvent::KeyRelease && (key == Qt::Key_Return || key == Qt::Key_Enter)) { + maybeCloseOnReturn(); + } + // Break composing text since the virtual keyboard does not support hard keyboard events if (!preeditText.isEmpty()) { if (type == QEvent::KeyPress && (key == Qt::Key_Delete || key == Qt::Key_Backspace)) { diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h index e1dec10b..f81c57b1 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h @@ -124,6 +124,7 @@ private: void commit(); void update(Qt::InputMethodQueries queries); void invokeAction(QInputMethod::Action action, int cursorPosition); + void maybeCloseOnReturn(); bool filterEvent(const QEvent *event); void addSelectionAttribute(QList<QInputMethodEvent::Attribute> &attributes); bool testAttribute(const QList<QInputMethodEvent::Attribute> &attributes, QInputMethodEvent::AttributeType attributeType) const; diff --git a/src/virtualkeyboard/settings.cpp b/src/virtualkeyboard/settings.cpp index a3d4eceb..15d66bbc 100644 --- a/src/virtualkeyboard/settings.cpp +++ b/src/virtualkeyboard/settings.cpp @@ -33,7 +33,9 @@ public: hwrTimeoutForCjk(500), handwritingModeDisabled(false), defaultInputMethodDisabled(false), - defaultDictionaryDisabled(false) + defaultDictionaryDisabled(false), + visibleFunctionKeys(QtVirtualKeyboard::KeyboardFunctionKey::All), + closeOnReturn(false) { ensureUserDataPathExists(); } @@ -64,7 +66,8 @@ public: bool handwritingModeDisabled; bool defaultInputMethodDisabled; bool defaultDictionaryDisabled; - QtVirtualKeyboard::KeyboardFunctionKeys visibleFunctionKeys = QtVirtualKeyboard::KeyboardFunctionKey::All; + QtVirtualKeyboard::KeyboardFunctionKeys visibleFunctionKeys; + bool closeOnReturn; }; static QScopedPointer<Settings> s_settingsInstance; @@ -357,5 +360,20 @@ void Settings::setVisibleFunctionKeys(QtVirtualKeyboard::KeyboardFunctionKeys ne } } +bool Settings::closeOnReturn() const +{ + Q_D(const Settings); + return d->closeOnReturn; +} + +void Settings::setCloseOnReturn(bool enabled) +{ + Q_D(Settings); + if (d->closeOnReturn != enabled) { + d->closeOnReturn = enabled; + emit closeOnReturnChanged(); + } +} + } // namespace QtVirtualKeyboard QT_END_NAMESPACE diff --git a/src/virtualkeyboard/settings_p.h b/src/virtualkeyboard/settings_p.h index 7aafe750..4efd757f 100644 --- a/src/virtualkeyboard/settings_p.h +++ b/src/virtualkeyboard/settings_p.h @@ -91,6 +91,9 @@ public: QtVirtualKeyboard::KeyboardFunctionKeys visibleFunctionKeys() const; void setVisibleFunctionKeys(QtVirtualKeyboard::KeyboardFunctionKeys newVisibleFunctionKeys); + bool closeOnReturn() const; + void setCloseOnReturn(bool enable); + signals: void styleChanged(); void styleNameChanged(); @@ -111,6 +114,7 @@ signals: void defaultInputMethodDisabledChanged(); void defaultDictionaryDisabledChanged(); void visibleFunctionKeysChanged(); + void closeOnReturnChanged(); }; } // namespace QtVirtualKeyboard |