diff options
Diffstat (limited to 'src/compositor/compositor_api/qwaylandquickitem.cpp')
-rw-r--r-- | src/compositor/compositor_api/qwaylandquickitem.cpp | 60 |
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); |