aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTarja Sundqvist <tarja.sundqvist@qt.io>2023-03-23 16:00:33 +0200
committerTarja Sundqvist <tarja.sundqvist@qt.io>2023-03-23 16:00:33 +0200
commit4191fd9098ae25ffd5917370427460842e73f0cb (patch)
tree470095a8090a12d80c8ad38dba5e6d305b1dadba
parent5f66c9571303170f07954f73b09cad4cee1ce5d0 (diff)
parent84c0466a5385220af0cf6da0468d8a05f45a6f9a (diff)
Merge remote-tracking branch 'origin/tqtc/lts-5.15.9' into tqtc/lts-5.15-opensourcev5.15.9-lts-lgpl
-rw-r--r--.qmake.conf2
-rw-r--r--src/plugin/plugin.cpp9
-rw-r--r--src/plugin/plugin.pro1
-rw-r--r--src/virtualkeyboard/platforminputcontext.cpp27
-rw-r--r--src/virtualkeyboard/platforminputcontext_p.h1
-rw-r--r--src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp2
-rw-r--r--tests/auto/inputpanel/BLACKLIST6
-rw-r--r--tests/auto/inputpanel/data/tst_inputpanel.qml6
8 files changed, 42 insertions, 12 deletions
diff --git a/.qmake.conf b/.qmake.conf
index 48f4c9ef..213056f5 100644
--- a/.qmake.conf
+++ b/.qmake.conf
@@ -2,4 +2,4 @@ load(qt_build_config)
DEFINES += QT_NO_FOREACH QT_NO_JAVA_STYLE_ITERATORS QT_NO_LINKED_LIST
-MODULE_VERSION = 5.15.8
+MODULE_VERSION = 5.15.9
diff --git a/src/plugin/plugin.cpp b/src/plugin/plugin.cpp
index 122a671d..d5762fe0 100644
--- a/src/plugin/plugin.cpp
+++ b/src/plugin/plugin.cpp
@@ -34,6 +34,9 @@
#include <QtVirtualKeyboard/private/qvirtualkeyboard_staticplugin_p.h>
#include <QLoggingCategory>
#include <QtQml>
+#if defined(Q_OS_WIN)
+#include <qt_windows.h>
+#endif
QT_BEGIN_NAMESPACE
@@ -73,6 +76,12 @@ QPlatformInputContext *QVirtualKeyboardPlugin::create(const QString &system, con
if (system.compare(system, QLatin1String(pluginName), Qt::CaseInsensitive) != 0)
return Q_NULLPTR;
+
+#if defined(Q_OS_WIN)
+ // QTBUG-93042
+ ImmDisableIME(0);
+#endif
+
PlatformInputContext *platformInputContext = new PlatformInputContext();
QStringList inputMethodList;
diff --git a/src/plugin/plugin.pro b/src/plugin/plugin.pro
index defb3747..f974fe45 100644
--- a/src/plugin/plugin.pro
+++ b/src/plugin/plugin.pro
@@ -28,6 +28,7 @@ disable-layouts {
win32 {
QMAKE_TARGET_PRODUCT = "Qt Virtual Keyboard (Qt $$QT_VERSION)"
QMAKE_TARGET_DESCRIPTION = "Virtual Keyboard for Qt."
+ LIBS += -limm32
}
PLUGIN_TYPE = platforminputcontexts
diff --git a/src/virtualkeyboard/platforminputcontext.cpp b/src/virtualkeyboard/platforminputcontext.cpp
index eef26574..c56e21ff 100644
--- a/src/virtualkeyboard/platforminputcontext.cpp
+++ b/src/virtualkeyboard/platforminputcontext.cpp
@@ -96,7 +96,7 @@ void PlatformInputContext::commit()
void PlatformInputContext::update(Qt::InputMethodQueries queries)
{
VIRTUALKEYBOARD_DEBUG() << "PlatformInputContext::update():" << queries;
- bool enabled = inputMethodQuery(Qt::ImEnabled).toBool();
+ const bool enabled = inputMethodAccepted();
#ifdef QT_VIRTUALKEYBOARD_DESKTOP
if (enabled && !m_inputPanel && !m_desktopModeDisabled) {
m_inputPanel = new DesktopInputPanel(this);
@@ -110,14 +110,10 @@ void PlatformInputContext::update(Qt::InputMethodQueries queries)
}
#endif
if (m_inputContext) {
- if (enabled) {
+ if (enabled)
m_inputContext->priv()->update(queries);
- if (m_visible)
- updateInputPanelVisible();
- } else {
- hideInputPanel();
- }
m_inputContext->priv()->setFocus(enabled);
+ updateInputPanelVisible();
}
}
@@ -285,6 +281,16 @@ void PlatformInputContext::setInputContext(QVirtualKeyboardInputContext *context
}
}
+bool PlatformInputContext::evaluateInputPanelVisible() const
+{
+ // Show input panel when input panel is requested by showInputPanel()
+ // and focus object is set to an input control with input method accepted (Qt::ImEnabled)
+ // or input events without focus are enabled.
+ return m_visible &&
+ ((m_focusObject && inputMethodAccepted()) ||
+ QT_VIRTUALKEYBOARD_FORCE_EVENTS_WITHOUT_FOCUS);
+}
+
void PlatformInputContext::keyboardRectangleChanged()
{
m_inputPanel->setInputRect(m_inputContext->priv()->keyboardRectangle().toRect());
@@ -295,13 +301,14 @@ void PlatformInputContext::updateInputPanelVisible()
if (!m_inputPanel)
return;
- if (m_visible != m_inputPanel->isVisible()) {
- if (m_visible)
+ const bool visible = evaluateInputPanelVisible();
+ if (visible != m_inputPanel->isVisible()) {
+ if (visible)
m_inputPanel->show();
else
m_inputPanel->hide();
if (m_selectionControl)
- m_selectionControl->setEnabled(m_visible);
+ m_selectionControl->setEnabled(visible);
emitInputPanelVisibleChanged();
}
}
diff --git a/src/virtualkeyboard/platforminputcontext_p.h b/src/virtualkeyboard/platforminputcontext_p.h
index e7d29405..efc3f08a 100644
--- a/src/virtualkeyboard/platforminputcontext_p.h
+++ b/src/virtualkeyboard/platforminputcontext_p.h
@@ -101,6 +101,7 @@ protected:
void sendKeyEvent(QKeyEvent *event);
QVariant inputMethodQuery(Qt::InputMethodQuery query);
void setInputContext(QVirtualKeyboardInputContext *context);
+ bool evaluateInputPanelVisible() const;
private slots:
void keyboardRectangleChanged();
diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp
index 57e0d0c2..2069f64e 100644
--- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp
+++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp
@@ -406,7 +406,7 @@ void QVirtualKeyboardInputContextPrivate::update(Qt::InputMethodQueries queries)
bool newCursorPosition = cursorPosition != this->cursorPosition;
bool newAnchorRectangle = anchorRectangle != this->anchorRectangle;
bool newCursorRectangle = cursorRectangle != this->cursorRectangle;
- bool selectionControlVisible = platformInputContext->isInputPanelVisible() && (cursorPosition != anchorPosition) && !inputMethodHints.testFlag(Qt::ImhNoTextHandles);
+ bool selectionControlVisible = platformInputContext->evaluateInputPanelVisible() && (cursorPosition != anchorPosition) && !inputMethodHints.testFlag(Qt::ImhNoTextHandles);
bool newSelectionControlVisible = selectionControlVisible != this->selectionControlVisible;
QRectF inputItemClipRect = imQueryEvent.value(Qt::ImInputItemClipRectangle).toRectF();
diff --git a/tests/auto/inputpanel/BLACKLIST b/tests/auto/inputpanel/BLACKLIST
index c55a7fc6..a7c14041 100644
--- a/tests/auto/inputpanel/BLACKLIST
+++ b/tests/auto/inputpanel/BLACKLIST
@@ -3,6 +3,10 @@
# QTBUG-97830
[tst_plugin::test_fullScreenModeSelectionHandles:row 0]
*
+[tst_plugin::test_fullScreenModeSelectionHandles:row 2]
+*
+[tst_plugin::test_fullScreenModeSelectionHandles:row 3]
+*
# QTBUG-97830
[tst_plugin::test_selection:row 0]
@@ -13,6 +17,8 @@
b2qt
[tst_plugin::test_hangulInputMethod:row 25]
+# QTBUG-101622
+ubuntu-20
b2qt
[tst_plugin::test_hardKeyBackspaceClearsInput]
diff --git a/tests/auto/inputpanel/data/tst_inputpanel.qml b/tests/auto/inputpanel/data/tst_inputpanel.qml
index e4a00e3d..2758c0a1 100644
--- a/tests/auto/inputpanel/data/tst_inputpanel.qml
+++ b/tests/auto/inputpanel/data/tst_inputpanel.qml
@@ -251,8 +251,14 @@ Rectangle {
Qt.inputMethod.hide()
verify(inputPanel.visible === false)
+ // Should not become visible because the active focus is set to container
Qt.inputMethod.show()
waitForRendering(inputPanel)
+ verify(inputPanel.visible === false)
+
+ // Should become visible because of previously called show() and focus set to input control
+ textInput.forceActiveFocus()
+ waitForRendering(inputPanel)
verify(inputPanel.visible === true)
Qt.inputMethod.hide()