summaryrefslogtreecommitdiffstats
path: root/src/compositor/compositor_api/qwaylandquickoutput.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/compositor/compositor_api/qwaylandquickoutput.cpp')
-rw-r--r--src/compositor/compositor_api/qwaylandquickoutput.cpp39
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
*/