diff options
author | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2023-03-23 16:00:33 +0200 |
---|---|---|
committer | Tarja Sundqvist <tarja.sundqvist@qt.io> | 2023-03-23 16:00:33 +0200 |
commit | 4191fd9098ae25ffd5917370427460842e73f0cb (patch) | |
tree | 470095a8090a12d80c8ad38dba5e6d305b1dadba | |
parent | 5f66c9571303170f07954f73b09cad4cee1ce5d0 (diff) | |
parent | 84c0466a5385220af0cf6da0468d8a05f45a6f9a (diff) |
Merge remote-tracking branch 'origin/tqtc/lts-5.15.9' into tqtc/lts-5.15-opensourcev5.15.9-lts-lgpl
Change-Id: I3f20c46733904bc81d361a8165cd381cf3573e03
-rw-r--r-- | .qmake.conf | 2 | ||||
-rw-r--r-- | src/plugin/plugin.cpp | 9 | ||||
-rw-r--r-- | src/plugin/plugin.pro | 1 | ||||
-rw-r--r-- | src/virtualkeyboard/platforminputcontext.cpp | 27 | ||||
-rw-r--r-- | src/virtualkeyboard/platforminputcontext_p.h | 1 | ||||
-rw-r--r-- | src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp | 2 | ||||
-rw-r--r-- | tests/auto/inputpanel/BLACKLIST | 6 | ||||
-rw-r--r-- | tests/auto/inputpanel/data/tst_inputpanel.qml | 6 |
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() |