118 auto qWindow = QPointer<QWindow>(nativeNodeCreateInfo.window);
119 auto selfRef = QtOhos::makeQThreadSafeRef(
this);
120 auto windowId = QOhosPlatformWindow::fromQWindow(qWindow)->internalWindowId();
122 auto platformWindowFlags = QOhosPlatformWindow::platformWindowFlagsForQWindow(qWindow);
123 bool focusable = !platformWindowFlags.testFlag(Qt::WindowDoesNotAcceptFocus);
125 auto renderFit = nativeNodeCreateInfo.renderFitPolicyHint.value_or(::ARKUI_RENDER_FIT_TOP_LEFT);
128 qGuiApp, &QGuiApplication::focusWindowChanged,
129 this, [
this, qWindow](QWindow *focusedWindow) {
130 if (focusedWindow == qWindow)
134 auto qWindowRef = QtOhos::makeQThreadSafeRef(qWindow.data());
138 if (inputMethodEventHandler ==
nullptr)
139 qOhosReportFatalErrorAndAbort(
"QOhosInputMethodEventHandler is null!");
140 auto imEventHandlerRef = QtOhos::makeQThreadSafeRef(inputMethodEventHandler);
142 QOhosJsThreadGateway::runAndWait([&](QOhosJsState &) {
143 using ParentDescriptor = QArkUi::QEmbeddedWindowNode::ParentDescriptor;
145 std::optional<ParentDescriptor> optParentDescriptor;
146 if (nativeNodeCreateInfo.optParent.has_value()) {
147 auto *parentNode = nativeNodeCreateInfo.optParent.value()->m_jsStateData->embeddedWindow.get();
148 optParentDescriptor = ParentDescriptor(*parentNode);
151 QArkUi::QQtEmbeddedWindowNode::CreateInfo createInfo = {
152 .offset = nativeNodeCreateInfo.geometry.topLeft(),
153 .size = nativeNodeCreateInfo.geometry.size(),
154 .xComponentId = QXComponentId::createForRenderXComponent(windowId),
155 .xComponentType = ::ArkUI_XComponentType::ARKUI_XCOMPONENT_TYPE_SURFACE,
156 .focusOnTouch =
false,
157 .focusable = focusable,
158 .optParent = optParentDescriptor,
159 .sizePolicy = QArkUi::QEmbeddedWindowNode::SizePolicy::Points,
160 .renderFit = renderFit,
161 .backgroundColor = nativeNodeCreateInfo.backgroundColor,
164 m_jsStateData->embeddedWindow = QArkUi::QQtEmbeddedWindowNode::createOrFail(createInfo);
165 m_jsStateData->embeddedWindow->setCallbackReceiver(
166 std::make_unique<CallbackReceiver>(
167 m_jsStateData->embeddedWindow->renderXComponent(),
168 qWindowRef, imEventHandlerRef,
169 [selfRef](SurfaceEventType type, ::OHNativeWindow *window, std::optional<QSize> optSurfaceSize) {
170 selfRef.visitInQtThreadIfAlive(
171 [type, window, optSurfaceSize](
auto &self) {
172 self.handleSurfaceEvent(type, window, optSurfaceSize);
176 m_jsStateData->embeddedWindow->setTouchInterceptReceiver(
177 [selfRef, embeddedWindow = m_jsStateData->embeddedWindow.get()](
const ::ArkUI_UIInputEvent *event) {
178 auto eventAction = ::OH_ArkUI_UIInputEvent_GetAction(event);
180 if (eventAction != ::UI_MOUSE_EVENT_ACTION_PRESS && eventAction != ::UI_TOUCH_EVENT_ACTION_DOWN)
183 if (!embeddedWindow->hasNonQtManagedChildren())
186 selfRef.visitInQtThreadIfAlive(
187 [](QNativeNode &node) {
188 Q_EMIT node.externalContentClickDetected();
192 auto sharedAxisEventHandler = QtOhos::moveToSharedPtr(
193 makeQOhosNativeAxisEventHandler(qWindowRef, imEventHandlerRef));
194 m_jsStateData->embeddedWindow->setAxisEventsHandler(
195 [sharedAxisEventHandler](
auto *event) {
196 (*sharedAxisEventHandler)(QOhosAxisEventType::AxisEvent, event);
199 m_jsStateData->embeddedWindow->setCoastingAxisEventsHandler(
200 [sharedAxisEventHandler](
auto *event) {
201 (*sharedAxisEventHandler)(QOhosAxisEventType::CoastingAxisEvent, event);
203 m_jsStateData->embeddedWindow->setGesturesHandler(
204 makeQOhosArkUiNativeGesturesHandler(qWindowRef));
205 m_jsStateData->embeddedWindow->setDragEventsHandler(makeQOhosNativeDragEventsHandler(qWindowRef));
206 if (QtOhos::isNativeNodeApiKeyEventsEnabled())
207 m_jsStateData->embeddedWindow->setKeyEventsHandler(makeQOhosNativeKeyEventsHandler(qWindowRef, imEventHandlerRef));
208 if (QtOhos::isNativeNodeApiMouseEventsEnabled()) {
209 m_jsStateData->embeddedWindow->setMouseEventsHandler(
210 makeQOhosNativeMouseEventsHandler(qWindowRef, imEventHandlerRef));
211 m_jsStateData->embeddedWindow->setHoverEventsHandler(
212 [qWindowRef, imEventHandlerRef](QArkUi::NativeNodeHoverEvent hoverEvent) {
213 if (hoverEvent.isHovered)
215 imEventHandlerRef.visitInQtThreadIfAlive(
216 [qWindowRef](QOhosInputMethodEventHandler &imEventHandler) {
217 QWindow *qWindow = qWindowRef.data();
219 imEventHandler.onHoverEvent(QOhosHoverEvent { .targetWindow = qWindow });
419 const std::vector<QImage> &images,
const QPointF &hotspot,
420 const QMimeData &mimeData, QOhosConsumer<Qt::DropAction> dropActionConsumer)
422 auto udmfDataFactory = makeUdmfDataFactoryFromQMimeData(mimeData, {});
424 QOhosJsThreadGateway::runAndWait(
425 [&](QOhosJsState &) {
426 qOhosPrintfDebug(
"%s: starting drag", Q_FUNC_INFO);
428 std::vector<std::shared_ptr<::OH_PixelmapNative>> pixelMaps;
430 images.begin(), images.end(), std::back_inserter(pixelMaps),
431 &makeOhosNativePixelMapFromQImage);
435 QOhosConsumer<Qt::DropAction> dropActionConsumer;
436 std::shared_ptr<
void> startedDragHandle;
438 auto context = std::make_shared<DragContext>();
439 context->dropActionConsumer = std::move(dropActionConsumer);
441 auto startedDragHandle = m_jsStateData->embeddedWindow->startDrag(
442 std::move(pixelMaps), hotspot,
444 [context](::ArkUI_DragAndDropInfo *dragAndDropInfo)
mutable {
445 auto dragStatus = QArkUi::callArkUi(
446 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragAndDropInfo_GetDragStatus),
448 qOhosPrintfDebug(
"%s: drag status: %d", Q_FUNC_INFO,
static_cast<
int>(dragStatus));
450 if (dragStatus == ::ARKUI_DRAG_STATUS_ENDED && context) {
451 auto *dragEvent = QArkUi::callArkUiOrFailOnNullResult(
452 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragAndDropInfo_GetDragEvent),
455 ::ArkUI_DragResult dragResult = ::ARKUI_DRAG_RESULT_FAILED;
456 QArkUi::callArkUiOrFailOnErrorResult(
457 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragEvent_GetDragResult),
458 dragEvent, &dragResult);
461 dragResult == ::ARKUI_DRAG_RESULT_SUCCESSFUL
462 ? mapQOhosArkUiDropOperationToQt(
463 getQOhosDragEventDropOperation(dragEvent))
467 "%s: sending drag-end notification: %d / %d",
468 Q_FUNC_INFO,
static_cast<
int>(dragResult),
static_cast<
int>(qtDropAction));
469 QtOhos::invokeInQtThread(
470 [dropActionConsumer = std::move(context->dropActionConsumer), qtDropAction]() {
471 dropActionConsumer(qtDropAction);
476 context->startedDragHandle = startedDragHandle;