58 Q_DECLARE_PUBLIC(QQuickDeliveryAgent)
59 QQuickDeliveryAgentPrivate(QQuickItem *root);
60 ~QQuickDeliveryAgentPrivate();
62 QQuickItem *rootItem =
nullptr;
64 QQuickItem *activeFocusItem =
nullptr;
66 void deliverKeyEvent(QKeyEvent *e);
69 DontChangeFocusProperty = 0x01,
70 DontChangeSubFocusItem = 0x02
72 Q_DECLARE_FLAGS(FocusOptions, FocusOption)
74 void setFocusInScope(QQuickItem *scope, QQuickItem *item, Qt::FocusReason reason, FocusOptions = { });
75 void clearFocusInScope(QQuickItem *scope, QQuickItem *item, Qt::FocusReason reason, FocusOptions = { });
76 static void notifyFocusChangesRecur(QQuickItem **item,
int remaining, Qt::FocusReason reason);
77 void clearFocusObject();
78 void updateFocusItemTransform();
80 QQuickItem *focusTargetItem()
const;
83#if QT_CONFIG(quick_draganddrop)
84 QQuickDragGrabber *dragGrabber =
nullptr;
86 QQuickItem *lastUngrabbed =
nullptr;
87 QStack<QPointerEvent *> eventsInDelivery;
88 struct HoverItemState {
89 QPointer<QQuickItem> item;
92 bool fromTouch =
false;
94 using HoverItems = QList<HoverItemState>;
95 HoverItems hoverItems;
96 QList<QQuickItem *> hasFiltered;
97 QList<QQuickItem *> skipDelivery;
99 std::unique_ptr<QMutableTouchEvent> delayedTouch;
100 QList<
const QPointingDevice *> knownPointingDevices;
102 uint currentHoverId = 0;
103#if QT_CONFIG(wheelevent)
104 uint lastWheelEventAccepted = 0;
106 uchar compressedTouchCount = 0;
107 bool allowChildEventFiltering =
true;
108 bool hoveredLeafItemFound =
false;
109 bool lastMousePositionFromTouch =
false;
111 bool isSubsceneAgent =
false;
112 static bool subsceneAgentsExist;
114 static QQuickDeliveryAgent *currentEventDeliveryAgent;
115 static QQuickDeliveryAgent *currentOrItemDeliveryAgent(
const QQuickItem *item);
116 inline static quint64 frameSynchronousHover_counter = 0;
118 int frameSynchronousHoverInterval = 100;
119 QElapsedTimer frameSynchronousHoverTimer;
120 QBasicTimer frameSynchronousDelayTimer;
122 Qt::FocusReason lastFocusReason = Qt::OtherFocusReason;
123 int pointerEventRecursionGuard = 0;
125 int touchMouseId = -1;
127 const QPointingDevice *touchMouseDevice =
nullptr;
128 ulong touchMousePressTimestamp = 0;
129 QPoint touchMousePressPos;
131 QQuickDeliveryAgent::Transform *sceneTransform =
nullptr;
133 bool isDeliveringTouchAsMouse()
const {
return touchMouseId != -1 && touchMouseDevice; }
134 void cancelTouchMouseSynthesis();
136 bool checkIfDoubleTapped(ulong newPressEventTimestamp,
const QPoint &newPressPos);
137 void resetIfDoubleTapPrevented(
const QEventPoint &pressedPoint);
138 QPointingDevicePrivate::EventPointData *mousePointData();
139 QPointerEvent *eventInDelivery()
const;
142 QPointF lastMousePosition;
143 bool deliverTouchAsMouse(QQuickItem *item, QTouchEvent *pointerEvent);
144 static void translateTouchEvent(QTouchEvent *touchEvent);
145 void removeGrabber(QQuickItem *grabber,
bool mouse =
true,
bool touch =
true,
bool cancel =
false);
146 void clearGrabbers(QPointerEvent *pointerEvent);
147 void onGrabChanged(QObject *grabber, QPointingDevice::GrabTransition transition,
const QPointerEvent *event,
const QEventPoint &point);
148 static QPointerEvent *clonePointerEvent(QPointerEvent *event, std::optional<QPointF> transformedLocalPos = std::nullopt);
149 void deliverToPassiveGrabbers(
const QList<QPointer<QObject> > &passiveGrabbers, QPointerEvent *pointerEvent);
150 bool sendFilteredMouseEvent(QEvent *event, QQuickItem *receiver, QQuickItem *filteringParent);
151 bool sendFilteredPointerEvent(QPointerEvent *event, QQuickItem *receiver, QQuickItem *filteringParent =
nullptr);
152 bool sendFilteredPointerEventImpl(QPointerEvent *event, QQuickItem *receiver, QQuickItem *filteringParent);
153 bool deliverSinglePointEventUntilAccepted(QPointerEvent *);
156 void handleTouchEvent(QTouchEvent *);
157 void handleMouseEvent(QMouseEvent *);
158 bool compressTouchEvent(QTouchEvent *);
159 void flushFrameSynchronousEvents(QQuickWindow *win);
160 void deliverDelayedTouchEvent();
161 void handleWindowDeactivate(QQuickWindow *win);
162 void handleWindowHidden(QQuickWindow *win);
165 bool allUpdatedPointsAccepted(
const QPointerEvent *ev);
166 static void localizePointerEvent(QPointerEvent *ev,
const QQuickItem *dest);
167 QList<QObject *> exclusiveGrabbers(QPointerEvent *ev);
168 static bool anyPointGrabbed(
const QPointerEvent *ev);
169 static bool allPointsGrabbed(
const QPointerEvent *ev);
170 static bool isMouseEvent(
const QPointerEvent *ev);
171 static bool isMouseOrWheelEvent(
const QPointerEvent *ev);
172 static bool isHoverEvent(
const QPointerEvent *ev);
173 static bool isHoveringMoveEvent(
const QPointerEvent *ev);
174 static bool isTouchEvent(
const QPointerEvent *ev);
175 static bool isTabletEvent(
const QPointerEvent *ev);
176 static bool isEventFromMouseOrTouchpad(
const QPointerEvent *ev);
177 static bool isSynthMouse(
const QPointerEvent *ev);
178 static bool isWithinDoubleClickInterval(ulong timeInterval);
179 static bool isWithinDoubleTapDistance(
const QPoint &distanceBetweenPresses);
180 static bool isSinglePointDevice(
const QInputDevice *dev);
181 static QQuickPointingDeviceExtra *deviceExtra(
const QInputDevice *device);
184 void touchToMouseEvent(QEvent::Type type,
const QEventPoint &p,
const QTouchEvent *touchEvent, QMutableSinglePointEvent *mouseEvent);
185 void ensureDeviceConnected(
const QPointingDevice *dev);
186 void deliverPointerEvent(QPointerEvent *);
187 bool deliverTouchCancelEvent(QTouchEvent *);
188 bool deliverPressOrReleaseEvent(QPointerEvent *,
bool handlersOnly =
false);
189 void deliverUpdatedPoints(QPointerEvent *event);
190 void deliverMatchingPointsToItem(QQuickItem *item,
bool isGrabber, QPointerEvent *pointerEvent,
bool handlersOnly =
false);
192 QList<QQuickItem *> eventTargets(QQuickItem *,
const QEvent *event,
int pointId, QPointF localPos, QPointF scenePos,
193 qxp::function_ref<std::optional<
bool> (QQuickItem *,
const QEvent *)> predicate)
const;
194 void eventTargetsAppend(QQuickItem *,
const QEvent *event,
int pointId, QPointF localPos, QPointF scenePos,
195 qxp::function_ref<std::optional<
bool> (QQuickItem *,
const QEvent *)> predicate,
196 QList<QQuickItem *> &targets)
const;
197 QList<QQuickItem *> pointerTargets(QQuickItem *,
const QPointerEvent *event,
const QEventPoint &point,
198 bool checkMouseButtons,
bool checkAcceptsTouch)
const;
199 QList<QQuickItem *> mergePointerTargets(
const QList<QQuickItem *> &list1,
const QList<QQuickItem *> &list2)
const;
202 enum class HoverChange : uint8_t {
206 bool deliverHoverEvent(
const QPointF &scenePos,
const QPointF &lastScenePos, Qt::KeyboardModifiers modifiers, ulong timestamp);
207 bool deliverHoverEventRecursive(QQuickItem *,
const QPointF &localPos,
208 const QPointF &scenePos,
const QPointF &lastScenePos,
209 const QPointF &globalPos, Qt::KeyboardModifiers modifiers, ulong timestamp);
210 bool deliverHoverEventToItem(QQuickItem *item,
const QPointF &localPos,
const QPointF &scenePos,
211 const QPointF &lastScenePos,
const QPointF &globalPos,
212 Qt::KeyboardModifiers modifiers, ulong timestamp,
213 HoverChange hoverChange);
214 bool sendHoverEvent(QEvent::Type, QQuickItem *,
const QPointF &localPos,
const QPointF &scenePos,
215 const QPointF &lastScenePos,
const QPointF &globalPos,
216 Qt::KeyboardModifiers modifiers, ulong timestamp);
217 bool clearHover(ulong timestamp = 0);
218 void clearTouchHover(ulong timestamp = 0);
219 bool isHoveredByHoveringDevice(
const QQuickItem *item)
const;
221#if QT_CONFIG(quick_draganddrop)
222 void deliverDragEvent(QQuickDragGrabber *, QEvent *);
223 bool deliverDragEvent(QQuickDragGrabber *, QQuickItem *, QDragMoveEvent *,
224 QVarLengthArray<QQuickItem *, 64> *currentGrabItems =
nullptr,
225 QObject *formerTarget =
nullptr);
228 static bool dragOverThreshold(qreal d, Qt::Axis axis, QMouseEvent *event,
int startDragThreshold = -1);
230 static bool dragOverThreshold(qreal d, Qt::Axis axis,
const QEventPoint &tp,
int startDragThreshold = -1);
232 static bool dragOverThreshold(QVector2D delta);
235 QList<QQuickItem *> contextMenuTargets(QQuickItem *item,
const QContextMenuEvent *event)
const;
236 void deliverContextMenuEvent(QContextMenuEvent *event);