119 auto qWindow = QPointer<QWindow>(nativeNodeCreateInfo.window);
120 auto selfRef = QtOhos::makeQThreadSafeRef(
this);
121 auto windowId = QOhosPlatformWindow::fromQWindow(qWindow)->internalWindowId();
123 auto platformWindowFlags = QOhosPlatformWindow::platformWindowFlagsForQWindow(qWindow);
124 bool focusable = !platformWindowFlags.testFlag(Qt::WindowDoesNotAcceptFocus);
126 auto renderFit = nativeNodeCreateInfo.renderFitPolicyHint.value_or(::ARKUI_RENDER_FIT_TOP_LEFT);
129 qGuiApp, &QGuiApplication::focusWindowChanged,
130 this, [
this, qWindow](QWindow *focusedWindow) {
131 if (focusedWindow == qWindow)
135 auto qWindowRef = QtOhos::makeQThreadSafeRef(qWindow.data());
139 if (inputMethodEventHandler ==
nullptr)
140 qOhosReportFatalErrorAndAbort(
"QOhosInputMethodEventHandler is null!");
141 auto imEventHandlerRef = QtOhos::makeQThreadSafeRef(inputMethodEventHandler);
143 QOhosJsThreadGateway::runAndWait([&](QOhosJsState &) {
144 m_jsStateData = QtOhos::makeProxyWithJsThreadDeleter(std::make_shared<JsStateData>());
146 using ParentDescriptor = QArkUi::QEmbeddedWindowNode::ParentDescriptor;
148 std::optional<ParentDescriptor> optParentDescriptor;
149 if (nativeNodeCreateInfo.optParent.has_value()) {
150 auto *parentNode = nativeNodeCreateInfo.optParent.value()->m_jsStateData->embeddedWindow.get();
151 optParentDescriptor = ParentDescriptor(*parentNode);
154 QArkUi::QQtEmbeddedWindowNode::CreateInfo createInfo = {
155 .offset = nativeNodeCreateInfo.geometry.topLeft(),
156 .size = nativeNodeCreateInfo.geometry.size(),
157 .xComponentId = QXComponentId::createForRenderXComponent(windowId),
158 .xComponentType = ::ArkUI_XComponentType::ARKUI_XCOMPONENT_TYPE_SURFACE,
159 .focusOnTouch =
false,
160 .focusable = focusable,
161 .optParent = optParentDescriptor,
162 .sizePolicy = QArkUi::QEmbeddedWindowNode::SizePolicy::Points,
163 .renderFit = renderFit,
164 .backgroundColor = nativeNodeCreateInfo.backgroundColor,
167 m_jsStateData->embeddedWindow = QArkUi::QQtEmbeddedWindowNode::createOrFail(createInfo);
168 m_jsStateData->embeddedWindow->setCallbackReceiver(
169 std::make_unique<CallbackReceiver>(
170 m_jsStateData->embeddedWindow->renderXComponent(),
171 qWindowRef, imEventHandlerRef,
172 [selfRef](SurfaceEventType type, ::OHNativeWindow *window, std::optional<QSize> optSurfaceSize) {
173 selfRef.visitInQtThreadIfAlive(
174 [type, window, optSurfaceSize](
auto &self) {
175 self.handleSurfaceEvent(type, window, optSurfaceSize);
179 m_jsStateData->embeddedWindow->setTouchInterceptReceiver(
180 [selfRef, embeddedWindow = m_jsStateData->embeddedWindow.get()](
const ::ArkUI_UIInputEvent *event) {
181 auto eventAction = ::OH_ArkUI_UIInputEvent_GetAction(event);
183 if (eventAction != ::UI_MOUSE_EVENT_ACTION_PRESS && eventAction != ::UI_TOUCH_EVENT_ACTION_DOWN)
186 if (!embeddedWindow->hasNonQtManagedChildren())
189 selfRef.visitInQtThreadIfAlive(
190 [](QNativeNode &node) {
191 Q_EMIT node.externalContentClickDetected();
195 auto sharedAxisEventHandler = QtOhos::moveToSharedPtr(
196 makeQOhosNativeAxisEventHandler(qWindowRef, imEventHandlerRef));
197 m_jsStateData->embeddedWindow->setAxisEventsHandler(
198 [sharedAxisEventHandler](
auto *event) {
199 (*sharedAxisEventHandler)(QOhosAxisEventType::AxisEvent, event);
202 m_jsStateData->embeddedWindow->setCoastingAxisEventsHandler(
203 [sharedAxisEventHandler](
auto *event) {
204 (*sharedAxisEventHandler)(QOhosAxisEventType::CoastingAxisEvent, event);
206 m_jsStateData->embeddedWindow->setGesturesHandler(
207 makeQOhosArkUiNativeGesturesHandler(qWindowRef));
208 m_jsStateData->embeddedWindow->setDragEventsHandler(makeQOhosNativeDragEventsHandler(qWindowRef));
209 if (QtOhos::isNativeNodeApiKeyEventsEnabled())
210 m_jsStateData->embeddedWindow->setKeyEventsHandler(makeQOhosNativeKeyEventsHandler(qWindowRef, imEventHandlerRef));
211 if (QtOhos::isNativeNodeApiMouseEventsEnabled()) {
212 auto hoverEventsGenerator = makeQOhosHoverEventsGenerator(qWindowRef, imEventHandlerRef);
213 m_jsStateData->embeddedWindow->setMouseEventsHandler(
214 makeQOhosNativeMouseEventsHandler(qWindowRef, imEventHandlerRef, hoverEventsGenerator));
215 m_jsStateData->embeddedWindow->setHoverEventsHandler(
216 [hoverEventsGenerator](QArkUi::NativeNodeHoverEvent hoverEvent) {
217 hoverEventsGenerator->handleQOhosHoverEvent(hoverEvent.isHovered);
416 const std::vector<QImage> &images,
const QPointF &hotspot,
417 const QMimeData &mimeData, QOhosConsumer<Qt::DropAction> dropActionConsumer)
419 auto udmfDataFactory = makeUdmfDataFactoryFromQMimeData(mimeData, {});
421 QOhosJsThreadGateway::runAndWait(
422 [&](QOhosJsState &) {
423 qOhosPrintfDebug(
"%s: starting drag", Q_FUNC_INFO);
425 std::vector<std::shared_ptr<::OH_PixelmapNative>> pixelMaps;
427 images.begin(), images.end(), std::back_inserter(pixelMaps),
428 &makeOhosNativePixelMapFromQImage);
432 QOhosConsumer<Qt::DropAction> dropActionConsumer;
433 std::shared_ptr<
void> startedDragHandle;
435 auto context = std::make_shared<DragContext>();
436 context->dropActionConsumer = std::move(dropActionConsumer);
438 auto startedDragHandle = m_jsStateData->embeddedWindow->startDrag(
439 std::move(pixelMaps), hotspot,
441 [context](::ArkUI_DragAndDropInfo *dragAndDropInfo)
mutable {
442 auto dragStatus = QArkUi::callArkUi(
443 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragAndDropInfo_GetDragStatus),
445 qOhosPrintfDebug(
"%s: drag status: %d", Q_FUNC_INFO,
static_cast<
int>(dragStatus));
447 if (dragStatus == ::ARKUI_DRAG_STATUS_ENDED && context) {
448 auto *dragEvent = QArkUi::callArkUiOrFailOnNullResult(
449 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragAndDropInfo_GetDragEvent),
452 ::ArkUI_DragResult dragResult = ::ARKUI_DRAG_RESULT_FAILED;
453 QArkUi::callArkUiOrFailOnErrorResult(
454 Q_OHOS_NAMED_FUNC(::OH_ArkUI_DragEvent_GetDragResult),
455 dragEvent, &dragResult);
458 dragResult == ::ARKUI_DRAG_RESULT_SUCCESSFUL
459 ? mapQOhosArkUiDropOperationToQt(
460 getQOhosDragEventDropOperation(dragEvent))
464 "%s: sending drag-end notification: %d / %d",
465 Q_FUNC_INFO,
static_cast<
int>(dragResult),
static_cast<
int>(qtDropAction));
466 QtOhos::invokeInQtThread(
467 [dropActionConsumer = std::move(context->dropActionConsumer), qtDropAction]() {
468 dropActionConsumer(qtDropAction);
473 context->startedDragHandle = startedDragHandle;