diff --git a/qml/virtualkeyboard/main.qml b/qml/virtualkeyboard/main.qml
index 5887e876d0..ef1a967f3d 100644
--- a/qml/virtualkeyboard/main.qml
+++ b/qml/virtualkeyboard/main.qml
@@ -18,66 +18,47 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see .
*********************************************************************/
import QtQuick 2.0
-import QtQuick.Window 2.0
import QtQuick.Controls 2.3
import QtQuick.VirtualKeyboard 2.1
import org.kde.kirigami 2.5 as Kirigami
-Window {
+Item {
id: window
property real adjustment: 0
property real adjustmentFactor: 0.0
- visible: false
+ InputPanel {
+ id: inputPanel
+ objectName: "inputPanel"
+ width: parent.width - parent.width * parent.adjustmentFactor
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.bottom: parent.bottom
+ }
+ //NOTE: ToolButton for some reasons breaks the virtual keyboard loading on Plasma Mobile
+ Button {
+ id: resizeButton
+ visible: !Kirigami.Settings.isMobile //don't show on handheld devices
+ flat: true
+ display: AbstractButton.IconOnly
+ icon.name: "transform-scale"
+ icon.color: "white"
+ down: mouseArea.pressed
- Loader {
- anchors.fill: parent
+ anchors {
+ right: inputPanel.right
+ top: inputPanel.top
+ }
- sourceComponent: window.visible ? theKeyboard : null
-
- Component {
- id: theKeyboard
- Item {
- InputPanel {
- id: inputPanel
-
- readonly property real sideMargin: window.width * window.adjustmentFactor/2
- anchors {
- left: parent.left
- right: parent.right
- bottom: parent.bottom
- leftMargin: sideMargin
- rightMargin: sideMargin
- }
- }
- //NOTE: ToolButton for some reasons breaks the virtual keyboard loading on Plasma Mobile
- Button {
- id: resizeButton
- visible: !Kirigami.Settings.isMobile //don't show on handheld devices
- flat: true
- display: AbstractButton.IconOnly
- icon.name: "transform-scale"
- icon.color: "white"
- down: mouseArea.pressed
-
- anchors {
- right: inputPanel.right
- top: inputPanel.top
- }
-
- MouseArea {
- id: mouseArea
- property real startPoint: 0
- anchors.fill: parent
- onPressed: {
- startPoint = mouse.x;
- }
- onPositionChanged: {
- window.adjustment -= (mouse.x - startPoint);
- window.adjustmentFactor = Math.min(Math.max(window.adjustment / window.width, 0.0), 0.66);
- startPoint = mouse.x;
- }
- }
- }
+ MouseArea {
+ id: mouseArea
+ property real startPoint: 0
+ anchors.fill: parent
+ onPressed: {
+ startPoint = mouse.x;
+ }
+ onPositionChanged: {
+ window.adjustment -= (mouse.x - startPoint);
+ window.adjustmentFactor = Math.min(Math.max(window.adjustment / window.width, 0.0), 0.66);
+ startPoint = mouse.x;
}
}
}
diff --git a/virtualkeyboard.cpp b/virtualkeyboard.cpp
index b799c5d948..7ee7e5e2ce 100644
--- a/virtualkeyboard.cpp
+++ b/virtualkeyboard.cpp
@@ -44,8 +44,8 @@ along with this program. If not, see .
#include
#include
#include
+#include
#include
-#include
#include
// xkbcommon
#include
@@ -74,20 +74,17 @@ VirtualKeyboard::~VirtualKeyboard() = default;
void VirtualKeyboard::init()
{
// TODO: need a shared Qml engine
- const QUrl source = QUrl::fromLocalFile(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral(KWIN_NAME "/virtualkeyboard/main.qml")));
- qCDebug(KWIN_VIRTUALKEYBOARD) << "Initializing window" << source;
- QQmlApplicationEngine* engine = new QQmlApplicationEngine(this);
- connect(engine, &QQmlEngine::warnings, this, [] (const QList &warnings) { qCWarning(KWIN_VIRTUALKEYBOARD ) << warnings; });
- engine->load(source);
-
- if (engine->rootObjects().isEmpty()) {
- qCWarning(KWIN_VIRTUALKEYBOARD) << "could not load the virtual keyboard";
+ qCDebug(KWIN_VIRTUALKEYBOARD) << "Initializing window";
+ m_inputWindow.reset(new QQuickView(nullptr));
+ m_inputWindow->setFlags(Qt::FramelessWindowHint);
+ m_inputWindow->setGeometry(screens()->geometry(screens()->current()));
+ m_inputWindow->setResizeMode(QQuickView::SizeRootObjectToView);
+ m_inputWindow->setSource(QUrl::fromLocalFile(QStandardPaths::locate(QStandardPaths::GenericDataLocation, QStringLiteral(KWIN_NAME "/virtualkeyboard/main.qml"))));
+ if (m_inputWindow->status() != QQuickView::Status::Ready) {
+ qCWarning(KWIN_VIRTUALKEYBOARD) << "window not ready yet";
m_inputWindow.reset();
return;
}
-
- m_inputWindow.reset(qobject_cast(engine->rootObjects().constFirst()));
- m_inputWindow->setFlags(Qt::FramelessWindowHint);
m_inputWindow->setProperty("__kwin_input_method", true);
if (waylandServer()) {
@@ -140,27 +137,18 @@ void VirtualKeyboard::init()
m_waylandShowConnection = connect(t, &TextInputInterface::requestShowInputPanel, this, &VirtualKeyboard::show);
m_waylandHideConnection = connect(t, &TextInputInterface::requestHideInputPanel, this, &VirtualKeyboard::hide);
m_waylandSurroundingTextConnection = connect(t, &TextInputInterface::surroundingTextChanged, this,
- [this] {
- if (m_enabled) {
- m_inputWindow->show();
- }
+ [] {
qApp->inputMethod()->update(Qt::ImSurroundingText | Qt::ImCursorPosition | Qt::ImAnchorPosition);
}
);
m_waylandHintsConnection = connect(t, &TextInputInterface::contentTypeChanged, this,
- [this] {
- if (m_enabled) {
- m_inputWindow->show();
- }
+ [] {
qApp->inputMethod()->update(Qt::ImHints);
}
);
m_waylandResetConnection = connect(t, &TextInputInterface::requestReset, qApp->inputMethod(), &QInputMethod::reset);
m_waylandEnabledConnection = connect(t, &TextInputInterface::enabledChanged, this,
- [this] {
- if (m_enabled) {
- m_inputWindow->show();
- }
+ [] {
qApp->inputMethod()->update(Qt::ImQueryAll);
}
);
@@ -197,19 +185,19 @@ void VirtualKeyboard::init()
}
);
m_inputWindow->setColor(Qt::transparent);
- m_inputWindow->setMask(m_inputWindow->contentItem()->childrenRect().toRect());
- connect(m_inputWindow->contentItem(), &QQuickItem::childrenRectChanged, m_inputWindow.data(),
+ m_inputWindow->setMask(m_inputWindow->rootObject()->childrenRect().toRect());
+ connect(m_inputWindow->rootObject(), &QQuickItem::childrenRectChanged, m_inputWindow.data(),
[this] {
if (!m_inputWindow) {
return;
}
- m_inputWindow->setMask(m_inputWindow->contentItem()->childrenRect().toRect());
+ m_inputWindow->setMask(m_inputWindow->rootObject()->childrenRect().toRect());
}
);
connect(qApp->inputMethod(), &QInputMethod::visibleChanged, this, &VirtualKeyboard::updateInputPanelState);
- connect(m_inputWindow->contentItem(), &QQuickItem::childrenRectChanged, this, &VirtualKeyboard::updateInputPanelState);
+ connect(m_inputWindow->rootObject(), &QQuickItem::childrenRectChanged, this, &VirtualKeyboard::updateInputPanelState);
}
void VirtualKeyboard::setEnabled(bool enabled)
@@ -268,11 +256,11 @@ void VirtualKeyboard::updateInputPanelState()
m_inputWindow->setVisible(qApp->inputMethod()->isVisible());
if (qApp->inputMethod()->isVisible()) {
- m_inputWindow->setMask(m_inputWindow->contentItem()->childrenRect().toRect());
+ m_inputWindow->setMask(m_inputWindow->rootObject()->childrenRect().toRect());
}
- if (m_inputWindow->isVisible() && m_trackedClient && m_inputWindow) {
- const QRect inputPanelGeom = m_inputWindow->contentItem()->childrenRect().toRect().translated(m_inputWindow->geometry().topLeft());
+ if (m_inputWindow->isVisible() && m_trackedClient && m_inputWindow->rootObject()) {
+ const QRect inputPanelGeom = m_inputWindow->rootObject()->childrenRect().toRect().translated(m_inputWindow->geometry().topLeft());
m_trackedClient->setVirtualKeyboardGeometry(inputPanelGeom);
@@ -298,7 +286,7 @@ void VirtualKeyboard::show()
void VirtualKeyboard::hide()
{
- if (!m_inputWindow) {
+ if (m_inputWindow.isNull()) {
return;
}
qApp->inputMethod()->hide();
diff --git a/virtualkeyboard.h b/virtualkeyboard.h
index 641bdfd1c4..21d2bad33b 100644
--- a/virtualkeyboard.h
+++ b/virtualkeyboard.h
@@ -27,7 +27,7 @@ along with this program. If not, see .
#include
-class QQuickWindow;
+class QQuickView;
class QTimer;
class QWindow;
class KStatusNotifierItem;
@@ -60,7 +60,7 @@ private:
bool m_enabled = false;
KStatusNotifierItem *m_sni = nullptr;
- QScopedPointer m_inputWindow;
+ QScopedPointer m_inputWindow;
QPointer m_trackedClient;
// If a surface loses focus immediately after being resized by the keyboard, don't react to it to avoid resize loops
QTimer *m_floodTimer;