diff options
Diffstat (limited to 'src/compositor/compositor_api/qwaylandquickoutput.cpp')
-rw-r--r-- | src/compositor/compositor_api/qwaylandquickoutput.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/src/compositor/compositor_api/qwaylandquickoutput.cpp b/src/compositor/compositor_api/qwaylandquickoutput.cpp index 8abf6cbb1..0e25362fc 100644 --- a/src/compositor/compositor_api/qwaylandquickoutput.cpp +++ b/src/compositor/compositor_api/qwaylandquickoutput.cpp @@ -37,6 +37,7 @@ #include "qwaylandquickoutput.h" #include "qwaylandquickcompositor.h" +#include "qwaylandquickitem_p.h" QT_BEGIN_NAMESPACE @@ -102,6 +103,44 @@ void QWaylandQuickOutput::setAutomaticFrameCallback(bool automatic) automaticFrameCallbackChanged(); } +static QQuickItem* clickableItemAtPosition(QQuickItem *rootItem, const QPointF &position) +{ + if (!rootItem->isEnabled() || !rootItem->isVisible()) + return nullptr; + + QList<QQuickItem *> paintOrderItems = QQuickItemPrivate::get(rootItem)->paintOrderChildItems(); + auto negativeZStart = paintOrderItems.crend(); + for (auto it = paintOrderItems.crbegin(); it != paintOrderItems.crend(); ++it) { + if ((*it)->z() < 0) { + negativeZStart = it; + break; + } + QQuickItem *item = clickableItemAtPosition(*it, rootItem->mapToItem(*it, position)); + if (item) + return item; + } + + if (rootItem->contains(position) && rootItem->acceptedMouseButtons() != Qt::NoButton) + return rootItem; + + for (auto it = negativeZStart; it != paintOrderItems.crend(); ++it) { + QQuickItem *item = clickableItemAtPosition(*it, rootItem->mapToItem(*it, position)); + if (item) + return item; + } + + return nullptr; +} + +QQuickItem *QWaylandQuickOutput::pickClickableItem(const QPointF &position) +{ + QQuickWindow *quickWindow = qobject_cast<QQuickWindow *>(window()); + if (!quickWindow) + return nullptr; + + return clickableItemAtPosition(quickWindow->contentItem(), position); +} + /*! * \internal */ |