Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qohosinputmethodeventhandler.cpp
Go to the documentation of this file.
1// Copyright (C) 2025 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
6#include "qohosjsmain.h"
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>
13#include <QtMath>
14#include <algorithm>
15#include <arkui/ui_input_event.h>
16#include <chrono>
17#include <render/qohosview.h>
18#include <typeinfo>
19
20using namespace Qt::Literals::StringLiterals;
21
22namespace ch = std::chrono;
23
24QT_BEGIN_NAMESPACE
25
26namespace {
27
28constexpr double fingerAreaWidth = 50.0;
29constexpr double fingerAreaHeight = 50.0;
30
31QInputDevice *createTouchDevice(QInputDevice::DeviceType deviceType)
32{
33 qOhosDebug(QtForOhos) << "Creating touchDevice!";
34 auto touchDevice =
35 std::make_unique<QPointingDevice>("OHOS touch device"_L1, 1,
36 deviceType, QPointingDevice::PointerType::Finger,
37 QInputDevice::Capability::Position
38 | QInputDevice::Capability::Area
39 | QInputDevice::Capability::Pressure
40 | QInputDevice::Capability::NormalizedPosition,
41 10, 0);
42
43 auto *touchDeviceRaw = touchDevice.get();
44 QWindowSystemInterface::registerInputDevice(touchDevice.release());
45 return touchDeviceRaw;
46}
47
49 QObject *object, QObject *context, std::function<void()> signalHandler)
50{
51 auto objDestroyedConnection = QObject::connect(object, &QObject::destroyed, context, std::move(signalHandler));
52 return QtOhos::makeDestroyNotifier(
53 [objDestroyedConnection = std::move(objDestroyedConnection)] () mutable {
54 QObject::disconnect(objDestroyedConnection);
55 });
56}
57
58QOhosOptional<QEventPoint::State> tryMapXComponentTouchEventTypeToQt(::OH_NativeXComponent_TouchEventType eventType)
59{
60 switch (eventType) {
61 case OH_NATIVEXCOMPONENT_DOWN:
62 return makeQOhosOptional(QEventPoint::State::Pressed);
63 case OH_NATIVEXCOMPONENT_UP:
64 return makeQOhosOptional(QEventPoint::State::Released);
65 case OH_NATIVEXCOMPONENT_MOVE:
66 return makeQOhosOptional(QEventPoint::State::Updated);
67 case OH_NATIVEXCOMPONENT_CANCEL:
68 case OH_NATIVEXCOMPONENT_UNKNOWN:
69 break;
70 }
72}
73
74QPointF calculateTouchPointNormalPosition(QWindow *targetWindow, const QPointF &clickPoint)
75{
76 auto *platformScreen = static_cast<QOhosPlatformScreen *>(targetWindow->screen()->handle());
77
78 QSize screenSizeScaled = QHighDpi::fromNative(
79 platformScreen->geometry().size(),
80 platformScreen->pixelScalingCoefficient());
81
82 QPointF clickPointNormalized(
83 clickPoint.x() / screenSizeScaled.width(),
84 clickPoint.y() / screenSizeScaled.height());
85
86 return clickPointNormalized;
87}
88
89QRectF calculateTouchPointArea(const QPointF &clickPoint)
90{
91 return QRectF(
92 clickPoint.x() - static_cast<double>(fingerAreaWidth/2),
93 clickPoint.y() - static_cast<double>(fingerAreaHeight/2),
96}
97
98}
99
100QOhosInputMethodEventHandler::QOhosInputMethodEventHandler(
101 const std::set<QInputDevice::DeviceType> &deviceTypes)
102{
103 for (const auto &deviceType : deviceTypes)
104 m_touchDevices.emplace(deviceType, createTouchDevice(deviceType));
105}
106
108
110 QWindow *targetWindow, ch::nanoseconds timeStamp,
111 const std::vector<QOhosTouchEventTouchPointData> &touchPoints,
112 QInputDevice::DeviceType deviceType)
113{
114 auto *touchDevice = getTouchDeviceOrCreateIfNeeded(deviceType);
115
116 QList<QWindowSystemInterface::TouchPoint> wsiTouchPoints;
117
118 for (const auto &touchPointData : touchPoints) {
119 const auto &touchPoint = touchPointData.touchPoint;
120 QEventPoint::State state =
121 tryMapXComponentTouchEventTypeToQt(touchPoint.type)
122 .valueOr(QEventPoint::State::Stationary);
123
124 QPointF clickPoint = touchPointData.displayPosition;
125
126 QWindowSystemInterface::TouchPoint qwsiTouchPoint;
127 qwsiTouchPoint.id = touchPoint.id;
128 qwsiTouchPoint.pressure = touchPoint.force;
129 qwsiTouchPoint.normalPosition =
130 calculateTouchPointNormalPosition(targetWindow, clickPoint);
131 qwsiTouchPoint.state = state;
132 qwsiTouchPoint.area = calculateTouchPointArea(clickPoint);
133 wsiTouchPoints.push_back(qwsiTouchPoint);
134 }
135
136 QWindowSystemInterfaceTouchEvent touchEvent = {
137 .targetWindow = targetWindow,
138 .touchPoints = wsiTouchPoints,
139 .touchDevice = touchDevice,
140 .timestampMs = ch::duration_cast<ch::milliseconds>(timeStamp),
141 };
142
143 handleTouchEvent(touchEvent);
144}
145
147 QWindow *targetWindow, std::int64_t timestamp, qreal value, QPointF localPosition,
148 QPointF screenPosition, Qt::NativeGestureType gestureType,
149 QInputDevice::DeviceType deviceType)
150{
151 auto *touchDevice = getTouchDeviceOrCreateIfNeeded(deviceType);
152
153 QWindowSystemInterface::handleGestureEventWithRealValue(
154 targetWindow, timestamp, static_cast<const QPointingDevice *>(touchDevice), gestureType, value, localPosition, screenPosition);
155}
156
157void QOhosInputMethodEventHandler::onKeyEvent(const QOhosKeyEvent &keyEvent, QWindow *targetWindow)
158{
159 const auto optQOhosQtKeyEvent = keyEvent.tryConvertToQOhosQtKeyEvent();
160 if (!optQOhosQtKeyEvent.hasValue())
161 return;
162 const auto qOhosQtKeyEvent = optQOhosQtKeyEvent.value();
163
164 constexpr quint32 nativeScanCode = 0;
165 constexpr quint32 nativeModifiers = 0;
166
167 auto *ohosInputContext = qobject_cast<QOhosInputContext *>(QOhosPlatformIntegration::instance()->inputContext());
168 if (ohosInputContext != nullptr)
169 ohosInputContext->setLastInputTypeToTriggerSoftKeyboard(QOhosInputContext::RequestKeyboardReason::NONE);
170
171 if (qOhosQtKeyEvent.keyAction == QEvent::KeyPress) {
172 if (m_autoRepeatCountMap[qOhosQtKeyEvent.keyCode] < std::numeric_limits<ushort>::max()) {
173 ++m_autoRepeatCountMap[qOhosQtKeyEvent.keyCode];
174 }
175 } else {
176 m_autoRepeatCountMap.remove(qOhosQtKeyEvent.keyCode);
177 }
178 const auto count = m_autoRepeatCountMap.value(qOhosQtKeyEvent.keyCode, 1);
179
180 QWindowSystemInterface::handleExtendedKeyEvent(
181 !m_currentKeyboardGrabbingWindow.isNull()
182 ? m_currentKeyboardGrabbingWindow.data()
183 : targetWindow,
184 qOhosQtKeyEvent.keyAction, qOhosQtKeyEvent.keyCode,
185 qOhosQtKeyEvent.guiApplicationKeyboardModifiers, nativeScanCode,
186 qOhosQtKeyEvent.nativeKeyCode, nativeModifiers, qOhosQtKeyEvent.keyText, count > 1, count);
187}
188
190{
191 Qt::MouseButton button = Qt::NoButton;
192
193 if (mouseEvent.eventType == QEvent::MouseButtonPress || mouseEvent.eventType == QEvent::MouseButtonRelease) {
194 button = mouseEvent.button;
195
196 // HACK
197 // Destructing QOhosView means loosing QNativeNode, JsStateData and QXComponentCallbackReceiver.
198 // It means no more events will come from the destroyed window.
199 // There is a case when closing window was done via mouse double-click event and second release
200 // button event is not caught due to QNativeNode destruction. It causes issues in
201 // QOhosInputMethodEventHandler state machine after switching to different window.
202 // This workaround allows to clear buttons state.
203 registerOnWindowCloseToResetMouseButtonsState(mouseEvent.targetWindow);
204 }
205
206 QOhosMouseEvent wsiEvent {
207 .targetWindow = mouseEvent.targetWindow,
208 .timestampMs = mouseEvent.timestampMs,
209 .localPosition = mouseEvent.localPosition,
210 .globalPosition = mouseEvent.globalPosition,
211 .button = button,
212 .eventType = mouseEvent.eventType,
213 .modifiers = mouseEvent.modifiers,
214 };
215
216 handleMouseEvent(wsiEvent);
217}
218
219void QOhosInputMethodEventHandler::onHoverEvent(bool isHover, const QPointF &local, const QPointF &global, QWindow *window)
220{
221 if (!m_currentMouseGrabbingWindow.isNull() && m_currentMouseGrabbingWindow != window)
222 return;
223
224 if (isHover)
225 QWindowSystemInterface::handleEnterEvent(window, local, global);
226 else
227 QWindowSystemInterface::handleLeaveEvent(window);
228}
229
231{
232 constexpr int angleXMin = -120;
233 constexpr int angleXMax = 120;
234 constexpr int xAxisValueMultiplier = -10;
235
236 constexpr int angleYMin = angleXMin;
237 constexpr int angleYMax = angleXMax;
238 constexpr int yAxisValueMultiplier = xAxisValueMultiplier;
239
240 constexpr double wheelStepDegree = 15.0;
241 constexpr double wheelStepPixel = 21.0;
242
243 constexpr double angleBaseValue = 8.0;
244 constexpr double directionMultiplier = -1.0;
245
246 QPoint pixelDelta;
247 QPoint angleDelta;
248
249 if (event.axisAction != UI_AXIS_EVENT_ACTION_UPDATE)
250 return;
251
252 static_cast<QOhosPlatformTheme *>(QGuiApplicationPrivate::platformTheme())->setWheelScrollLines(
253 static_cast<int>(event.wheelScrollLines));
254
255 auto *platformScreen = static_cast<QOhosPlatformScreen *>(window->screen()->handle());
256
257 if (event.eventToolType == UI_INPUT_EVENT_TOOL_TYPE_MOUSE) {
258 angleDelta.setX(qBound(angleXMin, static_cast<int>(event.horizontalValue * xAxisValueMultiplier), angleXMax));
259 angleDelta.setY(qBound(angleYMin, static_cast<int>(event.verticalValue * yAxisValueMultiplier), angleYMax));
260
261 auto mousePixelDeltaMultiplier = wheelStepPixel / wheelStepDegree / angleBaseValue;
262 pixelDelta.setX(
263 qRound(qFabs(angleDelta.x() * mousePixelDeltaMultiplier) * platformScreen->pixelScalingCoefficient()));
264 pixelDelta.setY(
265 qRound(qFabs(angleDelta.y() * mousePixelDeltaMultiplier) * platformScreen->pixelScalingCoefficient()));
266 } else if (event.eventToolType == UI_INPUT_EVENT_TOOL_TYPE_TOUCHPAD) {
267 auto touchpadAngleDeltaMultiplier =
268 wheelStepDegree / wheelStepPixel / platformScreen->pixelScalingCoefficient() * angleBaseValue * directionMultiplier / event.wheelScrollLines;
269 angleDelta.setX(qRound(event.horizontalValue * touchpadAngleDeltaMultiplier));
270 angleDelta.setY(qRound(event.verticalValue * touchpadAngleDeltaMultiplier));
271
272 pixelDelta.setX(qRound(qFabs(event.horizontalValue)));
273 pixelDelta.setY(qRound(qFabs(event.verticalValue)));
274 } else {
275 qOhosWarning(QtForOhos)
276 << Q_FUNC_INFO
277 << "Received unsupported input event tool type =" << event.eventToolType << "skipping...";
278 return;
279 }
280
281 Qt::MouseEventSource source = event.eventToolType == ::UI_INPUT_EVENT_TOOL_TYPE_TOUCHPAD
282 ? Qt::MouseEventSynthesizedBySystem
283 : Qt::MouseEventNotSynthesized;
284 bool inverted = false;
285
286 QWindowSystemInterface::handleWheelEvent(
287 window,
288 event.timestamp,
289 event.localPoint,
290 event.globalPoint,
291 pixelDelta,
292 angleDelta,
293 convertOhosToQtKeyboardModifiers(event.modifiers),
294 Qt::NoScrollPhase,
295 source,
296 inverted);
297}
298
300 QWindow *targetWindow, std::vector<QOhosWindowProxy::NonClientAreaMouseEvent> eventBatch)
301{
302 using NonClientAreaMouseEvent = QOhosWindowProxy::NonClientAreaMouseEvent;
303
304 eventBatch.erase(
305 QtOhos::removeMatchingWithLookahead(
306 eventBatch.begin(), eventBatch.end(),
307 [](const NonClientAreaMouseEvent &event, const NonClientAreaMouseEvent &nextEvent) {
308 return event.action == QEvent::NonClientAreaMouseMove
309 && nextEvent.action == QEvent::NonClientAreaMouseMove;
310 }),
311 eventBatch.end());
312
313 for (const auto &mouseEvent : eventBatch) {
314 QOhosMouseEvent qtMouseEvent = {
315 .targetWindow = targetWindow,
316 .timestampMs = mouseEvent.timestamp,
317 .localPosition = mouseEvent.localPosition,
318 .globalPosition = mouseEvent.displayPosition,
319 .button = mouseEvent.button,
320 .eventType = mouseEvent.action,
321 };
322
323 // HACK
324 // When a window is being closed by clicking close button on title bar we should receive two events:
325 // NonClientAreaMouseButtonPress and NonClientAreaMouseButtonRelease, but sometimes we receive only
326 // NonClientAreaMouseButtonPress event without NonClientAreaMouseButtonRelease, because the window
327 // sending this event is alredy destroyed. It leaves us with invalid mouse state with a button
328 // that has not been released.
329 // This workaround resets mouse buttons state when a window is closed.
330 if (mouseEvent.action == QEvent::NonClientAreaMouseButtonPress)
331 registerOnWindowCloseToResetMouseButtonsState(targetWindow);
332
333 handleMouseEvent(qtMouseEvent);
334 }
335}
336
338 QWindow *targetWindow, std::vector<QOhosWindowProxy::NonClientAreaTouchEvent> eventBatch)
339{
340 using NonClientAreaTouchEvent = QOhosWindowProxy::NonClientAreaTouchEvent;
341
342 eventBatch.erase(
343 QtOhos::removeMatchingWithLookahead(
344 eventBatch.begin(), eventBatch.end(),
345 [](const NonClientAreaTouchEvent &event, const NonClientAreaTouchEvent &nextEvent) {
346 return
347 event.state == QEventPoint::State::Updated
348 && nextEvent.state == QEventPoint::State::Updated;
349 }),
350 eventBatch.end());
351
352 for (const auto &touchEvent : eventBatch) {
353 QPointF clickPoint = touchEvent.displayPosition;
354
355 QWindowSystemInterface::TouchPoint qwsiTouchPoint;
356 qwsiTouchPoint.id = touchEvent.id;
357 qwsiTouchPoint.pressure = 1.0;
358 qwsiTouchPoint.normalPosition = calculateTouchPointNormalPosition(targetWindow, clickPoint);
359 qwsiTouchPoint.state = touchEvent.state;
360 qwsiTouchPoint.area = calculateTouchPointArea(clickPoint);
361
362 QWindowSystemInterfaceTouchEvent qwsiTouchEvent = {
363 .targetWindow = targetWindow,
364 .touchPoints = {qwsiTouchPoint},
365 .touchDevice = getTouchDeviceOrCreateIfNeeded(QInputDevice::DeviceType::TouchScreen),
366 .timestampMs = touchEvent.timestamp,
367 };
368
369 handleTouchEvent(qwsiTouchEvent);
370 }
371}
372
374{
375 auto lastTouchedPair = getLastTouchedWindowWithSeqNoIfPresent();
376 return lastTouchedPair.hasValue()
377 ? lastTouchedPair.value().first
378 : nullptr;
379}
380
381QInputDevice *QOhosInputMethodEventHandler::getTouchDeviceOrCreateIfNeeded(QInputDevice::DeviceType deviceType)
382{
383 auto touchDeviceIter = m_touchDevices.find(deviceType);
384 if (touchDeviceIter == m_touchDevices.end()) {
385 qOhosWarning(QtForOhos) << "Trying to get touch device but it isn't registered. Creating and registering one now.";
386 std::tie(touchDeviceIter, std::ignore) = m_touchDevices.emplace(
387 deviceType, createTouchDevice(deviceType));
388 }
389 return touchDeviceIter->second;
390}
391
392QOhosOptional<std::pair<QWindow *, std::uint64_t>> QOhosInputMethodEventHandler::getLastTouchedWindowWithSeqNoIfPresent() const
393{
394 auto maxSeqNoEntryIter = std::max_element(
395 m_windowsUnderTouchPoints.begin(), m_windowsUnderTouchPoints.end(),
396 [](const auto &a, const auto &b) {
397 return a.second.second < b.second.second;
398 });
399
400 return maxSeqNoEntryIter != m_windowsUnderTouchPoints.end()
401 ? makeQOhosOptional(
402 std::make_pair(maxSeqNoEntryIter->first, maxSeqNoEntryIter->second.second))
403 : makeEmptyQOhosOptional();
404}
405
407{
408 qCDebug(QtForOhos) << Q_FUNC_INFO << "window:" << window;
409 m_currentMouseGrabbingWindow = window;
410}
411
413{
414 qCDebug(QtForOhos) << Q_FUNC_INFO << "window:" << window;
415 m_currentKeyboardGrabbingWindow = window;
416}
417
419{
420 if (!m_currentMouseGrabbingWindow.isNull() && m_lastWsiMouseEvent.hasValue()) {
421 auto lastWsiMouseEventValue = m_lastWsiMouseEvent.value();
422 auto *previousCaptureWindow = m_currentMouseGrabbingWindow.data();
423 auto *optLastWindowUnderCursor = lastWsiMouseEventValue.targetWindow.data();
424 auto *optCurrentWindowUnderCursor = qGuiApp->topLevelAt(
425 QHighDpi::fromNativePixels(
426 lastWsiMouseEventValue.globalPosition.toPoint(),
427 lastWsiMouseEventValue.targetWindow.data()));
428
429 if (optLastWindowUnderCursor != nullptr
430 && optCurrentWindowUnderCursor != nullptr
431 && optLastWindowUnderCursor != previousCaptureWindow) {
432 QWindowSystemInterface::handleEnterEvent(
433 optLastWindowUnderCursor, lastWsiMouseEventValue.localPosition,
434 lastWsiMouseEventValue.globalPosition);
435 }
436 }
437 m_currentMouseGrabbingWindow.clear();
438}
439
441{
442 m_currentKeyboardGrabbingWindow.clear();
443}
444
445void QOhosInputMethodEventHandler::handleMouseEvent(const QOhosMouseEvent &wsiEvent)
446{
447 static const QSet<QEvent::Type> mouseButtonPressEventTypes = {
448 QEvent::MouseButtonPress,
449 QEvent::NonClientAreaMouseButtonPress,
450 };
451 static const QSet<QEvent::Type> mouseButtonReleaseEventTypes = {
452 QEvent::MouseButtonRelease,
453 QEvent::NonClientAreaMouseButtonRelease,
454 };
455
456 bool eventTypeIsPress = mouseButtonPressEventTypes.contains(wsiEvent.eventType);
457 bool eventTypeIsRelease = mouseButtonReleaseEventTypes.contains(wsiEvent.eventType);
458
459 if (eventTypeIsPress || eventTypeIsRelease) {
460 m_mouseButtonsState.setFlag(wsiEvent.button, eventTypeIsPress);
461 auto *ohosInputContext = qobject_cast<QOhosInputContext *>(QOhosPlatformIntegration::instance()->inputContext());
462 if (ohosInputContext != nullptr)
463 ohosInputContext->setLastInputTypeToTriggerSoftKeyboard(QOhosInputContext::RequestKeyboardReason::MOUSE);
464 }
465
466 QEvent::Type targetEventType;
467 QWindow *targetWindow;
468 QPointF localPosition;
469 if (!m_currentMouseGrabbingWindow.isNull()) {
470 targetWindow = m_currentMouseGrabbingWindow;
471 localPosition =
472 QHighDpi::toNativeLocalPosition(
473 targetWindow->mapFromGlobal(
474 wsiEvent.targetWindow->mapToGlobal(
475 QHighDpi::fromNativePixels(
476 wsiEvent.localPosition.toPoint(), wsiEvent.targetWindow.data()))),
477 targetWindow);
478 switch (wsiEvent.eventType) {
479 case QEvent::NonClientAreaMouseButtonRelease:
480 targetEventType = QEvent::MouseButtonRelease;
481 break;
482 case QEvent::NonClientAreaMouseButtonPress:
483 targetEventType = QEvent::MouseButtonPress;
484 break;
485 case QEvent::NonClientAreaMouseMove:
486 targetEventType = QEvent::MouseMove;
487 break;
488 default:
489 targetEventType = wsiEvent.eventType;
490 break;
491 }
492 } else {
493 targetWindow = wsiEvent.targetWindow;
494 localPosition = wsiEvent.localPosition;
495 targetEventType = wsiEvent.eventType;
496 }
497
498 m_lastWsiMouseEvent = wsiEvent;
499
500 if (targetEventType == QEvent::None) {
501 qOhosPrintfDebug("%s: targetEventType is QEvent::None!", Q_FUNC_INFO);
502 return;
503 }
504
505 QWindowSystemInterface::handleMouseEvent(
506 targetWindow,
507 wsiEvent.timestampMs.count(),
508 localPosition,
509 wsiEvent.globalPosition,
510 m_mouseButtonsState,
511 wsiEvent.button,
512 targetEventType,
513 convertOhosToQtKeyboardModifiers(wsiEvent.modifiers));
514}
515
516void QOhosInputMethodEventHandler::handleTouchEvent(const QWindowSystemInterfaceTouchEvent &touchEvent)
517{
518 if (touchEvent.touchPoints.isEmpty()) {
519 qOhosCritical(QtForOhos) << "TouchPoints list is empty, nothing to do";
520 return;
521 }
522
523 m_lastWsiMouseEvent.reset();
524
525 bool anyEventPressedOrReleased =
526 std::any_of(
527 touchEvent.touchPoints.begin(),
528 touchEvent.touchPoints.end(),
529 [](const QWindowSystemInterface::TouchPoint &touchPoint) {
530 return touchPoint.state == QEventPoint::State::Pressed || touchPoint.state == QEventPoint::State::Released;
531 });
532 if (anyEventPressedOrReleased) {
533 auto *ohosInputContext = qobject_cast<QOhosInputContext *>(QOhosPlatformIntegration::instance()->inputContext());
534 if (ohosInputContext != nullptr)
535 ohosInputContext->setLastInputTypeToTriggerSoftKeyboard(QOhosInputContext::RequestKeyboardReason::TOUCH);
536 }
537
538 updateWindowsUnderTouchPoints(touchEvent);
539
540 QWindowSystemInterface::handleTouchEvent(
541 touchEvent.targetWindow, touchEvent.timestampMs.count(),
542 static_cast<const QPointingDevice *>(touchEvent.touchDevice), touchEvent.touchPoints);
543}
544
545void QOhosInputMethodEventHandler::updateWindowsUnderTouchPoints(const QWindowSystemInterfaceTouchEvent &touchEvent)
546{
547 const auto &touchPoints = touchEvent.touchPoints;
548 auto *targetWindow = touchEvent.targetWindow;
549
550 const bool allTouchPointsUp = std::all_of(
551 touchPoints.begin(), touchPoints.end(),
552 [](const auto &touchPointData) {
553 return touchPointData.state == QEventPoint::State::Released;
554 });
555
556 const bool anyTouchPointDown = std::any_of(
557 touchPoints.begin(), touchPoints.end(),
558 [](const auto &touchPointData) {
559 return touchPointData.state == QEventPoint::State::Pressed;
560 });
561
562 if (allTouchPointsUp) {
563 std::ignore = m_windowsUnderTouchPoints.erase(targetWindow);
564 } else if (anyTouchPointDown) {
565 auto lastTouchedPair = getLastTouchedWindowWithSeqNoIfPresent();
566 auto nextSeqNo = lastTouchedPair.hasValue()
567 ? lastTouchedPair.value().second + 1
568 : 0;
569 m_windowsUnderTouchPoints[targetWindow] = std::make_pair(
570 registerObjectDestroyedSignalHandler(
571 targetWindow, this,
572 [this, targetWindow]() {
573 std::ignore = m_windowsUnderTouchPoints.erase(targetWindow);
574 }),
575 nextSeqNo);
576 }
577}
578
579void QOhosInputMethodEventHandler::registerOnWindowCloseToResetMouseButtonsState(QWindow *window)
580{
581 auto *eventView = QOhosPlatformWindow::fromQWindow(window)->ownedViewOrNull();
582 if (eventView != nullptr) {
583 m_lastMouseEventViewLifetimeTrackerHandle = registerObjectDestroyedSignalHandler(
584 eventView, this,
585 [this]() {
586 m_mouseButtonsState = Qt::NoButton;
587 });
588 }
589}
590
591QT_END_NAMESPACE
void onMouseWheelEvent(const QOhosWheelEvent &event, QWindow *window)
void onNonClientAreaTouchEvents(QWindow *targetWindow, std::vector< QOhosWindowProxy::NonClientAreaTouchEvent > eventBatch)
void onGestureEventFromNativeNode(QWindow *targetWindow, std::int64_t timestamp, qreal value, QPointF localPosition, QPointF screenPosition, Qt::NativeGestureType gestureType, QInputDevice::DeviceType deviceType)
void onMouseEvent(const QOhosMouseEvent &mouseEvent)
void onTouchEventFromXComponent(QWindow *targetWindow, std::chrono::nanoseconds timeStamp, const std::vector< QOhosTouchEventTouchPointData > &touchPoints, QInputDevice::DeviceType deviceType)
void onHoverEvent(bool isHover, const QPointF &local, const QPointF &global, QWindow *window)
void onNonClientAreaMouseEvents(QWindow *targetWindow, std::vector< QOhosWindowProxy::NonClientAreaMouseEvent > eventBatch)
void onKeyEvent(const QOhosKeyEvent &keyEvent, QWindow *targetWindow)
virtual QOhosOptional< QOhosQtKeyEvent > tryConvertToQOhosQtKeyEvent() const =0
static QOhosPlatformIntegration * instance()
QRectF calculateTouchPointArea(const QPointF &clickPoint)
QPointF calculateTouchPointNormalPosition(QWindow *targetWindow, const QPointF &clickPoint)
QInputDevice * createTouchDevice(QInputDevice::DeviceType deviceType)
std::shared_ptr< void > registerObjectDestroyedSignalHandler(QObject *object, QObject *context, std::function< void()> signalHandler)
QOhosOptional< QEventPoint::State > tryMapXComponentTouchEventTypeToQt(::OH_NativeXComponent_TouchEventType eventType)
QOhosOptional< void > makeEmptyQOhosOptional()