4#include <QtCore/qdebug.h>
5#include <QtGui/private/qevent_p.h>
6#include <QtGui/private/qeventpoint_p.h>
7#include <QtGui/private/qguiapplication_p.h>
8#include <QtGui/qpa/qplatformtheme.h>
9#include <QtQml/private/qabstractanimationjob_p.h>
10#include <QtQuick/private/qquickdeliveryagent_p_p.h>
11#include <QtQuick/private/qquickhoverhandler_p.h>
12#include <QtQuick/private/qquickpointerhandler_p_p.h>
13#if QT_CONFIG(quick_draganddrop)
14#include <QtQuick/private/qquickdrag_p.h>
16#include <QtQuick/private/qquickitem_p.h>
17#include <QtQuick/private/qquickprofiler_p.h>
18#include <QtQuick/private/qquickrendercontrol_p.h>
19#include <QtQuick/private/qquickwindow_p.h>
21#include <QtCore/qpointer.h>
48 static int allowRightClick = -1;
49 if (allowRightClick < 0) {
55 return allowRightClick != 0;
66 ret.setTimestamp(touchEvent->timestamp());
72 qWarning() <<
"Unexpected: synthesized an indistinguishable mouse event" << mouseEvent;
77 bool doubleClicked =
false;
82 doubleClicked = (
qAbs(distanceBetweenPresses.x()) <= doubleTapDistance) && (
qAbs(distanceBetweenPresses.y()) <= doubleTapDistance);
87 mouseDoubleClickInterval());
88 doubleClicked = timeBetweenPresses < doubleClickInterval;
144 qCDebug(lcTouchTarget) <<
q <<
"skipping delivery of synth-mouse event from" <<
device;
151 if (!
event.points().size())
157 for (
auto &
p :
event.points()) {
172 event.setAccepted(mousePress.isAccepted());
173 if (mousePress.isAccepted()) {
176 const auto &pt = mousePress.point(0);
177 if (!mousePress.exclusiveGrabber(pt))
178 mousePress.setExclusiveGrabber(pt,
item);
186 event.setAccepted(mouseDoubleClick.
isAccepted());
201 if (moveDelta.x() >= doubleTapDistance || moveDelta.y() >= doubleTapDistance)
211 return event.isAccepted();
270 devPriv->removeGrabber(grabber,
cancel);
277 if (epd && epd->exclusiveGrabber == grabber && epd->exclusiveGrabberContext.data() ==
q) {
279 qCDebug(lcMouseTarget) <<
"removeGrabber" << oldGrabber <<
"-> null";
286 for (
auto device : touchDevices) {
294 grabber->touchUngrabEvent();
305 for (
qsizetype i = 0;
i != touchEvent->pointCount(); ++
i) {
306 auto &pt = touchEvent->
point(
i);
307 QMutableEventPoint::setScenePosition(pt, pt.position());
333 for (
int i = 0;
i < windowList.count();
i++) {
357 qCDebug(lcFocus) <<
q <<
"focus" <<
item <<
"in scope" << scope;
367 bool sendFocusIn =
false;
371 QVarLengthArray<QQuickItem *, 20> changed;
377 newActiveFocusItem =
item;
378 while (newActiveFocusItem->isFocusScope()
379 && newActiveFocusItem->scopedFocusItem()
380 && newActiveFocusItem->scopedFocusItem()->isEnabled()) {
381 newActiveFocusItem = newActiveFocusItem->scopedFocusItem();
384 newActiveFocusItem = scope;
387 if (oldActiveFocusItem) {
395 while (afi && afi != scope) {
400 afi = afi->parentItem();
406 QQuickItem *oldSubFocusItem = scopePrivate->subFocusItem;
407 if (oldSubFocusItem) {
411 changed << oldSubFocusItem;
425 itemPrivate->
focus =
true;
435 changed << newActiveFocusItem;
438 while (afi && afi != scope) {
439 if (afi->isFocusScope()) {
443 afi = afi->parentItem();
451 if (oldActiveFocusItem) {
465 if (!changed.isEmpty())
469 qCDebug(lcFocus) <<
" delegating setFocusInScope to" << da;
478 if (ancestorFS !=
item)
493 qCDebug(lcFocus) <<
q <<
"clear focus" <<
item <<
"in scope" << scope;
498 if ( !scopePrivate->subFocusItem )
508 QVarLengthArray<QQuickItem *, 20> changed;
515 newActiveFocusItem = scope;
523 if (oldActiveFocusItem) {
525 while (afi && afi != scope) {
530 afi = afi->parentItem();
536 QQuickItem *oldSubFocusItem = scopePrivate->subFocusItem;
541 changed << oldSubFocusItem;
553 if (newActiveFocusItem) {
554 Q_ASSERT(newActiveFocusItem == scope);
561 if (oldActiveFocusItem) {
575 if (!changed.isEmpty())
579 qCDebug(lcFocus) <<
" delegating clearFocusInScope to" << da;
727 return d->sceneTransform;
741 if (
d->sceneTransform)
742 delete d->sceneTransform;
756 d->currentEventDeliveryAgent =
this;
757 auto cleanup =
qScopeGuard([
d] {
d->currentEventDeliveryAgent =
nullptr; });
759 switch (ev->type()) {
765 d->handleMouseEvent(me);
772 bool accepted =
d->deliverHoverEvent(he->scenePosition(),
773 he->points().first().sceneLastPosition(),
774 he->modifiers(), he->timestamp());
776 he->setAccepted(accepted);
779 d->sceneTransform->map(he->scenePosition()) : he->scenePosition(),
d->rootItem);
787 d->handleTouchEvent(touch);
797 return d->deliverTouchCancelEvent(
static_cast<QTouchEvent*
>(ev));
804 qCDebug(lcHoverTrace) <<
this <<
"sending hover event due to QEnterEvent" << enter;
805 bool accepted =
d->deliverHoverEvent(scenePos,
808 d->lastMousePosition = scenePos;
821#if QT_CONFIG(quick_draganddrop)
826 d->deliverDragEvent(
d->dragGrabber, ev);
831 if (
d->activeFocusItem)
832 qGuiApp->inputMethod()->commit();
835#if QT_CONFIG(gestures)
837 d->deliverSinglePointEventUntilAccepted(
static_cast<QPointerEvent *
>(ev));
841 d->deliverKeyEvent(
static_cast<QKeyEvent *
>(ev));
851#if QT_CONFIG(wheelevent)
853 auto event =
static_cast<QWheelEvent *
>(ev);
862 event->angleDelta().x(),
event->angleDelta().y());
863 d->deliverSinglePointEventUntilAccepted(
event);
864 d->lastWheelEventAccepted =
event->isAccepted();
868#if QT_CONFIG(tabletevent)
873 auto *tabletEvent =
static_cast<QTabletEvent *
>(ev);
874 d->deliverPointerEvent(tabletEvent);
890 if (activeFocusItem) {
924#if QT_CONFIG(quick_draganddrop)
933#if QT_CONFIG(quick_draganddrop)
935 dragGrabber =
nullptr;
953 if (transformedLocalPos)
954 QMutableEventPoint::setPosition(point, *transformedLocalPos);
962 const QVector<QObject *> &eventDeliveryTargets =
964 QVarLengthArray<QPair<QQuickItem *, bool>, 4> sendFilteredPointerEventResult;
966 for (
QObject *grabberObject : passiveGrabbers) {
972 if (handler && !eventDeliveryTargets.contains(handler)) {
973 bool alreadyFiltered =
false;
977 auto it = std::find_if(sendFilteredPointerEventResult.begin(), sendFilteredPointerEventResult.end(),
978 [par](
const QPair<QQuickItem *, bool> &pair) { return pair.first == par; });
979 if (
it != sendFilteredPointerEventResult.
end()) {
982 alreadyFiltered =
it->second;
985 sendFilteredPointerEventResult <<
qMakePair(par, alreadyFiltered);
987 if (!alreadyFiltered) {
990 handler->handlePointerEvent(pointerEvent);
996 if ((
isMouseEvent(pointerEvent) && excGrabber->keepMouseGrab())
997 || (
isTouchEvent(pointerEvent) && excGrabber->keepTouchGrab())) {
1013 const auto transform = itemPrivate->windowToItemTransform();
1014 const auto transformToGlobal = itemPrivate->windowToGlobalTransform();
1015 auto globalPos = transformToGlobal.map(scenePos);
1020 QMutableEventPoint::setPosition(point,
transform.map(scenePos));
1021 QMutableEventPoint::setGlobalLastPosition(point, transformToGlobal.map(lastScenePos));
1061 if (!subtreeHoverEnabled && !itemsWasHovered)
1066 if (subtreeHoverEnabled) {
1073 const auto &[
item, hoverId] = *
it;
1081 if (
item && hoverId != 0)
1088 return itemsWasHovered || itemsAreHovered;
1139 if (!
child->isVisible() || childPrivate->culled)
1141 if (!childPrivate->subtreeHoverEnabled)
1144 const QPointF localPos =
child->mapFromScene(scenePos);
1145 if (!
child->contains(localPos))
1180 const QPointF globalPos =
item->mapToGlobal(localPos);
1183 const bool wasHovering = hoverItemIterator !=
hoverItems.
end() && hoverItemIterator.value() != 0;
1185 qCDebug(lcHoverTrace) <<
"item:" <<
item <<
"scene pos:" << scenePos <<
"localPos:" << localPos
1186 <<
"wasHovering:" << wasHovering <<
"isHovering:" << isHovering;
1188 bool accepted =
false;
1208 }
else if (wasHovering) {
1210 hoverItemIterator.value() = 0;
1231 if (!hh->isHovered())
1246 hh->handlePointerEvent(&hoverEvent);
1247 if (hh->isHovered()) {
1255 if (hh->isBlocking()) {
1256 qCDebug(lcHoverTrace) <<
"skipping rest of hover delivery due to blocking" << hh;
1281 for (
const auto &passiveGrabber :
event->passiveGrabbers(point)) {
1282 if (
auto *grabberItem = qobject_cast<QQuickItem *>(passiveGrabber)) {
1283 if (targetItems.contains(grabberItem))
1302 if (
event->isAccepted()) {
1319 sendTouchCancelEvent(
event);
1331 std::unique_ptr<QTouchEvent> e(std::move(
delayedTouch));
1332 qCDebug(lcTouchCmprs) <<
"delivering" << e.get();
1350 qCDebug(lcFocus) <<
"deactivated" <<
win->title();
1352 for (
auto device : inputDevices) {
1353 if (
auto pointingDevice = qobject_cast<const QPointingDevice *>(
device)) {
1355 for (
auto epd : devPriv->activePoints.values()) {
1356 if (!epd.exclusiveGrabber.isNull()) {
1357 bool relevant =
false;
1358 if (
QQuickItem *
item = qmlobject_cast<QQuickItem *>(epd.exclusiveGrabber.data()))
1360 else if (
QQuickPointerHandler *handler = qmlobject_cast<QQuickPointerHandler *>(epd.exclusiveGrabber.data())) {
1361 if (handler->parentItem())
1362 relevant = (handler->parentItem()->window() ==
win && epd.exclusiveGrabberContext.data() ==
q);
1369 devPriv->setExclusiveGrabber(
nullptr, epd.eventPoint,
nullptr);
1380 qCDebug(lcFocus) <<
"hidden" <<
win->title();
1387 for (
auto &point : ev->points()) {
1402 for (
int i = 0;
i < ev->pointCount(); ++
i) {
1403 auto &point = ev->point(
i);
1404 QMutableEventPoint::setPosition(point, dest->
mapFromScene(point.scenePosition()));
1405 qCDebug(lcPtrLoc) << ev->type() <<
"@" << point.scenePosition() <<
"to"
1414 if (
QObject *grabber = ev->exclusiveGrabber(point)) {
1415 if (!
result.contains(grabber))
1425 if (ev->exclusiveGrabber(point) || !ev->passiveGrabbers(point).isEmpty())
1433 for (
const auto &point : ev->points()) {
1434 if (!ev->exclusiveGrabber(point) && ev->passiveGrabbers(point).isEmpty())
1442 switch (ev->type()) {
1460 switch (ev->type()) {
1472 switch (ev->type()) {
1485 switch (ev->type()) {
1499 const auto devType = ev->device()->type();
1512 if (devPriv->qqExtra)
1515 devPriv->qqExtra = extra;
1518 devPriv->qqExtra =
nullptr;
1554 QEventPoint::States
states =
event->touchPointStates();
1582 bool mismatch =
false;
1584 auto tpts =
event->points();
1586 const auto &tp = tpts.at(
i);
1588 if (tp.id() != tpDelayed.id()) {
1632 if (
event->pointCount()) {
1633 auto &point =
event->point(0);
1675 switch (
event->type()) {
1685#if QT_CONFIG(cursor)
1696 event->position().x(),
event->position().y());
1701 if (!
event->points().size() || !
event->exclusiveGrabber(
event->point(0))) {
1703 event->setAccepted(accepted);
1706#if QT_CONFIG(cursor)
1745 if (ut && ut->hasStartAnimationPending())
1746 ut->startAnimations();
1751#if !defined(Q_OS_WEBOS)
1762#if QT_CONFIG(cursor)
1768 qCDebug(lcHoverTrace) <<
q <<
"frame-sync hover delivery done";
1775 qCWarning(lcPtr,
"detected interleaved frame-sync and actual events");
1797 if (
auto *handler = qmlobject_cast<QQuickPointerHandler *>(grabber)) {
1798 if (handler->parentItem()) {
1800 deliveryAgent = itemPriv->deliveryAgent();
1801 if (deliveryAgent ==
q) {
1808 if (
isSubsceneAgent && (!itemPriv->extra.isAllocated() || !itemPriv->extra->subsceneDeliveryAgent))
1809 itemPriv->maybeHasSubsceneDeliveryAgent =
true;
1815 }
else if (
auto *grabberItem = qmlobject_cast<QQuickItem *>(grabber)) {
1816 switch (transition) {
1830 bool allReleasedOrCancelled =
true;
1832 for (
const auto &pt :
event->points()) {
1834 allReleasedOrCancelled =
false;
1839 if (allReleasedOrCancelled)
1840 grabberItem->touchUngrabEvent();
1847 deliveryAgent = itemPriv->deliveryAgent();
1850 if (
isSubsceneAgent && grabGained && (!itemPriv->extra.isAllocated() || !itemPriv->extra->subsceneDeliveryAgent))
1851 itemPriv->maybeHasSubsceneDeliveryAgent =
true;
1855 switch (transition) {
1860 qCDebug(lcPtr) <<
"remembering that" <<
q <<
"handles point" << point.
id() <<
"after" << transition;
1865 epd->exclusiveGrabberContext =
q;
1866 qCDebug(lcPtr) <<
"remembering that" <<
q <<
"handles point" << point.
id() <<
"after" << transition;
1925 QVarLengthArray<QPointF, 16> originalScenePositions;
1927 originalScenePositions.resize(
event->pointCount());
1928 for (
int i = 0;
i <
event->pointCount(); ++
i) {
1929 auto &pt =
event->point(
i);
1930 originalScenePositions[
i] = pt.scenePosition();
1931 QMutableEventPoint::setScenePosition(pt,
sceneTransform->
map(pt.scenePosition()));
1932 qCDebug(lcPtrLoc) <<
q <<
event->type() << pt.id() <<
"transformed scene pos" << pt.scenePosition();
1935 qCDebug(lcPtrLoc) <<
q <<
event->type() <<
"no scene transform set";
1944 for (
int i = 0;
i <
event->pointCount(); ++
i)
1945 event->point(
i).setAccepted(
false);
1947 if (
event->isBeginEvent()) {
1950 event->setAccepted(
false);
1954 if (
event->isEndEvent())
1971 for (
int i = 0;
i <
event->pointCount(); ++
i)
1972 QMutableEventPoint::setScenePosition(
event->point(
i), originalScenePositions.at(
i));
2009 bool checkMouseButtons,
bool checkAcceptsTouch)
const
2012 QVector<QQuickItem *> targets;
2016 qCDebug(lcPtrLoc) <<
q <<
"point" << point.
id() << point.
scenePosition() <<
"->" << itemPos <<
": relevant?" << relevant <<
"to" <<
item << point;
2023 if (itemPrivate->hasPointerHandlers()) {
2025 if (itemPrivate->anyPointerHandlerWants(
event, point))
2034 QList<QQuickItem *>
children = itemPrivate->paintOrderChildItems();
2037 [](
auto lhs,
auto rhs) ->
bool { return lhs->z() < rhs; });
2044 if (!
child->isVisible() || !
child->isEnabled() || childPrivate->culled ||
2045 (
child !=
item && childPrivate->extra.isAllocated() && childPrivate->extra->subsceneDeliveryAgent))
2063 QVector<QQuickItem *> targets = list1;
2067 int insertPosition = targets.size();
2069 int newInsertPosition = targets.lastIndexOf(
list2.
at(
i), insertPosition);
2070 if (newInsertPosition >= 0) {
2071 Q_ASSERT(newInsertPosition <= insertPosition);
2072 insertPosition = newInsertPosition;
2075 if (insertPosition == targets.size() ||
list2.
at(
i) != targets.at(insertPosition))
2076 targets.insert(insertPosition,
list2.
at(
i));
2090 for (
auto grabber : grabbers) {
2117 for (
auto &point :
event->points()) {
2120 qWarning() <<
"point is not in activePoints" << point;
2123 QList<QPointer<QObject>> relevantPassiveGrabbers;
2124 for (
int i = 0;
i < epd->passiveGrabbersContext.size(); ++
i) {
2125 if (epd->passiveGrabbersContext.at(
i).data() ==
q)
2126 relevantPassiveGrabbers << epd->passiveGrabbers.at(
i);
2128 if (!relevantPassiveGrabbers.isEmpty())
2149 QVector<QQuickItem *> targetItems;
2150 for (
auto &point :
event->points()) {
2156 if (targetItems.size()) {
2159 targetItems = targetItemsForPoint;
2163 if (grabbers.contains(
item))
2215 QVector<QQuickItem *> targetItems;
2228 if (qobject_cast<QQuickPointerHandler *>(
event->exclusiveGrabber(point->eventPoint)))
2234 for (
int i = 0;
i <
event->pointCount(); ++
i) {
2235 auto &point =
event->point(
i);
2237 if (targetItems.size()) {
2240 targetItems = targetItemsForPoint;
2244 QVector<QPointer<QQuickItem>> safeTargetItems(targetItems.begin(), targetItems.end());
2246 for (
auto &
item : safeTargetItems) {
2255 if (
event->isAccepted())
2267 for (
int i = 0;
i <
event->pointCount(); ++
i)
2268 event->point(
i).setAccepted(
false);
2271 if (
event->allPointsAccepted())
2272 handlersOnly =
true;
2275 return event->allPointsAccepted();
2289#if defined(Q_OS_ANDROID) && QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
2332 auto &point = pointerEvent->
point(0);
2334 if (mouseGrabber && mouseGrabber !=
item && mouseGrabber != oldMouseGrabber) {
2341 item->mouseUngrabEvent();
2347 point.setAccepted(
true);
2356 bool eventAccepted =
false;
2363 qCDebug(lcTouch) <<
"considering delivering" << &touchEvent <<
" to " <<
item;
2366 qCDebug(lcTouch) <<
"actually delivering" << &touchEvent <<
" to " <<
item;
2368 eventAccepted = touchEvent.isAccepted();
2378 if (eventAccepted) {
2380 for (
int i = 0;
i < touchEvent.pointCount(); ++
i) {
2381 auto &point = touchEvent.
point(
i);
2391 for (
const auto &point: touchEvent.
points()) {
2394 qCDebug(lcTouchTarget) <<
"TP" <<
Qt::hex << point.id() <<
"disassociated";
2402#if QT_CONFIG(quick_draganddrop)
2405 QObject *formerTarget = grabber->target();
2406 grabber->resetTarget();
2408 if (grabItem != grabber->end()) {
2411 QDropEvent *e =
static_cast<QDropEvent *
>(
event);
2412 for (e->setAccepted(
false); !e->isAccepted() && grabItem != grabber->end(); grabItem = grabber->release(grabItem)) {
2413 QPointF p = (**grabItem)->mapFromScene(e->position().toPoint());
2414 QDropEvent translatedEvent(
2416 e->possibleActions(),
2422 e->setAccepted(translatedEvent.isAccepted());
2423 e->setDropAction(translatedEvent.dropAction());
2424 grabber->setTarget(**grabItem);
2428 QDragLeaveEvent leaveEvent;
2429 for (; grabItem != grabber->end(); grabItem = grabber->release(grabItem))
2431 grabber->ignoreList().clear();
2434 QDragMoveEvent *moveEvent =
static_cast<QDragMoveEvent *
>(
event);
2438 QVarLengthArray<QQuickItem*, 64> currentGrabItems;
2439 for (; grabItem != grabber->end(); grabItem = grabber->release(grabItem))
2440 currentGrabItems.append(**grabItem);
2443 QDragEnterEvent enterEvent(
2444 moveEvent->position().toPoint(),
2445 moveEvent->possibleActions(),
2446 moveEvent->mimeData(),
2447 moveEvent->buttons(),
2448 moveEvent->modifiers());
2450 event->setAccepted(deliverDragEvent(grabber,
rootItem, &enterEvent, ¤tGrabItems,
2453 for (grabItem = grabber->begin(); grabItem != grabber->end(); ++grabItem) {
2454 int i = currentGrabItems.indexOf(**grabItem);
2456 currentGrabItems.remove(
i);
2458 QDragMoveEvent translatedEvent(
2459 (**grabItem)->mapFromScene(moveEvent->position().toPoint()).toPoint(),
2460 moveEvent->possibleActions(),
2461 moveEvent->mimeData(),
2462 moveEvent->buttons(),
2463 moveEvent->modifiers());
2466 event->setAccepted(translatedEvent.isAccepted());
2472 QDragLeaveEvent leaveEvent;
2480 QDragMoveEvent *e =
static_cast<QDragMoveEvent *
>(
event);
2481 QDragEnterEvent enterEvent(
2482 e->position().toPoint(),
2483 e->possibleActions(),
2488 event->setAccepted(deliverDragEvent(grabber,
rootItem, &enterEvent));
2490 grabber->ignoreList().clear();
2494bool QQuickDeliveryAgentPrivate::deliverDragEvent(
2496 QVarLengthArray<QQuickItem *, 64> *currentGrabItems,
QObject *formerTarget)
2504 const int itemIndex = grabber->ignoreList().indexOf(
item);
2505 if (!itemContained) {
2507 grabber->ignoreList().remove(itemIndex);
2513 QDragEnterEvent enterEvent(
2514 event->position().toPoint(),
2515 event->possibleActions(),
2518 event->modifiers());
2526 if (deliverDragEvent(grabber,
children.
at(ii), &enterEvent, currentGrabItems, formerTarget))
2530 if (itemContained) {
2533 if (currentGrabItems && currentGrabItems->contains(
item)) {
2534 grabber->grab(
item);
2535 grabber->setTarget(
item);
2543 if (formerTargetItem && currentGrabItems) {
2544 QDragLeaveEvent leaveEvent;
2549 currentGrabItems->removeAll(formerTarget);
2551 }
else if (itemIndex >= 0) {
2556 QDragMoveEvent translatedEvent(
p.toPoint(),
event->possibleActions(),
event->mimeData(),
2559 translatedEvent.setAccepted(
event->isAccepted());
2561 event->setAccepted(translatedEvent.isAccepted());
2562 event->setDropAction(translatedEvent.dropAction());
2564 if (translatedEvent.isAccepted()) {
2565 grabber->grab(
item);
2566 grabber->setTarget(
item);
2568 }
else if (itemIndex < 0) {
2569 grabber->ignoreList().append(
item);
2581 if (deliverDragEvent(grabber,
children.
at(ii), &enterEvent, currentGrabItems, formerTarget))
2609 if (!filteringParent)
2611 bool filtered =
false;
2613 if (filteringParent->filtersChildMouseEvents() && !
hasFiltered.contains(filteringParent)) {
2617 const bool wasAccepted =
event->allPointsAccepted();
2620 event->setAccepted(
true);
2621 auto oldMouseGrabber =
event->exclusiveGrabber(
event->point(0));
2622 if (filteringParent->childMouseEventFilter(receiver,
event)) {
2623 qCDebug(lcMouse) <<
"mouse event intercepted by childMouseEventFilter of " << filteringParent;
2626 if (
event->isAccepted() &&
event->isBeginEvent()) {
2627 auto &point =
event->point(0);
2628 auto mouseGrabber =
event->exclusiveGrabber(point);
2629 if (mouseGrabber && mouseGrabber != receiver && mouseGrabber != oldMouseGrabber) {
2632 event->setExclusiveGrabber(point, receiver);
2637 event->setAccepted(wasAccepted);
2642 auto device =
event->device();
2645 qCDebug(lcTouchTarget) <<
"skipping filtering of synth-mouse event from" <<
device;
2651 if (filteringParentTouchEvent.type() !=
QEvent::None) {
2652 qCDebug(lcTouch) <<
"letting parent" << filteringParent <<
"filter for" << receiver << &filteringParentTouchEvent;
2653 filtered = filteringParent->childMouseEventFilter(receiver, &filteringParentTouchEvent);
2655 qCDebug(lcTouch) <<
"touch event intercepted by childMouseEventFilter of " << filteringParent;
2656 event->setAccepted(filteringParentTouchEvent.isAccepted());
2658 if (
event->isAccepted()) {
2659 for (
auto point : filteringParentTouchEvent.points()) {
2661 if (!exclusiveGrabber || !exclusiveGrabber->
keepTouchGrab())
2662 event->setExclusiveGrabber(point, filteringParent);
2666 !filteringParent->acceptTouchEvents()) {
2667 qCDebug(lcTouch) <<
"touch event NOT intercepted by childMouseEventFilter of " << filteringParent
2668 <<
"; accepts touch?" << filteringParent->acceptTouchEvents()
2669 <<
"receiver accepts touch?" << acceptsTouchEvents
2670 <<
"so, letting parent filter a synth-mouse event";
2672 for (
auto &tp : filteringParentTouchEvent.points()) {
2674 switch (tp.state()) {
2700 filtered = filteringParent->childMouseEventFilter(receiver, &mouseEvent);
2702 qCDebug(lcTouch) <<
"touch event intercepted as synth mouse event by childMouseEventFilter of " << filteringParent;
2705 if (
event->isAccepted() &&
event->isBeginEvent()) {
2706 qCDebug(lcTouchTarget) <<
"TP (mouse)" <<
Qt::hex << tp.id() <<
"->" << filteringParent;
2707 filteringParentTouchEvent.setExclusiveGrabber(tp, filteringParent);
2708 touchMouseUnset =
false;
2709 filteringParent->grabMouse();
2712 if (touchMouseUnset)
2743 if (!filteringParent)
2747 if (filteringParentPrivate->replayingPressEvent)
2750 bool filtered =
false;
2751 if (filteringParentPrivate->filtersChildMouseEvents && !
hasFiltered.contains(filteringParent)) {
2753 if (filteringParent->childMouseEventFilter(receiver,
event)) {
2757 qCDebug(lcMouseTarget) <<
"for" << receiver << filteringParent <<
"childMouseEventFilter ->" << filtered;
2775 bool overThreshold =
qAbs(
d) > (startDragThreshold >= 0 ? startDragThreshold : styleHints->
startDragDistance());
2776 if (dragVelocityLimitAvailable) {
2777 QVector2D velocityVec =
event->point(0).velocity();
2778 qreal velocity = axis ==
Qt::XAxis ? velocityVec.
x() : velocityVec.y();
2781 return overThreshold;
2794 bool overThreshold =
qAbs(
d) > (startDragThreshold >= 0 ? startDragThreshold : styleHints->
startDragDistance());
2796 if (!overThreshold && dragVelocityLimitAvailable) {
2800 return overThreshold;
2810 int threshold =
qApp->styleHints()->startDragDistance();
2811 return qAbs(delta.
x()) > threshold ||
qAbs(delta.
y()) > threshold;
2814#ifndef QT_NO_DEBUG_STREAM
2820 debug <<
"QQuickDeliveryAgent(0)";
2824 debug <<
"QQuickDeliveryAgent(";
2825 if (!da->objectName().isEmpty())
2826 debug << da->objectName() <<
' ';
2827 auto root = da->rootItem();
2829 debug <<
"root=" << root->metaObject()->className();
2830 if (!root->objectName().isEmpty())
2831 debug <<
' ' << root->objectName();
2842#include "moc_qquickdeliveryagent_p.cpp"
IOBluetoothDevice * device
static bool sendEvent(QObject *receiver, QEvent *event)
Sends event event directly to receiver receiver, using the notify() function.
static bool testAttribute(Qt::ApplicationAttribute attribute)
Returns true if attribute attribute is set; otherwise returns false.
The QEventPoint class provides information about a point in a QPointerEvent.
int id
the ID number of this event point.
QPointF scenePosition
the scene position of this point.
void setAccepted(bool accepted=true)
ulong timestamp
the most recent time at which this point was included in a QPointerEvent.
QPointF sceneLastPosition
the scene position of this point from the previous press or move event.
const QPointingDevice * device
the pointing device from which this event point originates.
QVector2D velocity
a velocity vector, in units of pixels per second, in the coordinate.
bool spontaneous() const
Returns true if the event originated outside the application (a system event); otherwise returns fals...
Type
This enum type defines the valid event types in Qt.
Type type() const
Returns the event type.
virtual QEvent * clone() const
Creates and returns an identical copy of this event.
void accept()
Sets the accept flag of the event object, the equivalent of calling setAccepted(true).
bool isEmpty() const noexcept
iterator erase(iterator it)
iterator find(const Key &key)
T value(const Key &key, const T &defaultValue) const
The QFocusEvent class contains event parameters for widget focus events.
virtual bool contains(const QPointF &point) const
Returns true if this item contains point, which is in local coordinates; otherwise,...
QGraphicsWidget * window() const
bool isEnabled() const
Returns true if the item is enabled; otherwise, false is returned.
bool acceptHoverEvents() const
Qt::MouseButtons acceptedMouseButtons() const
Returns the mouse buttons that this item accepts mouse events for.
QGraphicsItem * parentItem() const
Returns a pointer to this item's parent item.
bool isVisible() const
Returns true if the item is visible; otherwise, false is returned.
bool acceptTouchEvents() const
QPointF mapFromScene(const QPointF &point) const
Maps the point point, which is in this item's scene's coordinate system, to this item's coordinate sy...
static struct QGuiApplicationPrivate::QLastCursorPosition lastCursorPosition
static QPlatformTheme * platformTheme()
static QWindowList allWindows()
Returns a list of all the windows in the application.
static QObject * focusObject()
Returns the QObject in currently active window that will be final receiver of events tied to focus,...
static QStyleHints * styleHints()
Returns the application's style hints.
static QWindow * focusWindow()
Returns the QWindow that receives events tied to focus, such as key events.
static QInputMethod * inputMethod()
returns the input method.
static Qt::KeyboardModifiers keyboardModifiers()
Returns the current state of the modifier keys on the keyboard.
The QKeyEvent class describes a key event.
int count() const
Returns the number of keys involved in this event.
Qt::KeyboardModifiers modifiers() const
Returns the keyboard modifier flags that existed immediately after the event occurred.
QString text() const
Returns the Unicode text that this key generated.
bool isAutoRepeat() const
Returns true if this event comes from an auto-repeating key; returns false if it comes from an initia...
int key() const
Returns the code of the key that was pressed or released.
qsizetype size() const noexcept
bool isEmpty() const noexcept
iterator insert(qsizetype i, parameter_type t)
const_reference at(qsizetype i) const noexcept
qsizetype removeAll(const AT &t)
void append(parameter_type t)
static Q_GUI_EXPORT void detach(QEventPoint &p)
static Q_GUI_EXPORT void setTimestamp(QEventPoint &p, ulong t)
static QMetaObject::Connection connect(const typename QtPrivate::FunctionPointer< Func1 >::Object *sender, Func1 signal, const typename QtPrivate::FunctionPointer< Func2 >::Object *receiverPrivate, Func2 slot, Qt::ConnectionType type=Qt::AutoConnection)
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
void destroyed(QObject *=nullptr)
This signal is emitted immediately before the object obj is destroyed, after any instances of QPointe...
\inmodule QtCore\reentrant
bool isNull() const noexcept
Returns true if both the x and y coordinates are set to 0.0 (ignoring the sign); otherwise returns fa...
\inmodule QtCore\reentrant
A base class for pointer events.
virtual bool isEndEvent() const
const QPointingDevice * pointingDevice() const
Returns the source device from which this event originates.
void setTimestamp(quint64 timestamp) override
void setExclusiveGrabber(const QEventPoint &point, QObject *exclusiveGrabber)
Informs the delivery logic that the given exclusiveGrabber is to receive all future update events and...
virtual bool isBeginEvent() const
QEventPoint & point(qsizetype i)
Returns a QEventPoint reference for the point at index i.
QObject * exclusiveGrabber(const QEventPoint &point) const
Returns the object which has been set to receive all future update events and the release event conta...
virtual void setAccepted(bool accepted) override
\reimp
const QList< QEventPoint > & points() const
Returns a list of points in this pointer event.
virtual bool isUpdateEvent() const
static bool setPassiveGrabberContext(EventPointData *epd, QObject *grabber, QObject *context)
static QPointingDevicePrivate * get(QPointingDevice *q)
The QPointingDevice class describes a device from which mouse, touch or tablet events originate.
GrabTransition
This enum represents a transition of exclusive or passive grab from one object (possibly nullptr) to ...
void grabChanged(QObject *grabber, QPointingDevice::GrabTransition transition, const QPointerEvent *event, const QEventPoint &point)
This signal is emitted when the grabber object gains or loses an exclusive or passive grab of point d...
static QQmlAnimationTimer * instance()
QQuickItem * lastUngrabbed
void removeGrabber(QQuickItem *grabber, bool mouse=true, bool touch=true, bool cancel=false)
Ungrabs all touchpoint grabs and/or the mouse grab from the given item grabber.
bool frameSynchronousHoverEnabled
bool deliverPressOrReleaseEvent(QPointerEvent *, bool handlersOnly=false)
void deliverPointerEvent(QPointerEvent *)
void touchToMouseEvent(QEvent::Type type, const QEventPoint &p, const QTouchEvent *touchEvent, QMutableSinglePointEvent *mouseEvent)
QFlatMap< QPointer< QQuickItem >, uint > hoverItems
void handleWindowHidden(QQuickWindow *win)
static bool subsceneAgentsExist
bool sendFilteredPointerEvent(QPointerEvent *event, QQuickItem *receiver, QQuickItem *filteringParent=nullptr)
@ DontChangeFocusProperty
QStack< QPointerEvent * > eventsInDelivery
~QQuickDeliveryAgentPrivate()
Qt::FocusReason lastFocusReason
QList< const QPointingDevice * > knownPointingDevices
QVector< QQuickItem * > mergePointerTargets(const QVector< QQuickItem * > &list1, const QVector< QQuickItem * > &list2) const
bool sendHoverEvent(QEvent::Type, QQuickItem *, const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, ulong timestamp)
bool deliverHoverEventToItem(QQuickItem *item, const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, ulong timestamp, HoverChange hoverChange)
bool deliverHoverEventRecursive(QQuickItem *, const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, ulong timestamp)
bool deliverTouchAsMouse(QQuickItem *item, QTouchEvent *pointerEvent)
QList< QObject * > exclusiveGrabbers(QPointerEvent *ev)
void onGrabChanged(QObject *grabber, QPointingDevice::GrabTransition transition, const QPointerEvent *event, const QEventPoint &point)
QVector< QQuickItem * > hasFiltered
static bool isTabletEvent(const QPointerEvent *ev)
static QQuickPointingDeviceExtra * deviceExtra(const QInputDevice *device)
void deliverUpdatedPoints(QPointerEvent *event)
bool allowChildEventFiltering
static bool anyPointGrabbed(const QPointerEvent *ev)
void translateTouchEvent(QTouchEvent *touchEvent)
void deliverKeyEvent(QKeyEvent *e)
static bool allPointsGrabbed(const QPointerEvent *ev)
bool sendFilteredMouseEvent(QEvent *event, QQuickItem *receiver, QQuickItem *filteringParent)
void updateFocusItemTransform()
bool sendFilteredPointerEventImpl(QPointerEvent *event, QQuickItem *receiver, QQuickItem *filteringParent)
static bool isMouseOrWheelEvent(const QPointerEvent *ev)
QVector< QQuickItem * > pointerTargets(QQuickItem *, const QPointerEvent *event, const QEventPoint &point, bool checkMouseButtons, bool checkAcceptsTouch) const
std::unique_ptr< QMutableTouchEvent > delayedTouch
static bool isHoverEvent(const QPointerEvent *ev)
void handleWindowDeactivate(QQuickWindow *win)
QPointF lastMousePosition
uchar compressedTouchCount
bool compressTouchEvent(QTouchEvent *)
static QQuickDeliveryAgent * currentEventDeliveryAgent
QQuickDeliveryAgent::Transform * sceneTransform
QQuickItem * activeFocusItem
void deliverMatchingPointsToItem(QQuickItem *item, bool isGrabber, QPointerEvent *pointerEvent, bool handlersOnly=false)
void handleTouchEvent(QTouchEvent *)
bool checkIfDoubleTapped(ulong newPressEventTimestamp, QPoint newPressPos)
bool isDeliveringTouchAsMouse() const
static bool isSynthMouse(const QPointerEvent *ev)
static bool isTouchEvent(const QPointerEvent *ev)
static bool isMouseEvent(const QPointerEvent *ev)
static QPointerEvent * clonePointerEvent(QPointerEvent *event, std::optional< QPointF > transformedLocalPos=std::nullopt)
int pointerEventRecursionGuard
QPointingDevicePrivate::EventPointData * mousePointData()
bool allUpdatedPointsAccepted(const QPointerEvent *ev)
void cancelTouchMouseSynthesis()
void handleMouseEvent(QMouseEvent *)
Handle event on behalf of this delivery agent's window or subscene.
QPointerEvent * eventInDelivery() const
ulong touchMousePressTimestamp
static void notifyFocusChangesRecur(QQuickItem **item, int remaining, Qt::FocusReason reason)
static QQuickDeliveryAgent * currentOrItemDeliveryAgent(const QQuickItem *item)
bool deliverSinglePointEventUntilAccepted(QPointerEvent *)
QQuickItem * focusTargetItem() const
Returns the item that should get active focus when the root focus scope gets active focus.
bool clearHover(ulong timestamp=0)
bool deliverTouchCancelEvent(QTouchEvent *)
bool hoveredLeafItemFound
void deliverDelayedTouchEvent()
static bool dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event, int startDragThreshold=-1)
QQuickDeliveryAgentPrivate(QQuickItem *root)
void deliverToPassiveGrabbers(const QVector< QPointer< QObject > > &passiveGrabbers, QPointerEvent *pointerEvent)
const QPointingDevice * touchMouseDevice
static bool isEventFromMouseOrTouchpad(const QPointerEvent *ev)
bool deliverHoverEvent(const QPointF &scenePos, const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, ulong timestamp)
void ensureDeviceConnected(const QPointingDevice *dev)
QPoint touchMousePressPos
static void localizePointerEvent(QPointerEvent *ev, const QQuickItem *dest)
QVector< QQuickItem * > skipDelivery
void flushFrameSynchronousEvents(QQuickWindow *win)
void setFocusInScope(QQuickItem *scope, QQuickItem *item, Qt::FocusReason reason, FocusOptions={ })
Set the focus inside scope to be item.
void clearFocusInScope(QQuickItem *scope, QQuickItem *item, Qt::FocusReason reason, FocusOptions={ })
Transform * sceneTransform() const
virtual ~QQuickDeliveryAgent()
void setSceneTransform(Transform *transform)
QQuickItem * rootItem() const
QQuickDeliveryAgent(QQuickItem *rootItem)
bool event(QEvent *ev) override
Handle ev on behalf of this delivery agent's window or subscene.
ItemList::iterator iterator
void copyActions(const QDropEvent &from)
virtual void itemFocusChanged(QQuickItem *, Qt::FocusReason)
QLazilyAllocated< ExtraData, ExtraDataTags > extra
void notifyChangeListeners(QQuickItemPrivate::ChangeTypes changeTypes, Fn &&function, Args &&...args)
QList< QQuickItem * > paintOrderChildItems() const
QQuickDeliveryAgent * deliveryAgent()
virtual bool handlePointerEvent(QPointerEvent *, bool avoidGrabbers=false)
bool hasPointerHandlers() const
void itemChange(QQuickItem::ItemChange, const QQuickItem::ItemChangeData &)
quint32 notifiedActiveFocus
void localizedTouchEvent(const QTouchEvent *event, bool isFiltering, QMutableTouchEvent *localized)
Qt::MouseButtons acceptedMouseButtons() const
static QQuickItemPrivate * get(QQuickItem *item)
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
QPointF mapToScene(const QPointF &point) const
Maps the given point in this item's coordinate system to the equivalent point within the scene's coor...
Flags flags() const
Returns the item flags for this item.
bool acceptTouchEvents() const
Returns whether touch events are accepted by this item.
Qt::MouseButtons acceptedMouseButtons() const
Returns the mouse buttons accepted by this item.
bool isFocusScope() const
Returns true if this item is a focus scope, and false otherwise.
virtual void mouseUngrabEvent()
This event handler can be reimplemented in a subclass to be notified when a mouse ungrab event has oc...
QPointF mapFromScene(const QPointF &point) const
Maps the given point in the scene's coordinate system to the equivalent point within this item's coor...
bool keepTouchGrab() const
Returns whether the touch points grabbed by this item should exclusively remain with this item.
QQuickWindow * window() const
Returns the window in which this item is rendered.
QQuickItem * scopedFocusItem() const
If this item is a focus scope, this returns the item in its focus chain that currently has focus.
QQuickItem * parentItem() const
@ ItemActiveFocusHasChanged
@ ItemClipsChildrenToShape
static QVector< QObject * > & deviceDeliveryTargets(const QInputDevice *device)
void handlePointerEvent(QPointerEvent *event)
static bool isRenderWindowFor(QQuickWindow *quickWin, const QWindow *renderWin)
static QQuickWindowPrivate * get(QQuickWindow *c)
\qmltype Window \instantiates QQuickWindow \inqmlmodule QtQuick
\inmodule QtCore\reentrant
A base class for pointer events containing a single point, such as mouse events.
QPointF scenePosition() const
Returns the position of the point in this event, relative to the window or scene.
T & top()
Returns a reference to the stack's top item.
T pop()
Removes the top item from the stack and returns it.
void push(const T &t)
Adds element t to the top of the stack.
\macro QT_RESTRICTED_CAST_FROM_ASCII
The QStyleHints class contains platform specific hints and settings. \inmodule QtGui.
int startDragDistance
the distance, in pixels, that the mouse must be moved with a button held down before a drag and drop ...
int startDragVelocity
the limit for the velocity, in pixels per second, that the mouse may be moved, with a button held dow...
QEventPoint & point(int touchId)
QMap< int, QEventPoint > points
The QTouchEvent class contains parameters that describe a touch event.
The QVector2D class represents a vector or vertex in 2D space.
constexpr float y() const noexcept
Returns the y coordinate of this point.
constexpr float x() const noexcept
Returns the x coordinate of this point.
void focusObjectChanged(QObject *object)
This signal is emitted when the final receiver of events tied to focus is changed to object.
EGLImageKHR int int EGLuint64KHR * modifiers
QSet< QString >::iterator it
Combined button and popup list for selecting options.
@ ImInputItemClipRectangle
QTextStream & hex(QTextStream &stream)
Calls QTextStream::setIntegerBase(16) on stream and returns stream.
@ MouseEventSynthesizedByQt
@ MouseEventSynthesizedBySystem
@ AA_SynthesizeMouseForUnhandledTouchEvents
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
constexpr T qAbs(const T &t)
Q_CORE_EXPORT Q_DECL_CONST_FUNCTION double qInf()
static bool contains(const QJsonArray &haystack, unsigned needle)
GLfloat GLfloat GLfloat w
[0]
GLenum GLenum GLsizei count
GLfloat GLfloat GLfloat GLfloat h
GLuint GLenum GLenum transform
GLsizei const void * pointer
GLdouble GLdouble GLdouble GLdouble q
QT_BEGIN_NAMESPACE constexpr decltype(auto) qMakePair(T1 &&value1, T2 &&value2) noexcept(noexcept(std::make_pair(std::forward< T1 >(value1), std::forward< T2 >(value2))))
T qmlobject_cast(QObject *object)
This method is identical to qobject_cast<T>() except that it does not require lazy QMetaObjects to be...
QQuickItem * qmlobject_cast< QQuickItem * >(QObject *object)
static bool allowSyntheticRightClick()
QT_BEGIN_NAMESPACE Q_GUI_EXPORT bool qt_sendShortcutOverrideEvent(QObject *o, ulong timestamp, int k, Qt::KeyboardModifiers mods, const QString &text=QString(), bool autorep=false, ushort count=1)
static bool windowHasFocus(QQuickWindow *win)
static QQuickItem * findFurthestFocusScopeAncestor(QQuickItem *item)
QDebug operator<<(QDebug debug, const QQuickDeliveryAgent *da)
QQuickItem * qobject_cast< QQuickItem * >(QObject *o)
const QQuickItem * qobject_cast< const QQuickItem * >(const QObject *o)
const QQuickItem * rootItem(const I &item)
#define Q_QUICK_INPUT_PROFILE(Type, DetailType, A, B)
QScopeGuard< typename std::decay< F >::type > qScopeGuard(F &&f)
[qScopeGuard]
Q_CORE_EXPORT bool qEnvironmentVariableIsSet(const char *varName) noexcept
Q_CORE_EXPORT int qEnvironmentVariableIntValue(const char *varName, bool *ok=nullptr) noexcept
Q_GUI_EXPORT bool qt_sendShortcutOverrideEvent(QObject *o, ulong timestamp, int k, Qt::KeyboardModifiers mods, const QString &text=QString(), bool autorep=false, ushort count=1)
bool contains(const AT &t) const noexcept