diff options
Diffstat (limited to 'src')
4 files changed, 39 insertions, 5 deletions
diff --git a/src/virtualkeyboard/content/InputPanel.qml b/src/virtualkeyboard/content/InputPanel.qml index b10fef21..ea3ab23f 100644 --- a/src/virtualkeyboard/content/InputPanel.qml +++ b/src/virtualkeyboard/content/InputPanel.qml @@ -116,11 +116,14 @@ Item { /*! \internal */ readonly property bool __isRootItem: inputPanel.parent != null && inputPanel.parent.parent == null + /*! \internal */ + property bool __reparented: false + SelectionControl { objectName: "selectionControl" x: -parent.x y: -parent.y - enabled: active && !keyboard.fullScreenMode && !__isRootItem + enabled: active && !keyboard.fullScreenMode && (!__isRootItem || __reparented) } implicitHeight: keyboard.height diff --git a/src/virtualkeyboard/content/components/Keyboard.qml b/src/virtualkeyboard/content/components/Keyboard.qml index 954c6f2f..d6073d4e 100644 --- a/src/virtualkeyboard/content/components/Keyboard.qml +++ b/src/virtualkeyboard/content/components/Keyboard.qml @@ -90,6 +90,8 @@ Item { return plainInputMethod } + Component.onCompleted: InputContext.priv.registerInputPanel(parent) + width: keyboardBackground.width height: keyboardBackground.height + (VirtualKeyboardSettings.wordCandidateList.alwaysVisible ? wordCandidateView.height : 0) onActiveChanged: { diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp index b99b7147..2c945356 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.cpp @@ -36,6 +36,8 @@ #include <QtVirtualKeyboard/qvirtualkeyboardinputengine.h> #include <QGuiApplication> +#include <QtQuick/qquickitem.h> +#include <QtQuick/qquickwindow.h> #include <QtGui/qpa/qplatformintegration.h> #include <QtGui/private/qguiapplication_p.h> @@ -213,6 +215,15 @@ bool QVirtualKeyboardInputContextPrivate::hasEnterKeyAction(QObject *item) const return item != nullptr && qmlAttachedPropertiesObject<EnterKeyAction>(item, false); } +void QVirtualKeyboardInputContextPrivate::registerInputPanel(QObject *inputPanel) +{ + VIRTUALKEYBOARD_DEBUG() << "QVirtualKeyboardInputContextPrivate::registerInputPanel():" << inputPanel; + Q_ASSERT(!this->inputPanel); + this->inputPanel = inputPanel; + if (QQuickItem *item = qobject_cast<QQuickItem *>(inputPanel)) + item->setZ(std::numeric_limits<qreal>::max()); +} + void QVirtualKeyboardInputContextPrivate::hideInputPanel() { platformInputContext->hideInputPanel(); @@ -259,10 +270,26 @@ void QVirtualKeyboardInputContextPrivate::forceCursorPosition(int anchorPosition void QVirtualKeyboardInputContextPrivate::onInputItemChanged() { - if (!inputItem() && !activeKeys.isEmpty()) { - // After losing keyboard focus it is impossible to track pressed keys - activeKeys.clear(); - clearState(State::KeyEvent); + if (QObject *item = inputItem()) { + if (QQuickItem *vkbPanel = qobject_cast<QQuickItem*>(inputPanel)) { + if (QQuickItem *quickItem = qobject_cast<QQuickItem*>(item)) { + const QVariant isRootItem = vkbPanel->property("__isRootItem"); + /* + For integrated keyboards, make sure it's a sibling to the overlay. The + high z-order will make sure it gets events also during a modal session. + */ + if (isRootItem.isValid() && !isRootItem.toBool()) { + vkbPanel->setParentItem(quickItem->window()->contentItem()); + vkbPanel->setProperty("__reparented", true); + } + } + } + } else { + if (!activeKeys.isEmpty()) { + // After losing keyboard focus it is impossible to track pressed keys + activeKeys.clear(); + clearState(State::KeyEvent); + } } clearState(State::InputMethodClick); } diff --git a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h index 4075c95f..54491e76 100644 --- a/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h +++ b/src/virtualkeyboard/qvirtualkeyboardinputcontext_p.h @@ -111,6 +111,7 @@ public: // Helper functions Q_INVOKABLE bool fileExists(const QUrl &fileUrl); Q_INVOKABLE bool hasEnterKeyAction(QObject *item) const; + Q_INVOKABLE void registerInputPanel(QObject *inputPanel); Q_SIGNALS: void focusChanged(); @@ -151,6 +152,7 @@ private: QtVirtualKeyboard::PlatformInputContext *platformInputContext; QVirtualKeyboardInputEngine *inputEngine; QtVirtualKeyboard::ShiftHandler *_shiftHandler; + QPointer<QObject> inputPanel; QRectF keyboardRect; QRectF previewRect; bool _previewVisible; |