aboutsummaryrefslogtreecommitdiffstats
path: root/src/virtualkeyboard
diff options
context:
space:
mode:
authorSanthosh Kumar <santhosh.kumar.selvaraj@qt.io>2024-01-24 10:26:54 +0100
committerJarkko Koivikko <jarkko.koivikko@code-q.fi>2024-03-12 16:42:10 +0200
commita3080e86bfd5d784ab8ba5552793bc11938a7877 (patch)
treee49cff96d8e12a802a9e8e0b57a919ecedf4616e /src/virtualkeyboard
parent90c9e25827de29dd0ace6d4d2dab0f2af5c86bbb (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.cpp4
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp45
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h1
-rw-r--r--src/virtualkeyboard/settings.cpp22
-rw-r--r--src/virtualkeyboard/settings_p.h4
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