summaryrefslogtreecommitdiffstats
path: root/src/compositor/compositor_api/qwaylandquickitem.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/compositor/compositor_api/qwaylandquickitem.cpp')
-rw-r--r--src/compositor/compositor_api/qwaylandquickitem.cpp60
1 files changed, 59 insertions, 1 deletions
diff --git a/src/compositor/compositor_api/qwaylandquickitem.cpp b/src/compositor/compositor_api/qwaylandquickitem.cpp
index 8fd759bda..bee12b4a5 100644
--- a/src/compositor/compositor_api/qwaylandquickitem.cpp
+++ b/src/compositor/compositor_api/qwaylandquickitem.cpp
@@ -37,6 +37,8 @@
#include "qwaylandquickitem.h"
#include "qwaylandquickitem_p.h"
#include "qwaylandquicksurface.h"
+#include "qwaylandinputmethodcontrol.h"
+#include "qwaylandtextinput.h"
#include <QtWaylandCompositor/qwaylandcompositor.h>
#include <QtWaylandCompositor/qwaylandinput.h>
#include <QtWaylandCompositor/qwaylandbufferref.h>
@@ -54,6 +56,7 @@
#include <wayland-server.h>
#include <QThread>
+
QT_BEGIN_NAMESPACE
QMutex *QWaylandQuickItemPrivate::mutex = 0;
@@ -459,6 +462,21 @@ void QWaylandQuickItem::mouseUngrabEvent()
}
}
+#ifndef QT_NO_IM
+/*!
+ * \internal
+ */
+void QWaylandQuickItem::inputMethodEvent(QInputMethodEvent *event)
+{
+ Q_D(QWaylandQuickItem);
+ if (d->shouldSendInputEvents()) {
+ d->oldSurface->inputMethodControl()->inputMethodEvent(event);
+ } else {
+ event->ignore();
+ }
+}
+#endif
+
/*!
* \internal
*/
@@ -480,6 +498,9 @@ void QWaylandQuickItem::handleSurfaceChanged()
disconnect(d->oldSurface, &QWaylandSurface::sizeChanged, this, &QWaylandQuickItem::updateSize);
disconnect(d->oldSurface, &QWaylandSurface::configure, this, &QWaylandQuickItem::updateBuffer);
disconnect(d->oldSurface, &QWaylandSurface::redraw, this, &QQuickItem::update);
+#ifndef QT_NO_IM
+ disconnect(d->oldSurface->inputMethodControl(), &QWaylandInputMethodControl::updateInputMethod, this, &QWaylandQuickItem::updateInputMethod);
+#endif
}
if (QWaylandSurface *newSurface = d->view->surface()) {
connect(newSurface, &QWaylandSurface::mappedChanged, this, &QWaylandQuickItem::surfaceMappedChanged);
@@ -487,6 +508,9 @@ void QWaylandQuickItem::handleSurfaceChanged()
connect(newSurface, &QWaylandSurface::sizeChanged, this, &QWaylandQuickItem::updateSize);
connect(newSurface, &QWaylandSurface::configure, this, &QWaylandQuickItem::updateBuffer);
connect(newSurface, &QWaylandSurface::redraw, this, &QQuickItem::update);
+#ifndef QT_NO_IM
+ connect(newSurface->inputMethodControl(), &QWaylandInputMethodControl::updateInputMethod, this, &QWaylandQuickItem::updateInputMethod);
+#endif
if (d->sizeFollowsSurface) {
setWidth(newSurface->size().width());
setHeight(newSurface->size().height());
@@ -502,6 +526,9 @@ void QWaylandQuickItem::handleSurfaceChanged()
}
surfaceChangedEvent(d->view->surface(), d->oldSurface);
d->oldSurface = d->view->surface();
+#ifndef QT_NO_IM
+ updateInputMethod(Qt::ImQueryInput);
+#endif
}
/*!
@@ -510,7 +537,7 @@ void QWaylandQuickItem::handleSurfaceChanged()
*/
void QWaylandQuickItem::takeFocus(QWaylandInputDevice *device)
{
- setFocus(true);
+ forceActiveFocus();
if (!surface())
return;
@@ -520,6 +547,9 @@ void QWaylandQuickItem::takeFocus(QWaylandInputDevice *device)
target = compositor()->defaultInputDevice();
}
target->setKeyboardFocus(surface());
+ QWaylandTextInput *textInput = QWaylandTextInput::findIn(target);
+ if (textInput)
+ textInput->setFocus(surface());
}
/*!
@@ -632,6 +662,23 @@ void QWaylandQuickItem::setSizeFollowsSurface(bool sizeFollowsSurface)
emit sizeFollowsSurfaceChanged();
}
+#ifndef QT_NO_IM
+QVariant QWaylandQuickItem::inputMethodQuery(Qt::InputMethodQuery query) const
+{
+ return inputMethodQuery(query, QVariant());
+}
+
+QVariant QWaylandQuickItem::inputMethodQuery(Qt::InputMethodQuery query, QVariant argument) const
+{
+ Q_D(const QWaylandQuickItem);
+
+ if (query == Qt::ImEnabled)
+ return QVariant((flags() & ItemAcceptsInputMethod) != 0);
+
+ return d->oldSurface->inputMethodControl()->inputMethodQuery(query, argument);
+}
+#endif
+
/*!
\qmlproperty bool QtWayland::QWaylandSurfaceItem::paintEnabled
@@ -698,6 +745,17 @@ void QWaylandQuickItem::beforeSync()
}
}
+#ifndef QT_NO_IM
+void QWaylandQuickItem::updateInputMethod(Qt::InputMethodQueries queries)
+{
+ Q_D(QWaylandQuickItem);
+
+ setFlag(QQuickItem::ItemAcceptsInputMethod,
+ d->oldSurface ? d->oldSurface->inputMethodControl()->enabled() : false);
+ QQuickItem::updateInputMethod(queries | Qt::ImEnabled);
+}
+#endif
+
QSGNode *QWaylandQuickItem::updatePaintNode(QSGNode *oldNode, UpdatePaintNodeData *)
{
Q_D(QWaylandQuickItem);