9#include <QtCore/private/qohoslogger_p.h>
10#include <QtCore/qmap.h>
11#include <QtGui/private/qguiapplication_p.h>
12#include <QtGui/private/qhighdpiscaling_p.h>
15#include <arkui/ui_input_event.h>
17#include <render/qohosview.h>
20using namespace Qt::Literals::StringLiterals;
22namespace ch =
std::chrono;
33 auto *deviceRaw = device.get();
34 QWindowSystemInterface::registerInputDevice(device.release());
40 qOhosDebug(QtForOhos) <<
"Creating pointing device! type:" << deviceType;
45 const qint64 systemId =
static_cast<qint64>(deviceType);
47 if (deviceType == QInputDevice::DeviceType::Mouse) {
48 return registerPointingDevice(std::make_unique<QPointingDevice>(
49 "OHOS mouse device"_L1, systemId, deviceType, QPointingDevice::PointerType::Generic,
50 QInputDevice::Capability::Position, 1, 3));
53 return registerPointingDevice(std::make_unique<QPointingDevice>(
54 "OHOS touch device"_L1, systemId, deviceType, QPointingDevice::PointerType::Finger,
55 QInputDevice::Capability::Position
56 | QInputDevice::Capability::Area
57 | QInputDevice::Capability::Pressure
58 | QInputDevice::Capability::NormalizedPosition,
63 QObject *object, QObject *context,
std::function<
void()> signalHandler)
65 auto objDestroyedConnection = QObject::connect(object, &QObject::destroyed, context, std::move(signalHandler));
66 return QtOhos::makeDestroyNotifier(
67 [objDestroyedConnection = std::move(objDestroyedConnection)] ()
mutable {
68 QObject::disconnect(objDestroyedConnection);
75 case OH_NATIVEXCOMPONENT_DOWN:
76 return makeQOhosOptional(QEventPoint::State::Pressed);
77 case OH_NATIVEXCOMPONENT_UP:
78 return makeQOhosOptional(QEventPoint::State::Released);
79 case OH_NATIVEXCOMPONENT_MOVE:
80 return makeQOhosOptional(QEventPoint::State::Updated);
81 case OH_NATIVEXCOMPONENT_CANCEL:
82 case OH_NATIVEXCOMPONENT_UNKNOWN:
90 auto *platformScreen =
static_cast<
QOhosPlatformScreen *>(targetWindow->screen()->handle());
92 QSize screenSize = platformScreen->geometry().size();
94 QPointF clickPointNormalized(
95 clickPoint.x() / screenSize.width(),
96 clickPoint.y() / screenSize.height());
98 return clickPointNormalized;
112 auto *screen = qWindow !=
nullptr
114 : QGuiApplication::primaryScreen();
116 return screen !=
nullptr
117 ? screen->handle()->geometry().topLeft()
123 auto *platformWindow = QOhosPlatformWindow::fromQWindowOrNull(qWindow);
124 auto platformWindowGeometry = platformWindow !=
nullptr
125 ? platformWindow->geometry()
126 : QHighDpi::toNativePixels(qWindow->geometry(), qWindow);
128 return globalPosition - platformWindowGeometry.topLeft();
134 const std::set<QInputDevice::DeviceType> &deviceTypes)
136 for (
const auto &deviceType : deviceTypes)
137 m_pointingDevices.emplace(deviceType, createPointingDevice(deviceType));
143 QWindow *targetWindow, ch::nanoseconds timeStamp,
144 const std::vector<QOhosTouchEventTouchPointData> &touchPoints,
145 QInputDevice::DeviceType deviceType, QFlags<OhosKeyboardModifier> modifiers)
147 auto *touchDevice = getPointingDeviceOrCreate(deviceType);
149 QList<QWindowSystemInterface::TouchPoint> wsiTouchPoints;
151 auto timeStampMs = ch::duration_cast<ch::milliseconds>(timeStamp);
153 std::vector<QPoint> activeTouchPointDisplayPositions;
155 auto displayOffset = targetWindow !=
nullptr
156 ? determineScreenGlobalDisplayOffset(targetWindow)
159 for (
const auto &touchPointData : touchPoints) {
160 const auto &touchPoint = touchPointData.touchPoint;
161 QPointF clickPoint = touchPointData.displayPosition;
163 switch (touchPointData.toolType) {
164 case ::OH_NATIVEXCOMPONENT_TOOL_TYPE_FINGER: {
165 QEventPoint::State state =
166 tryMapXComponentTouchEventTypeToQt(touchPoint.type)
167 .value_or(QEventPoint::State::Stationary);
169 if (state != QEventPoint::State::Released)
170 activeTouchPointDisplayPositions.push_back(touchPointData.displayPosition.toPoint());
172 QWindowSystemInterface::TouchPoint qwsiTouchPoint;
173 qwsiTouchPoint.id = touchPoint.id;
174 qwsiTouchPoint.pressure = touchPoint.force;
175 qwsiTouchPoint.normalPosition =
176 calculateTouchPointNormalPosition(targetWindow, clickPoint);
177 qwsiTouchPoint.state = state;
178 qwsiTouchPoint.area = calculateTouchPointArea(clickPoint + displayOffset);
179 wsiTouchPoints.push_back(qwsiTouchPoint);
182 case ::OH_NATIVEXCOMPONENT_TOOL_TYPE_PEN: {
183 Qt::MouseButtons buttons = Qt::NoButton;
184 switch (touchPoint.type) {
185 case OH_NATIVEXCOMPONENT_DOWN:
186 case OH_NATIVEXCOMPONENT_MOVE:
187 buttons = Qt::LeftButton;
189 case OH_NATIVEXCOMPONENT_UP:
190 case OH_NATIVEXCOMPONENT_CANCEL:
191 case OH_NATIVEXCOMPONENT_UNKNOWN:
192 buttons = Qt::NoButton;
195 constexpr float tiltDegreesMin = -60.0f;
196 constexpr float tiltDegreesMax = 60.0f;
197 const int xTilt = qRound(qBound(tiltDegreesMin, touchPointData.tiltX, tiltDegreesMax));
198 const int yTilt = qRound(qBound(tiltDegreesMin, touchPointData.tiltY, tiltDegreesMax));
199 constexpr qreal tangentialPressure = 0;
200 constexpr qreal rotation = 0;
202 QWindowSystemInterface::handleTabletEvent(
203 targetWindow, timeStampMs.count(), {touchPoint.x, touchPoint.y},
205 static_cast<
int>(QInputDevice::DeviceType::Stylus),
206 static_cast<
int>(QPointingDevice::PointerType::Pen),
207 buttons, touchPoint.force, xTilt, yTilt, tangentialPressure, rotation,
208 z, touchPoint.id, convertOhosToQtKeyboardModifiers(modifiers));
211 case ::OH_NATIVEXCOMPONENT_TOOL_TYPE_RUBBER:
212 case ::OH_NATIVEXCOMPONENT_TOOL_TYPE_BRUSH:
213 case ::OH_NATIVEXCOMPONENT_TOOL_TYPE_PENCIL:
214 case ::OH_NATIVEXCOMPONENT_TOOL_TYPE_AIRBRUSH:
215 case ::OH_NATIVEXCOMPONENT_TOOL_TYPE_LENS:
216 case ::OH_NATIVEXCOMPONENT_TOOL_TYPE_UNKNOWN:
217 qOhosWarning(QtForOhos) <<
"Skipping unsupported tool type =" << touchPointData.toolType;
219 case ::OH_NATIVEXCOMPONENT_TOOL_TYPE_MOUSE:
220 qOhosWarning(QtForOhos) <<
"Skipping mouse tool type in touch event.";
225 if (!wsiTouchPoints.isEmpty()) {
226 auto singleActiveTouchEventGlobalPosition = activeTouchPointDisplayPositions.size() == 1
227 ? makeQOhosOptional(displayOffset + activeTouchPointDisplayPositions.front())
230 QWindowSystemInterfaceTouchEvent touchEvent = {
231 .targetWindow = targetWindow,
232 .touchPoints = wsiTouchPoints,
233 .touchDevice = touchDevice,
234 .timestampMs = timeStampMs,
235 .modifiers = modifiers,
236 .singleTouchPointEventGlobalPosition = singleActiveTouchEventGlobalPosition,
239 handleTouchEvent(touchEvent);
245 auto *pointingDevice = getPointingDeviceOrCreate(gestureEvent.deviceType);
246 auto *window = gestureEvent.targetWindow.data();
251 auto scaledLocalPosition = QHighDpi::fromNativeLocalPosition(gestureEvent.localPosition, window);
252 auto scaledGlobalPosition = QHighDpi::fromNativePixels(gestureEvent.globalPosition, window);
254 QWindowSystemInterface::handleGestureEventWithRealValue(
255 gestureEvent.targetWindow,
256 gestureEvent.timestamp,
257 static_cast<
const QPointingDevice *>(pointingDevice),
258 gestureEvent.gestureType,
261 scaledGlobalPosition);
266 const auto optQOhosQtKeyEvent = keyEvent.tryConvertToQOhosQtKeyEvent();
267 if (!optQOhosQtKeyEvent.has_value())
269 const auto qOhosQtKeyEvent = optQOhosQtKeyEvent.value();
271 constexpr quint32 nativeScanCode = 0;
272 constexpr quint32 nativeModifiers = 0;
275 if (ohosInputContext !=
nullptr)
276 ohosInputContext->setLastInputTypeToTriggerSoftKeyboard(QOhosInputContext::RequestKeyboardReason::NONE);
278 if (qOhosQtKeyEvent.keyAction == QEvent::KeyPress) {
279 if (m_autoRepeatCountMap[qOhosQtKeyEvent.keyCode] < std::numeric_limits<ushort>::max()) {
280 ++m_autoRepeatCountMap[qOhosQtKeyEvent.keyCode];
283 m_autoRepeatCountMap.remove(qOhosQtKeyEvent.keyCode);
285 const auto count = m_autoRepeatCountMap.value(qOhosQtKeyEvent.keyCode, 1);
287 QWindowSystemInterface::handleExtendedKeyEvent(
288 !m_currentKeyboardGrabbingWindow.isNull()
289 ? m_currentKeyboardGrabbingWindow.data()
291 qOhosQtKeyEvent.keyAction, qOhosQtKeyEvent.keyCode,
292 qOhosQtKeyEvent.guiApplicationKeyboardModifiers, nativeScanCode,
293 qOhosQtKeyEvent.nativeKeyCode, nativeModifiers, qOhosQtKeyEvent.keyText, count > 1, count);
298 Qt::MouseButton button = Qt::NoButton;
300 if (mouseEvent.eventType == QEvent::MouseButtonPress || mouseEvent.eventType == QEvent::MouseButtonRelease) {
301 button = mouseEvent.button;
310 registerOnWindowCloseToResetMouseButtonsState(mouseEvent.targetWindow);
314 .targetWindow = mouseEvent.targetWindow,
315 .timestampMs = mouseEvent.timestampMs,
316 .localPosition = mouseEvent.localPosition,
317 .globalPosition = mouseEvent.globalPosition,
319 .eventType = mouseEvent.eventType,
320 .modifiers = mouseEvent.modifiers,
321 .deviceType = mouseEvent.deviceType,
324 handleMouseEvent(wsiEvent);
330 auto local = hoverEvent.localPosition;
331 auto global = hoverEvent.globalPosition;
332 QWindow *window = hoverEvent.targetWindow;
333 if (!m_currentMouseGrabbingWindow.isNull() && m_currentMouseGrabbingWindow != window)
337 QWindowSystemInterface::handleEnterEvent(window, local, global);
339 QWindowSystemInterface::handleLeaveEvent(window);
344 constexpr int angleXMin = -120;
345 constexpr int angleXMax = 120;
346 constexpr int xAxisValueMultiplier = -10;
348 constexpr int angleYMin = angleXMin;
349 constexpr int angleYMax = angleXMax;
350 constexpr int yAxisValueMultiplier = xAxisValueMultiplier;
352 constexpr double wheelStepDegree = 15.0;
353 constexpr double wheelStepPixel = 21.0;
355 constexpr double angleBaseValue = 8.0;
356 constexpr double directionMultiplier = -1.0;
361 static_cast<QOhosPlatformTheme *>(QGuiApplicationPrivate::platformTheme())->setWheelScrollLines(
362 static_cast<
int>(event.wheelScrollLines));
366 if (event.eventToolType == UI_INPUT_EVENT_TOOL_TYPE_MOUSE) {
367 angleDelta.setX(qBound(angleXMin,
static_cast<
int>(event
.horizontalValue * xAxisValueMultiplier), angleXMax));
368 angleDelta.setY(qBound(angleYMin,
static_cast<
int>(event
.verticalValue * yAxisValueMultiplier), angleYMax));
370 auto mousePixelDeltaMultiplier = wheelStepPixel / wheelStepDegree / angleBaseValue;
372 qRound(angleDelta.x() * mousePixelDeltaMultiplier * platformScreen->pixelScalingCoefficient()));
374 qRound(angleDelta.y() * mousePixelDeltaMultiplier * platformScreen->pixelScalingCoefficient()));
375 }
else if (event.eventToolType == UI_INPUT_EVENT_TOOL_TYPE_TOUCHPAD) {
376 auto touchpadAngleDeltaMultiplier =
377 wheelStepDegree / wheelStepPixel / platformScreen->pixelScalingCoefficient() * angleBaseValue * directionMultiplier / event
.wheelScrollLines;
378 angleDelta.setX(qRound(event
.horizontalValue * touchpadAngleDeltaMultiplier));
379 angleDelta.setY(qRound(event
.verticalValue * touchpadAngleDeltaMultiplier));
382 pixelDelta.setY(qRound(event
.verticalValue * directionMultiplier));
384 qOhosWarning(QtForOhos)
386 <<
"Received unsupported input event tool type =" << event.eventToolType <<
"skipping...";
390 Qt::MouseEventSource source = event.eventToolType == ::UI_INPUT_EVENT_TOOL_TYPE_TOUCHPAD
391 ? Qt::MouseEventSynthesizedBySystem
392 : Qt::MouseEventNotSynthesized;
393 bool inverted =
false;
395 const QInputDevice::DeviceType wheelDeviceType = event.eventToolType == UI_INPUT_EVENT_TOOL_TYPE_MOUSE
396 ? QInputDevice::DeviceType::Mouse
397 : QInputDevice::DeviceType::TouchPad;
398 const auto *wheelDevice =
399 static_cast<
const QPointingDevice *>(getPointingDeviceOrCreate(wheelDeviceType));
401 QWindowSystemInterface::handleWheelEvent(
409 convertOhosToQtKeyboardModifiers(event.modifiers),
416 QWindow *targetWindow, std::vector<QOhosWindowProxy::NonClientAreaMouseEvent> eventBatch)
421 QtOhos::removeMatchingWithLookahead(
422 eventBatch.begin(), eventBatch.end(),
423 [](
const NonClientAreaMouseEvent &event,
const NonClientAreaMouseEvent &nextEvent) {
424 return event.action == QEvent::NonClientAreaMouseMove
425 && nextEvent.action == QEvent::NonClientAreaMouseMove;
429 for (
const auto &mouseEvent : eventBatch) {
437 QOhosMouseEvent qtMouseEvent = {
438 .targetWindow = targetWindow,
439 .timestampMs = mouseEvent.timestamp,
440 .localPosition = mouseEvent.localPosition,
441 .globalPosition = mouseEvent.displayPosition,
442 .button = mouseEvent.button,
443 .eventType = mouseEvent.action,
444 .deviceType = QInputDevice::DeviceType::TouchPad,
454 if (mouseEvent.action == QEvent::NonClientAreaMouseButtonPress)
455 registerOnWindowCloseToResetMouseButtonsState(targetWindow);
457 handleMouseEvent(qtMouseEvent);
462 QWindow *targetWindow, std::vector<QOhosWindowProxy::NonClientAreaTouchEvent> eventBatch)
467 QtOhos::removeMatchingWithLookahead(
468 eventBatch.begin(), eventBatch.end(),
469 [](
const NonClientAreaTouchEvent &event,
const NonClientAreaTouchEvent &nextEvent) {
471 event.state == QEventPoint::State::Updated
472 && nextEvent.state == QEventPoint::State::Updated;
476 for (
const auto &touchEvent : eventBatch) {
477 QPointF clickPoint = touchEvent.displayPosition;
479 QWindowSystemInterface::TouchPoint qwsiTouchPoint;
480 qwsiTouchPoint.id = touchEvent.id;
481 qwsiTouchPoint.pressure = 1.0;
482 qwsiTouchPoint.normalPosition = calculateTouchPointNormalPosition(targetWindow, clickPoint);
483 qwsiTouchPoint.state = touchEvent.state;
484 qwsiTouchPoint.area = calculateTouchPointArea(clickPoint);
486 QWindowSystemInterfaceTouchEvent qwsiTouchEvent = {
487 .targetWindow = targetWindow,
488 .touchPoints = {qwsiTouchPoint},
489 .touchDevice = getPointingDeviceOrCreate(QInputDevice::DeviceType::TouchScreen),
490 .timestampMs = touchEvent.timestamp,
493 handleTouchEvent(qwsiTouchEvent);
499 auto lastTouchedPair = getLastTouchedWindowWithSeqNoIfPresent();
500 return lastTouchedPair.has_value()
501 ? lastTouchedPair.value().first
507 auto pointingDeviceIter = m_pointingDevices.find(deviceType);
508 if (pointingDeviceIter == m_pointingDevices.end()) {
509 qOhosWarning(QtForOhos) <<
"Trying to get pointing device but it isn't registered. Creating and registering one now.";
510 std::tie(pointingDeviceIter, std::ignore) = m_pointingDevices.emplace(
511 deviceType, createPointingDevice(deviceType));
513 return pointingDeviceIter->second;
518 auto maxSeqNoEntryIter =
std::max_element(
519 m_windowsUnderTouchPoints.begin(), m_windowsUnderTouchPoints.end(),
520 [](
const auto &a,
const auto &b) {
521 return a.second.second < b.second.second;
524 return maxSeqNoEntryIter != m_windowsUnderTouchPoints.end()
526 std::make_pair(maxSeqNoEntryIter->first, maxSeqNoEntryIter->second.second))
527 : makeEmptyQOhosOptional();
532 qCDebug(QtForOhos) << Q_FUNC_INFO <<
"window:" << window;
533 m_currentMouseGrabbingWindow = window;
538 qCDebug(QtForOhos) << Q_FUNC_INFO <<
"window:" << window;
539 m_currentKeyboardGrabbingWindow = window;
544 if (!m_currentMouseGrabbingWindow.isNull() && m_lastWsiMouseEvent.has_value()) {
545 auto lastWsiMouseEventValue = m_lastWsiMouseEvent.value();
546 auto *previousCaptureWindow = m_currentMouseGrabbingWindow.data();
547 auto *optLastWindowUnderCursor = lastWsiMouseEventValue.targetWindow.data();
548 auto *optCurrentWindowUnderCursor = qGuiApp->topLevelAt(
549 QHighDpi::fromNativePixels(
550 lastWsiMouseEventValue.globalPosition.toPoint(),
551 lastWsiMouseEventValue.targetWindow.data()));
553 if (optLastWindowUnderCursor !=
nullptr
554 && optCurrentWindowUnderCursor !=
nullptr
555 && optLastWindowUnderCursor != previousCaptureWindow) {
556 QWindowSystemInterface::handleEnterEvent(
557 optLastWindowUnderCursor, lastWsiMouseEventValue.localPosition,
558 lastWsiMouseEventValue.globalPosition);
561 m_currentMouseGrabbingWindow.clear();
566 if (m_lastWsiMouseEvent.has_value())
567 return m_lastWsiMouseEvent.value().globalPosition.toPoint();
569 auto optLastTouchPosition = qAndThen(
571 [](
const QWindowSystemInterfaceTouchEvent &touchEvent) {
572 return touchEvent.singleTouchPointEventGlobalPosition;
574 if (optLastTouchPosition.has_value())
575 return optLastTouchPosition.value();
577 auto lastScaledPositionFromApp = QGuiApplicationPrivate::lastCursorPosition.toPoint();
578 auto *screen = qGuiApp->screenAt(lastScaledPositionFromApp);
579 return QHighDpi::toNativePixels(
580 lastScaledPositionFromApp,
583 : QGuiApplication::primaryScreen());
588 m_currentKeyboardGrabbingWindow.clear();
593 static const QSet<QEvent::Type> mouseButtonPressEventTypes = {
594 QEvent::MouseButtonPress,
595 QEvent::NonClientAreaMouseButtonPress,
597 static const QSet<QEvent::Type> mouseButtonReleaseEventTypes = {
598 QEvent::MouseButtonRelease,
599 QEvent::NonClientAreaMouseButtonRelease,
602 bool eventTypeIsPress = mouseButtonPressEventTypes.contains(wsiEvent.eventType);
603 bool eventTypeIsRelease = mouseButtonReleaseEventTypes.contains(wsiEvent.eventType);
605 if (eventTypeIsPress || eventTypeIsRelease) {
606 m_mouseButtonsState.setFlag(wsiEvent.button, eventTypeIsPress);
608 if (ohosInputContext !=
nullptr)
609 ohosInputContext->setLastInputTypeToTriggerSoftKeyboard(QOhosInputContext::RequestKeyboardReason::MOUSE);
612 QEvent::Type targetEventType;
613 QWindow *targetWindow;
614 QPointF localPosition;
615 if (!m_currentMouseGrabbingWindow.isNull()) {
616 targetWindow = m_currentMouseGrabbingWindow;
617 localPosition = makeWindowLocalPosition(wsiEvent.globalPosition.toPoint(), targetWindow);
618 switch (wsiEvent.eventType) {
619 case QEvent::NonClientAreaMouseButtonRelease:
620 targetEventType = QEvent::MouseButtonRelease;
622 case QEvent::NonClientAreaMouseButtonPress:
623 targetEventType = QEvent::MouseButtonPress;
625 case QEvent::NonClientAreaMouseMove:
626 targetEventType = QEvent::MouseMove;
629 targetEventType = wsiEvent.eventType;
633 targetWindow = wsiEvent.targetWindow;
634 localPosition = wsiEvent.localPosition;
635 targetEventType = wsiEvent.eventType;
638 m_lastWsiMouseEvent = wsiEvent;
640 if (targetEventType == QEvent::None) {
641 qOhosPrintfDebug(
"%s: targetEventType is QEvent::None!", Q_FUNC_INFO);
645 const auto *mouseDevice =
646 static_cast<
const QPointingDevice *>(getPointingDeviceOrCreate(wsiEvent.deviceType));
648 QWindowSystemInterface::handleMouseEvent(
650 wsiEvent.timestampMs.count(),
653 wsiEvent.globalPosition,
657 convertOhosToQtKeyboardModifiers(wsiEvent.modifiers));
662 if (touchEvent.touchPoints.isEmpty()) {
663 qOhosCritical(QtForOhos) <<
"TouchPoints list is empty, nothing to do";
667 m_lastWsiMouseEvent.reset();
669 bool anyEventPressedOrReleased =
671 touchEvent.touchPoints.begin(),
672 touchEvent.touchPoints.end(),
673 [](
const QWindowSystemInterface::TouchPoint &touchPoint) {
674 return touchPoint.state == QEventPoint::State::Pressed || touchPoint.state == QEventPoint::State::Released;
676 if (anyEventPressedOrReleased) {
678 if (ohosInputContext !=
nullptr)
679 ohosInputContext->setLastInputTypeToTriggerSoftKeyboard(QOhosInputContext::RequestKeyboardReason::TOUCH);
682 updateWindowsUnderTouchPoints(touchEvent);
684 m_lastWsiTouchEvent = touchEvent;
685 QWindowSystemInterface::handleTouchEvent(
686 touchEvent.targetWindow, touchEvent.timestampMs.count(),
687 static_cast<
const QPointingDevice *>(touchEvent.touchDevice), touchEvent.touchPoints,
688 convertOhosToQtKeyboardModifiers(touchEvent.modifiers));
693 const auto &touchPoints = touchEvent.touchPoints;
694 auto *targetWindow = touchEvent.targetWindow;
696 const bool allTouchPointsUp =
std::all_of(
697 touchPoints.begin(), touchPoints.end(),
698 [](
const auto &touchPointData) {
699 return touchPointData.state == QEventPoint::State::Released;
702 const bool anyTouchPointDown =
std::any_of(
703 touchPoints.begin(), touchPoints.end(),
704 [](
const auto &touchPointData) {
705 return touchPointData.state == QEventPoint::State::Pressed;
708 if (allTouchPointsUp) {
709 std::ignore = m_windowsUnderTouchPoints.erase(targetWindow);
710 }
else if (anyTouchPointDown) {
711 auto lastTouchedPair = getLastTouchedWindowWithSeqNoIfPresent();
712 auto nextSeqNo = lastTouchedPair.has_value()
713 ? lastTouchedPair.value().second + 1
715 m_windowsUnderTouchPoints[targetWindow] = std::make_pair(
716 registerObjectDestroyedSignalHandler(
718 [
this, targetWindow]() {
719 std::ignore = m_windowsUnderTouchPoints.erase(targetWindow);
727 auto *eventView = QOhosPlatformWindow::fromQWindow(window)->ownedViewOrNull();
728 if (eventView !=
nullptr) {
729 m_lastMouseEventViewLifetimeTrackerHandle = registerObjectDestroyedSignalHandler(
732 m_mouseButtonsState = Qt::NoButton;
QRectF calculateTouchPointArea(const QPointF &clickPoint)
QPoint determineScreenGlobalDisplayOffset(QWindow *qWindow)
QPoint makeWindowLocalPosition(const QPoint &globalPosition, QWindow *qWindow)
QInputDevice * registerPointingDevice(std::unique_ptr< QPointingDevice > device)
QPointF calculateTouchPointNormalPosition(QWindow *targetWindow, const QPointF &clickPoint)
constexpr double fingerAreaWidth
std::shared_ptr< void > registerObjectDestroyedSignalHandler(QObject *object, QObject *context, std::function< void()> signalHandler)
QOhosOptional< QEventPoint::State > tryMapXComponentTouchEventTypeToQt(::OH_NativeXComponent_TouchEventType eventType)
QInputDevice * createPointingDevice(QInputDevice::DeviceType deviceType)
constexpr double fingerAreaHeight
std::nullopt_t makeEmptyQOhosOptional()