aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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/data/tst_inputpanel.qml6
4 files changed, 25 insertions, 11 deletions
diff --git a/src/virtualkeyboard/platforminputcontext.cpp b/src/virtualkeyboard/platforminputcontext.cpp
index 4b86629a..5cceefb3 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 dbd32e93..665fcb6b 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 645a6310..b0eb2a3c 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/data/tst_inputpanel.qml b/tests/auto/inputpanel/data/tst_inputpanel.qml
index fee9fb03..701e640d 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()