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);
143 m_jsStateData = QtOhos::makeProxyWithJsThreadDeleter(std::make_shared<JsStateData>());
147 std::optional<ParentDescriptor> optParentDescriptor;
148 if (nativeNodeCreateInfo.optParent.has_value()) {
149 auto *parentNode = nativeNodeCreateInfo.optParent.value()->m_jsStateData->embeddedWindow.get();
150 optParentDescriptor = ParentDescriptor(*parentNode);
154 .offset = nativeNodeCreateInfo.geometry.topLeft(),
155 .size = nativeNodeCreateInfo.geometry.size(),
156 .xComponentId = QXComponentId::createForRenderXComponent(windowId),
157 .xComponentType = ::ArkUI_XComponentType::ARKUI_XCOMPONENT_TYPE_SURFACE,
158 .focusOnTouch =
false,
159 .focusable = focusable,
160 .optParent = optParentDescriptor,
161 .sizePolicy = QArkUi::QEmbeddedWindowNode::SizePolicy::Points,
162 .renderFit = renderFit,
163 .backgroundColor = nativeNodeCreateInfo.backgroundColor,
166 m_jsStateData->embeddedWindow = QArkUi::QQtEmbeddedWindowNode::createOrFail(createInfo);
167 m_jsStateData->embeddedWindow->setCallbackReceiver(
168 std::make_unique<CallbackReceiver>(
169 m_jsStateData->embeddedWindow->renderXComponent(),
170 qWindowRef, imEventHandlerRef,
171 [selfRef](SurfaceEventType type, ::OHNativeWindow *window, std::optional<QSize> optSurfaceSize) {
172 selfRef.visitInQtThreadIfAlive(
173 [type, window, optSurfaceSize](
auto &self) {
174 self.handleSurfaceEvent(type, window, optSurfaceSize);
178 m_jsStateData->embeddedWindow->setTouchInterceptReceiver(
179 [selfRef, embeddedWindow = m_jsStateData->embeddedWindow.get()](
const ::ArkUI_UIInputEvent *event) {
180 auto eventAction = ::OH_ArkUI_UIInputEvent_GetAction(event);
182 if (eventAction != ::UI_MOUSE_EVENT_ACTION_PRESS && eventAction != ::UI_TOUCH_EVENT_ACTION_DOWN)
185 if (!embeddedWindow->hasNonQtManagedChildren())
188 selfRef.visitInQtThreadIfAlive(
189 [](QNativeNode &node) {
190 Q_EMIT node.externalContentClickDetected();
194 auto sharedAxisEventHandler = QtOhos::moveToSharedPtr(
195 makeQOhosNativeAxisEventHandler(qWindowRef, imEventHandlerRef));
196 m_jsStateData->embeddedWindow->setAxisEventsHandler(
197 [sharedAxisEventHandler](
auto *event) {
198 (*sharedAxisEventHandler)(QOhosAxisEventType::AxisEvent, event);
201 m_jsStateData->embeddedWindow->setCoastingAxisEventsHandler(
202 [sharedAxisEventHandler](
auto *event) {
203 (*sharedAxisEventHandler)(QOhosAxisEventType::CoastingAxisEvent, event);
205 m_jsStateData->embeddedWindow->setGesturesHandler(
206 makeQOhosArkUiNativeGesturesHandler(qWindowRef));
207 m_jsStateData->embeddedWindow->setDragEventsHandler(makeQOhosNativeDragEventsHandler(qWindowRef));
208 if (QtOhos::isNativeNodeApiKeyEventsEnabled())
209 m_jsStateData->embeddedWindow->setKeyEventsHandler(makeQOhosNativeKeyEventsHandler(qWindowRef, imEventHandlerRef));
211 auto hoverEventsGenerator = makeQOhosHoverEventsGenerator(qWindowRef, imEventHandlerRef);
212 m_jsStateData->embeddedWindow->setMouseEventsHandler(
213 makeQOhosNativeMouseEventsHandler(qWindowRef, imEventHandlerRef, hoverEventsGenerator));
214 m_jsStateData->embeddedWindow->setHoverEventsHandler(
215 [hoverEventsGenerator](QArkUi::NativeNodeHoverEvent hoverEvent) {
216 hoverEventsGenerator->handleQOhosHoverEvent(hoverEvent.isHovered);
415 const std::vector<QImage> &images,
const QPointF &hotspot,
416 const QMimeData &mimeData, QOhosConsumer<Qt::DropAction> dropActionConsumer)
418 auto udmfDataFactory = makeUdmfDataFactoryFromQMimeData(mimeData, {});
422 qOhosPrintfDebug(
"%s: starting drag", Q_FUNC_INFO);
424 std::vector<std::shared_ptr<::OH_PixelmapNative>> pixelMaps;
426 images.begin(), images.end(),
std::back_inserter(pixelMaps),
427 &makeOhosNativePixelMapFromQImage);
431 QOhosConsumer<Qt::DropAction> dropActionConsumer;
432 std::shared_ptr<
void> startedDragHandle;
434 auto context =
std::make_shared<DragContext>();
435 context->dropActionConsumer =
std::move(dropActionConsumer);
437 auto startedDragHandle = m_jsStateData->embeddedWindow->startDrag(
438 std::move(pixelMaps), hotspot,
440 [context](::ArkUI_DragAndDropInfo *dragAndDropInfo)
mutable {
441 auto dragStatus = QArkUi::callArkUi(
442 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragAndDropInfo_GetDragStatus),
444 qOhosPrintfDebug(
"%s: drag status: %d", Q_FUNC_INFO,
static_cast<
int>(dragStatus));
446 if (dragStatus == ::ARKUI_DRAG_STATUS_ENDED && context) {
447 auto *dragEvent = QArkUi::callArkUiOrFailOnNullResult(
448 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragAndDropInfo_GetDragEvent),
451 ::ArkUI_DragResult dragResult = ::ARKUI_DRAG_RESULT_FAILED;
452 QArkUi::callArkUiOrFailOnErrorResult(
453 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragEvent_GetDragResult),
454 dragEvent, &dragResult);
457 dragResult == ::ARKUI_DRAG_RESULT_SUCCESSFUL
458 ? mapQOhosArkUiDropOperationToQt(
459 getQOhosDragEventDropOperation(dragEvent))
463 "%s: sending drag-end notification: %d / %d",
464 Q_FUNC_INFO,
static_cast<
int>(dragResult),
static_cast<
int>(qtDropAction));
465 QtOhos::invokeInQtThread(
466 [dropActionConsumer = std::move(context->dropActionConsumer), qtDropAction]() {
467 dropActionConsumer(qtDropAction);
472 context->startedDragHandle = startedDragHandle;