summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/qguiapplication.cpp12
-rw-r--r--src/gui/kernel/qplatforminputcontext.cpp11
-rw-r--r--src/gui/kernel/qplatforminputcontext.h5
-rw-r--r--src/plugins/platforms/windows/qwindowsinputcontext.cpp15
-rw-r--r--src/plugins/platforms/windows/qwindowsinputcontext.h1
5 files changed, 41 insertions, 3 deletions
diff --git a/src/gui/kernel/qguiapplication.cpp b/src/gui/kernel/qguiapplication.cpp
index fe92ead846..8983a6fbb2 100644
--- a/src/gui/kernel/qguiapplication.cpp
+++ b/src/gui/kernel/qguiapplication.cpp
@@ -3400,15 +3400,21 @@ void QGuiApplicationPrivate::_q_updateFocusObject(QObject *object)
{
Q_Q(QGuiApplication);
+ QPlatformInputContext *inputContext = platformIntegration()->inputContext();
bool enabled = false;
- if (object) {
- QInputMethodQueryEvent query(Qt::ImEnabled);
+ 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;
+ }
}
QPlatformInputContextPrivate::setInputMethodAccepted(enabled);
- QPlatformInputContext *inputContext = platformIntegration()->inputContext();
if (inputContext)
inputContext->setFocusObject(object);
emit q->focusObjectChanged(object);
diff --git a/src/gui/kernel/qplatforminputcontext.cpp b/src/gui/kernel/qplatforminputcontext.cpp
index 71dd609868..5937c65cc7 100644
--- a/src/gui/kernel/qplatforminputcontext.cpp
+++ b/src/gui/kernel/qplatforminputcontext.cpp
@@ -92,6 +92,17 @@ bool QPlatformInputContext::isValid() const
}
/*!
+ Returns whether the implementation supports \a capability.
+ \internal
+ \since 5.4
+ */
+bool QPlatformInputContext::hasCapability(Capability capability) const
+{
+ Q_UNUSED(capability)
+ return true;
+}
+
+/*!
Method to be called when input method needs to be reset. Called by QInputMethod::reset().
No further QInputMethodEvents should be sent as response.
*/
diff --git a/src/gui/kernel/qplatforminputcontext.h b/src/gui/kernel/qplatforminputcontext.h
index 7dd89ecd00..0c8953f89c 100644
--- a/src/gui/kernel/qplatforminputcontext.h
+++ b/src/gui/kernel/qplatforminputcontext.h
@@ -55,10 +55,15 @@ class Q_GUI_EXPORT QPlatformInputContext : public QObject
Q_DECLARE_PRIVATE(QPlatformInputContext)
public:
+ enum Capability {
+ HiddenTextCapability = 0x1
+ };
+
QPlatformInputContext();
virtual ~QPlatformInputContext();
virtual bool isValid() const;
+ virtual bool hasCapability(Capability capability) const;
virtual void reset();
virtual void commit();
diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.cpp b/src/plugins/platforms/windows/qwindowsinputcontext.cpp
index 929c6165d2..b1259d757e 100644
--- a/src/plugins/platforms/windows/qwindowsinputcontext.cpp
+++ b/src/plugins/platforms/windows/qwindowsinputcontext.cpp
@@ -163,6 +163,21 @@ QWindowsInputContext::~QWindowsInputContext()
{
}
+bool QWindowsInputContext::hasCapability(Capability capability) const
+{
+ switch (capability) {
+ case QPlatformInputContext::HiddenTextCapability:
+#ifndef Q_OS_WINCE
+ return false; // QTBUG-40691, do not show IME on desktop for password entry fields.
+#else
+ break; // Windows CE: Show software keyboard.
+#endif
+ default:
+ break;
+ }
+ return true;
+}
+
/*!
\brief Cancels a composition.
*/
diff --git a/src/plugins/platforms/windows/qwindowsinputcontext.h b/src/plugins/platforms/windows/qwindowsinputcontext.h
index db1c005207..39880a2e86 100644
--- a/src/plugins/platforms/windows/qwindowsinputcontext.h
+++ b/src/plugins/platforms/windows/qwindowsinputcontext.h
@@ -62,6 +62,7 @@ public:
explicit QWindowsInputContext();
~QWindowsInputContext();
+ bool hasCapability(Capability capability) const Q_DECL_OVERRIDE;
void reset() Q_DECL_OVERRIDE;
void update(Qt::InputMethodQueries) Q_DECL_OVERRIDE;
void invokeAction(QInputMethod::Action, int cursorPosition) Q_DECL_OVERRIDE;