131 auto qWindow = QPointer<QWindow>(nativeNodeCreateInfo.window);
132 auto selfRef = QtOhos::makeQThreadSafeRef(
this);
133 auto windowId = QOhosPlatformWindow::fromQWindow(qWindow)->internalWindowId();
135 auto platformWindowFlags = QOhosPlatformWindow::platformWindowFlagsForQWindow(qWindow);
136 bool focusable = !platformWindowFlags.testFlag(Qt::WindowDoesNotAcceptFocus);
138 auto renderFit = qAndThen(
139 nativeNodeCreateInfo.renderFitPolicyHint, tryMapRenderFitPolicyToArkUi)
140 .value_or(::ARKUI_RENDER_FIT_TOP_LEFT);
143 qGuiApp, &QGuiApplication::focusWindowChanged,
144 this, [
this, qWindow](QWindow *focusedWindow) {
145 if (focusedWindow == qWindow)
149 auto qWindowRef = QtOhos::makeQThreadSafeRef(qWindow.data());
153 if (inputMethodEventHandler ==
nullptr)
154 qOhosReportFatalErrorAndAbort(
"QOhosInputMethodEventHandler is null!");
155 auto imEventHandlerRef = QtOhos::makeQThreadSafeRef(inputMethodEventHandler);
158 m_jsStateData = QtOhos::makeProxyWithJsThreadDeleter(std::make_shared<JsStateData>());
162 QOhosOptional<ParentDescriptor> optParentDescriptor;
163 if (nativeNodeCreateInfo.optParent.has_value()) {
164 auto *parentNode = nativeNodeCreateInfo.optParent.value()->m_jsStateData->embeddedWindow.get();
165 optParentDescriptor = ParentDescriptor(*parentNode);
169 .offset = nativeNodeCreateInfo.geometry.topLeft(),
170 .size = nativeNodeCreateInfo.geometry.size(),
171 .xComponentId = QXComponentId::createForRenderXComponent(windowId),
172 .xComponentType = ::ArkUI_XComponentType::ARKUI_XCOMPONENT_TYPE_SURFACE,
173 .focusOnTouch =
false,
174 .focusable = focusable,
175 .optParent = optParentDescriptor,
176 .sizePolicy = QArkUi::QEmbeddedWindowNode::SizePolicy::Points,
177 .renderFit = renderFit,
178 .backgroundColor = nativeNodeCreateInfo.backgroundColor,
181 m_jsStateData->embeddedWindow = QArkUi::QQtEmbeddedWindowNode::createOrFail(createInfo);
182 m_jsStateData->embeddedWindow->setCallbackReceiver(
183 std::make_unique<CallbackReceiver>(
184 m_jsStateData->embeddedWindow->renderXComponent(),
185 qWindowRef, imEventHandlerRef,
186 [selfRef](SurfaceEventType type, ::OHNativeWindow *window, QOhosOptional<QSize> optSurfaceSize) {
187 selfRef.visitInQtThreadIfAlive(
188 [type, window, optSurfaceSize](
auto &self) {
189 self.handleSurfaceEvent(type, window, optSurfaceSize);
193 m_jsStateData->embeddedWindow->setTouchInterceptReceiver(
194 [selfRef, embeddedWindow = m_jsStateData->embeddedWindow.get()](
const ::ArkUI_UIInputEvent *event) {
195 auto eventAction = ::OH_ArkUI_UIInputEvent_GetAction(event);
197 if (eventAction != ::UI_MOUSE_EVENT_ACTION_PRESS && eventAction != ::UI_TOUCH_EVENT_ACTION_DOWN)
200 if (!embeddedWindow->hasNonQtManagedChildren())
203 selfRef.visitInQtThreadIfAlive(
204 [](QNativeNode &node) {
205 Q_EMIT node.externalContentClickDetected();
209 auto sharedAxisEventHandler = QtOhos::moveToSharedPtr(
210 makeQOhosNativeAxisEventHandler(qWindowRef, imEventHandlerRef));
211 m_jsStateData->embeddedWindow->setAxisEventsHandler(
212 [sharedAxisEventHandler](
auto *event) {
213 (*sharedAxisEventHandler)(QOhosAxisEventType::AxisEvent, event);
216 m_jsStateData->embeddedWindow->setCoastingAxisEventsHandler(
217 [sharedAxisEventHandler](
auto *event) {
218 (*sharedAxisEventHandler)(QOhosAxisEventType::CoastingAxisEvent, event);
220 m_jsStateData->embeddedWindow->setGesturesHandler(
221 makeQOhosArkUiNativeGesturesHandler(qWindowRef));
222 m_jsStateData->embeddedWindow->setDragEventsHandler(makeQOhosNativeDragEventsHandler(qWindowRef));
223 if (QtOhos::isNativeNodeApiKeyEventsEnabled())
224 m_jsStateData->embeddedWindow->setKeyEventsHandler(makeQOhosNativeKeyEventsHandler(qWindowRef, imEventHandlerRef));
226 auto hoverEventsGenerator = makeQOhosHoverEventsGenerator(qWindowRef, imEventHandlerRef);
227 m_jsStateData->embeddedWindow->setMouseEventsHandler(
228 makeQOhosNativeMouseEventsHandler(qWindowRef, imEventHandlerRef, hoverEventsGenerator));
229 m_jsStateData->embeddedWindow->setHoverEventsHandler(
230 [hoverEventsGenerator](QArkUi::NativeNodeHoverEvent hoverEvent) {
231 hoverEventsGenerator->handleQOhosHoverEvent(hoverEvent.isHovered);
430 const std::vector<QImage> &images,
const QPointF &hotspot,
431 const QMimeData &mimeData, QOhosConsumer<Qt::DropAction> dropActionConsumer)
433 auto udmfDataFactory = makeUdmfDataFactoryFromQMimeData(mimeData, {});
437 qOhosPrintfDebug(
"%s: starting drag", Q_FUNC_INFO);
439 std::vector<std::shared_ptr<::OH_PixelmapNative>> pixelMaps;
441 images.begin(), images.end(),
std::back_inserter(pixelMaps),
442 &createNativePixelMapFromQImage);
446 QOhosConsumer<Qt::DropAction> dropActionConsumer;
447 std::shared_ptr<
void> startedDragHandle;
449 auto context =
std::make_shared<DragContext>();
450 context->dropActionConsumer =
std::move(dropActionConsumer);
452 auto startedDragHandle = m_jsStateData->embeddedWindow->startDrag(
453 std::move(pixelMaps), hotspot,
455 [context](::ArkUI_DragAndDropInfo *dragAndDropInfo)
mutable {
456 auto dragStatus = QArkUi::callArkUi(
457 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragAndDropInfo_GetDragStatus),
459 qOhosPrintfDebug(
"%s: drag status: %d", Q_FUNC_INFO,
static_cast<
int>(dragStatus));
461 if (dragStatus == ::ARKUI_DRAG_STATUS_ENDED && context) {
462 auto *dragEvent = QArkUi::callArkUiOrFailOnNullResult(
463 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragAndDropInfo_GetDragEvent),
466 ::ArkUI_DragResult dragResult = ::ARKUI_DRAG_RESULT_FAILED;
467 QArkUi::callArkUiOrFailOnErrorResult(
468 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragEvent_GetDragResult),
469 dragEvent, &dragResult);
472 dragResult == ::ARKUI_DRAG_RESULT_SUCCESSFUL
473 ? mapQOhosArkUiDropOperationToQt(
474 getQOhosDragEventDropOperation(dragEvent))
478 "%s: sending drag-end notification: %d / %d",
479 Q_FUNC_INFO,
static_cast<
int>(dragResult),
static_cast<
int>(qtDropAction));
480 QtOhos::invokeInQtThread(
481 [dropActionConsumer = std::move(context->dropActionConsumer), qtDropAction]() {
482 dropActionConsumer(qtDropAction);
487 context->startedDragHandle = startedDragHandle;