summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2018-01-19 16:54:34 +0100
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2018-09-29 19:45:35 +0000
commit97f4366202d170f8c64df2a9f92d457c69b565cc (patch)
treeb47cdb03972f84d400d282a6df6f306c78de6c63
parenta34054c75e18326d10328baa9e39fc9eab0cbfc9 (diff)
QLineEdit: Disable input methods for password unless IME supports hidden text
Move the checking logic from QGuiApplicationPrivate::_q_updateFocusObject() to QInputMethodPrivate::objectAcceptsInputMethod(), which is also called from QWidget::updateMicroFocus() via QInputMethod::update(). Fixes: QTBUG-56767 Change-Id: Ia4cce5e7e766008df891537048d5daf739c010ff Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
-rw-r--r--src/gui/kernel/qguiapplication.cpp14
-rw-r--r--src/gui/kernel/qinputmethod.cpp18
-rw-r--r--src/gui/kernel/qinputmethod_p.h2
3 files changed, 19 insertions, 15 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index 9bf2a33e2a..34f453341f 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -84,6 +84,7 @@
#include "private/qcursor_p.h"
#include "private/qopenglcontext_p.h"
#include "private/qinputdevicemanager_p.h"
+#include "private/qinputmethod_p.h"
#include "private/qtouchdevice_p.h"
#include <qpa/qplatformthemefactory_p.h>
@@ -4030,18 +4031,7 @@ void QGuiApplicationPrivate::_q_updateFocusObject(QObject *object)
Q_Q(QGuiApplication);
QPlatformInputContext *inputContext = platformIntegration()->inputContext();
- bool enabled = false;
- if (object && inputContext) {
- QInputMethodQueryEvent query(Qt::ImEnabled | Qt::ImHints);
- QGuiApplication::sendEvent(object, &query);
- enabled = query.value(Qt::ImEnabled).toBool();
- if (enabled) {
- static const bool supportsHiddenText = inputContext->hasCapability(QPlatformInputContext::HiddenTextCapability);
- const Qt::InputMethodHints hints = static_cast<Qt::InputMethodHints>(query.value(Qt::ImHints).toInt());
- if ((hints & Qt::ImhHiddenText) && !supportsHiddenText)
- enabled = false;
- }
- }
+ const bool enabled = inputContext && QInputMethodPrivate::objectAcceptsInputMethod(object);
QPlatformInputContextPrivate::setInputMethodAccepted(enabled);
if (inputContext)
diff --git a/src/gui/kernel/qinputmethod.cpp b/src/gui/kernel/qinputmethod.cpp
index 365b088840..a319529442 100644
--- a/src/gui/kernel/qinputmethod.cpp
+++ b/src/gui/kernel/qinputmethod.cpp
@@ -390,15 +390,29 @@ void QInputMethod::invokeAction(Action a, int cursorPosition)
ic->invokeAction(a, cursorPosition);
}
+static inline bool platformSupportsHiddenText()
+{
+ const QPlatformInputContext *inputContext = QGuiApplicationPrivate::platformIntegration()->inputContext();
+ return inputContext && inputContext->hasCapability(QPlatformInputContext::HiddenTextCapability);
+}
+
bool QInputMethodPrivate::objectAcceptsInputMethod(QObject *object)
{
bool enabled = false;
if (object) {
- QInputMethodQueryEvent query(Qt::ImEnabled);
+ // If the platform does not support hidden text, query the hints
+ // in addition and disable in case of ImhHiddenText.
+ static const bool supportsHiddenText = platformSupportsHiddenText();
+ QInputMethodQueryEvent query(supportsHiddenText
+ ? Qt::InputMethodQueries(Qt::ImEnabled)
+ : Qt::InputMethodQueries(Qt::ImEnabled | Qt::ImHints));
QGuiApplication::sendEvent(object, &query);
enabled = query.value(Qt::ImEnabled).toBool();
+ if (enabled && !supportsHiddenText
+ && Qt::InputMethodHints(query.value(Qt::ImHints).toInt()).testFlag(Qt::ImhHiddenText)) {
+ enabled = false;
+ }
}
-
return enabled;
}
diff --git a/src/gui/kernel/qinputmethod_p.h b/src/gui/kernel/qinputmethod_p.h
index 81723bbe30..0c2b739d92 100644
--- a/src/gui/kernel/qinputmethod_p.h
+++ b/src/gui/kernel/qinputmethod_p.h
@@ -80,7 +80,7 @@ public:
void _q_connectFocusObject();
void _q_checkFocusObject(QObject *object);
- bool objectAcceptsInputMethod(QObject *object);
+ static bool objectAcceptsInputMethod(QObject *object);
QTransform inputItemTransform;
QRectF inputRectangle;