4#include <render/qohosview.h>
6#include <QtCore/private/qnapi_p.h>
7#include <QtCore/private/qohoscommon_p.h>
8#include <QtCore/qscopeguard.h>
9#include <QtGui/private/qguiapplication_p.h>
10#include <QtGui/private/qhighdpiscaling_p.h>
11#include <QtGui/private/qwindow_p.h>
12#include <QtGui/qbitmap.h>
13#include <QtGui/qpalette.h>
14#include <ace/xcomponent/native_interface_xcomponent.h>
15#include <arkui/native_type.h>
18#include <qarkui/window.h>
19#include <qohosdeviceinfo_p.h>
20#include <qohosinputmethodeventhandler.h>
21#include <qohosjsmain.h>
22#include <qohosplatformbackingstore.h>
23#include <qohosplatformintegration.h>
24#include <qohosplatformscreen.h>
25#include <qohosplatformwindow.h>
26#include <qohosutils.h>
27#include <qpa/qplatformscreen.h>
28#include <qpa/qplatformtheme.h>
29#include <qpa/qwindowsysteminterface.h>
30#include <render/qnativenode.h>
31#include <render/qohoswindowproxy.h>
32#include <render/qwindowproxyregistry.h>
57 Qt::WindowModality windowModality)
59 using ModalityType = QOhosWindowProxy::ModalityType;
61 switch (windowModality) {
62 case Qt::WindowModality::NonModal:
64 case Qt::WindowModality::WindowModal:
65 return ModalityType::WINDOW_MODALITY;
66 case Qt::WindowModality::ApplicationModal:
67 return ModalityType::APPLICATION_MODALITY;
71 "%s: got illegal Qt::WindowModality value (%d), using the default instead",
72 Q_FUNC_INFO,
static_cast<
int>(windowModality));
77template<
typename ...SignalParams>
79 QPointer<QOhosView> viewPtr,
std::function<
bool(
QOhosView &)> predicate,
void (QOhosView::*signalFuncPtr)(SignalParams ...))
81 return [signalFuncPtr, viewPtr, predicate = std::move(predicate)](SignalParams ...args) {
82 if (viewPtr && predicate(*viewPtr))
83 Q_EMIT (*viewPtr.*signalFuncPtr)(args...);
93 explicit AvoidAreaCache(std::function<AvoidArea(AvoidAreaType)> avoidAreasProvider);
96 AvoidAreaType avoidAreaType,
97 const AvoidArea &avoidArea);
102 std::function<AvoidArea(AvoidAreaType)> m_avoidAreasProvider;
103 QMap<AvoidAreaType, AvoidArea> m_store;
113 QOhosWindowProxy::AvoidAreaType avoidAreaType,
const QOhosWindowProxy::AvoidArea &avoidArea)
115 m_store[avoidAreaType] = avoidArea;
119 QOhosWindowProxy::AvoidAreaType avoidAreaType)
121 if (m_store.contains(avoidAreaType))
122 return m_store.value(avoidAreaType);
124 auto result = m_avoidAreasProvider(avoidAreaType);
125 m_store[avoidAreaType] = result;
131 if (!avoidArea.visible)
134 marginsToUpdate.setTop(qMax(marginsToUpdate.top(), avoidArea.topRect.height()));
135 marginsToUpdate.setLeft(qMax(marginsToUpdate.left(), avoidArea.leftRect.width()));
136 marginsToUpdate.setRight(qMax(marginsToUpdate.right(), avoidArea.rightRect.width()));
137 marginsToUpdate.setBottom(qMax(marginsToUpdate.bottom(), avoidArea.bottomRect.height()));
141 const QPoint &geometryOrigin,
const QRect &frameGeometry)
143 int topFrameMargin = qAbs(frameGeometry.top() - geometryOrigin.y());
144 int sideAndBottomFrameMargin = qAbs(frameGeometry.left() - geometryOrigin.x());
147 frameGeometry.width() - 2 * sideAndBottomFrameMargin,
148 frameGeometry.height() - topFrameMargin - sideAndBottomFrameMargin
160 qMax(1, size.width() + margins.left() + margins.right()),
161 qMax(1, size.height() + margins.top() + margins.bottom())};
167 return !visibleWindows.empty()
168 ? visibleWindows.front()
175 return !focusedWindows.empty()
176 ? focusedWindows.front()
182 auto *focusWindow = getFirstTopLevelWindowWithSystemFocusOrNull();
183 auto *firstTopLevelWindow = getFirstTopLevelWindowOrNull();
185 auto isValidSyntheticParent = [&](QWindow *w) {
186 return w !=
nullptr && w != qWindow && w->isVisible();
189 return isValidSyntheticParent(focusWindow)
191 : isValidSyntheticParent(firstTopLevelWindow)
192 ? firstTopLevelWindow
198 using ViewType = QOhosView::ViewType;
200 auto *qWindow = platformWindow->window();
201 auto *parent = qWindow->parent();
202 auto *transientParent = qWindow->transientParent();
204 auto windowType = qWindow->type();
206 QWindow *subWindowTagValue = platformWindow->validSubWindowOfTagValueOrNull();
208 static QSet<Qt::WindowType> fallbackToSubWindowWindowTypes{
216 if (taggedAsMainWindow) {
217 return ViewTypeInfo {
218 .viewType = ViewType::MainWindow,
219 .optLogicalParent =
nullptr,
224 if (taggedAsFloatWindow) {
225 return ViewTypeInfo {
226 .viewType = ViewType::FloatWindow,
227 .optLogicalParent =
nullptr,
231 bool overrideAsSubWindow = subWindowTagValue !=
nullptr;
232 if (overrideAsSubWindow) {
233 return ViewTypeInfo {
234 .viewType = ViewType::SubWindow,
235 .optLogicalParent = subWindowTagValue,
239 if (parent !=
nullptr) {
240 return ViewTypeInfo {
241 .viewType = ViewType::EmbeddedWindow,
242 .optLogicalParent = parent,
246 if (transientParent !=
nullptr) {
247 return ViewTypeInfo {
248 .viewType = ViewType::SubWindow,
249 .optLogicalParent = transientParent,
253 auto *syntheticParent = syntheticParentForQWindowOrNull(platformWindow->window());
255 bool automaticOverrideActive =
256 fallbackToSubWindowWindowTypes.contains(windowType)
257 && syntheticParent !=
nullptr;
258 if (automaticOverrideActive) {
259 return ViewTypeInfo {
260 .viewType = ViewType::SubWindow,
261 .optLogicalParent = syntheticParent,
265 return ViewTypeInfo {
266 .viewType = ViewType::MainWindow,
267 .optLogicalParent =
nullptr,
273 return cursor.bitmap();
278 return cursor.mask();
283 const auto maskTransparentColor = QColor(Qt::color0).rgba();
284 const auto transparentColor = QColor(Qt::transparent).rgba();
286 QImage image = bitmap.toImage().convertToFormat(QImage::Format_RGBA8888);
287 QImage maskImage = mask.toImage().convertToFormat(QImage::Format_RGB32);
289 for (
int row = 0; row < image.height(); ++row) {
290 auto *imageData =
reinterpret_cast<QRgb *>(image.scanLine(row));
291 auto *maskData =
reinterpret_cast<QRgb *>(maskImage.scanLine(row));
292 for (
int col = 0; col < image.width(); ++col) {
293 if (maskData[col] == maskTransparentColor)
294 imageData[col] = transparentColor;
303 QBitmap cursorPixels(cursorSize);
304 cursorPixels.fill(Qt::transparent);
305 QBitmap cursorMask(cursorSize);
306 cursorMask.fill(Qt::color0);
307 return QCursor(cursorPixels, cursorMask);
314 auto viewGeometryPersistencePolicy = ViewGeometryPersistencePolicy::Ignore;
318 case WindowGeometryPersistencePolicy
::Disabled:
319 viewGeometryPersistencePolicy = ViewGeometryPersistencePolicy::Disabled;
321 case WindowGeometryPersistencePolicy
::Enabled:
322 viewGeometryPersistencePolicy = ViewGeometryPersistencePolicy::Enabled;
325 viewGeometryPersistencePolicy = ViewGeometryPersistencePolicy::FollowSystemSetting;
329 return viewGeometryPersistencePolicy;
336 bool geometryPersistenceEnabled =
false;
339 case WindowGeometryPersistencePolicy
::Disabled:
342 case WindowGeometryPersistencePolicy
::Enabled:
351 return geometryPersistenceEnabled
359 auto *screen = logicalParent->screen();
360 auto *ohosPlatformScreen = screen !=
nullptr
364 return ohosPlatformScreen !=
nullptr
365 ?
std::optional(ohosPlatformScreen->displayInfo().id)
371 if (window !=
nullptr) {
372 QWindowPrivate *windowPrivate = qt_window_private(window);
373 QPalette palette = windowPrivate->windowPalette();
374 QColor backgroundColor = palette.color(QPalette::Window);
375 return backgroundColor;
384 auto optPostSurfaceDrawTask = std::exchange(m_optPostSurfaceDrawTask, {});
385 if (optPostSurfaceDrawTask)
386 optPostSurfaceDrawTask();
391 QWindow *qWindow = m_ownerWindow;
397 case ViewType::MainWindow:
401 if (useAutoStartedMainWindow) {
403 createInfo.qWindowRef = QtOhos::QObjectThreadSafeRef(qWindow);
405 return jsState.defaultQAbilityPeer()->instanceId();
412 createInfo.qWindowRef = QtOhos::QObjectThreadSafeRef(qWindow);
413 createInfo.windowId = window->internalWindowId();
414 createInfo
.windowTitle = qWindow->title().toStdString();
415 createInfo.frameGeometry = window->lastRequestedWindowFrameGeometry();
416 createInfo.fullscreen = qWindow->windowState() == Qt::WindowFullScreen;
422 case ViewType::SubWindow:
424 auto *targetWindowToBeSubWindowOf = optLogicalParent;
426 if (Q_UNLIKELY(targetWindowToBeSubWindowOf ==
nullptr))
427 qOhosReportFatalErrorAndAbort(
"Failed to determine valid parent of a SubWindow");
429 if (!targetWindowToBeSubWindowOf->isVisible()) {
430 auto *targetParentPlatformWindow = QOhosPlatformWindow::fromQWindowOrNull(targetWindowToBeSubWindowOf);
431 if (targetParentPlatformWindow !=
nullptr)
432 targetParentPlatformWindow->setVisible(
true);
434 targetWindowToBeSubWindowOf->show();
437 auto *targetWindowToBeSubWindowOfView =
438 QOhosPlatformWindow::fromQWindow(targetWindowToBeSubWindowOf)->ownedViewOrNull();
440 const QOhosView *firstViewWithWindow =
nullptr;
441 switch (targetWindowToBeSubWindowOfView->viewType()) {
442 case ViewType::MainWindow:
443 case ViewType::SubWindow:
444 case ViewType::FloatWindow:
445 firstViewWithWindow = targetWindowToBeSubWindowOfView;
447 case ViewType::EmbeddedWindow:
448 firstViewWithWindow = ancestorViewWithWindowOrNull();
452 if (firstViewWithWindow ==
nullptr)
453 qOhosReportFatalErrorAndAbort(
"Failed to determine valid parent for this window.");
455 auto parentWindowProxy = firstViewWithWindow->m_ohosWindowProxy;
456 if (Q_UNLIKELY(!parentWindowProxy)) {
457 qOhosReportFatalErrorAndAbort(
458 "parentWindowProxy is null but should not be. This is most likely a programming error");
462 createInfo.window = QtOhos::QObjectThreadSafeRef(qWindow);
463 createInfo
.windowTitle = qWindow->title().toStdString();
464 createInfo.windowId = window->internalWindowId();
469 createInfo.modal = qWindow->modality() != Qt::NonModal;
470 createInfo.windowRect = window->lastRequestedWindowFrameGeometry();
471 result = parentWindowProxy->createSubWindow(createInfo);
475 case ViewType::EmbeddedWindow:
480 case ViewType::FloatWindow:
483 .qWindowRef = QtOhos::QObjectThreadSafeRef(qWindow),
484 .internalWindowId = window->internalWindowId(),
490 qOhosReportFatalErrorAndAbort(
"Unsupported view type: %d", viewType);
494 if (result !=
nullptr) {
495 auto viewPtr = QPointer<
QOhosView>(
this);
497 auto shouldEmitSignalPredicate = [weakWindowProxy](
QOhosView &view) {
498 auto windowProxy = weakWindowProxy.lock();
499 return windowProxy !=
nullptr && windowProxy.get() == view.m_ohosWindowProxy.get();
502 result->setWindowCallbackReceiver(
505 .onWindowEvent = makeViewConditionalSignalEmitter(viewPtr, shouldEmitSignalPredicate, &QOhosView::windowEvent),
506 .onWindowStatusChange = makeViewConditionalSignalEmitter(viewPtr, shouldEmitSignalPredicate, &QOhosView::windowStatusChange),
509 .onAvoidAreaChange = makeViewConditionalSignalEmitter(viewPtr, shouldEmitSignalPredicate, &QOhosView::avoidAreaChanged),
510 .onWindowRectChange = makeViewConditionalSignalEmitter(viewPtr, shouldEmitSignalPredicate, &QOhosView::windowRectChanged),
511 .onWindowRectChangeInGlobalDisplay = makeViewConditionalSignalEmitter(
512 viewPtr, shouldEmitSignalPredicate, &QOhosView::windowRectChangedInGlobalDisplay),
516 result->setNonClientAreaMouseWindowCallbackReceiver(
518 [viewPtr, shouldEmitSignalPredicate](std::vector<QOhosWindowProxy::NonClientAreaMouseEvent> &&batch) {
519 if (!viewPtr.isNull() && shouldEmitSignalPredicate(*viewPtr)) {
521 inputEventHandler->onNonClientAreaMouseEvents(viewPtr->m_ownerWindow,
std::move(batch));
525 result->setNonClientAreaTouchWindowCallbackReceiver(
527 [viewPtr, shouldEmitSignalPredicate](std::vector<QOhosWindowProxy::NonClientAreaTouchEvent> &&batch) {
528 if (!viewPtr.isNull() && shouldEmitSignalPredicate(*viewPtr)) {
530 inputEventHandler->onNonClientAreaTouchEvents(viewPtr->m_ownerWindow,
std::move(batch));
534 if (result->qtIsMainWindow() && result->isFocused().value_or(
false)) {
538 sendAsyncSyntheticWindowActiveEvent();
545bool QOhosView::isWindowTransparencyRequested()
const
547 return m_ownerWindow->requestedFormat().hasAlpha();
551 : m_windowPropertiesProvider(windowPropertyProvider)
556 , m_updatePending(
false)
562 auto avoidAreasProvider =
std::make_shared<
AvoidAreaCache>([
this](AvoidAreaCache::AvoidAreaType avoidAreaType) {
563 return m_ohosWindowProxy !=
nullptr
564 ? m_ohosWindowProxy->getWindowAvoidArea(avoidAreaType)
565 : AvoidAreaCache::AvoidArea{};
569 this, &QOhosView::avoidAreaChanged,
571 [avoidAreasProvider](QOhosWindowProxy::AvoidAreaType avoidAreaType,
const QOhosWindowProxy::AvoidArea &avoidArea) {
572 avoidAreasProvider->put(avoidAreaType, avoidArea);
575 m_avoidAreasProvider = [avoidAreasProvider](QOhosWindowProxy::AvoidAreaType type) {
576 return avoidAreasProvider->getStoredOrRetrieveFromWindowProxy(type);
580 m_nativeNode.get(), &QNativeNode::surfaceStatusChanged,
581 this, [
this](
const std::optional<QSize> &optSurfaceSize) {
582 Q_EMIT surfaceStatusChanged(optSurfaceSize);
589 m_nativeNode->setNodeAreaChangeHandler(
590 [
this](
auto nodeAreaChangeEvent) {
591 Q_EMIT nodeAreaChanged(nodeAreaChangeEvent);
594 m_nativeNode->setNodeVisibilityChangeHandler(
595 [
this](
bool visible) {
596 if (m_ohosWindowProxy ==
nullptr)
597 Q_EMIT windowVisibilityChange(visible);
600 std::vector<std::shared_ptr<
void>> writeCallbacks = {
601 m_windowPropertiesProvider.addPropertyWriteCallback<
double, &QOhosPlatformWindow::windowCornerRadiusProperty>(
602 [
this](
double windowCornerRadius) {
603 setWindowCornerRadius(windowCornerRadius);
605 m_windowPropertiesProvider.addPropertyWriteCallback<
bool, &QOhosPlatformWindow::windowPrivacyModeSettingProperty>(
606 [
this](
bool windowPrivacyModeSetting) {
607 setPrivacyMode(windowPrivacyModeSetting);
609 m_windowPropertiesProvider.addPropertyWriteCallback<QColor, &QOhosPlatformWindow::surfaceBackgroundColorProperty>(
610 [
this](QColor surfaceBackgroundColor) {
611 setBackgroundColor(surfaceBackgroundColor);
613 m_windowPropertiesProvider.addPropertyWriteCallback<
bool, &QOhosPlatformWindow::windowKeepScreenOnProperty>(
614 [
this](
bool keepScreenOn) {
615 setWindowKeepScreenOn(keepScreenOn);
617 m_windowPropertiesProvider.addPropertyWriteCallback<
bool, &QOhosPlatformWindow::windowFixedSizeStateProperty>(
618 [
this](
bool fixedSizeStateEnabled) {
619 setFixedSizeStateEnabled(fixedSizeStateEnabled);
621 m_windowPropertiesProvider.addPropertyWriteCallback<
int, &QOhosPlatformWindow::windowBrightnessProperty>(
622 [
this](
int brightness) {
623 setBrightness(brightness);
625 m_windowPropertiesProvider.addPropertyWriteCallback<
int, &QOhosPlatformWindow::windowContrastProperty>(
626 [
this](
int contrast) {
627 setContrast(contrast);
629 m_windowPropertiesProvider.addPropertyWriteCallback<
int, &QOhosPlatformWindow::windowSaturationProperty>(
630 [
this](
int saturation) {
631 setSaturation(saturation);
633 m_windowPropertiesProvider.addPropertyWriteCallback<
bool, &QOhosPlatformWindow::windowDragResizableProperty>(
634 [
this](
bool dragResizable) {
635 setWindowDragResizable(dragResizable);
639 m_windowPropertiesProviderCallbacksHandle = QtOhos::moveToSharedPtr(std::move(writeCallbacks));
648 m_nativeNode.reset();
653 setSystemUpdateProperty(&SystemUpdateData::position, {position, {}});
659 setSystemUpdateProperty(&SystemUpdateData::position, {position, jsDisplayId});
660 flushSystemPropertyUpdatesImmediate();
665 setSystemUpdateProperty(&SystemUpdateData::size, size);
670 setSystemUpdateProperty(&SystemUpdateData::sizeLimits, std::make_pair(minSize, maxSize));
675 setSystemUpdateProperty(&SystemUpdateData::backgroundTransparent, transparent);
680 setSystemUpdateProperty(&SystemUpdateData::focusable, focusable);
683void QOhosView::setBackgroundColor(
const QColor &color)
685 setSystemUpdateProperty(&SystemUpdateData::backgroundColor, color);
688void QOhosView::setBrightness(
int brightness)
690 setSystemUpdateProperty(&SystemUpdateData::brightness, brightness);
695 setSystemUpdateProperty(&SystemUpdateData::contrast, contrast);
698void QOhosView::setSaturation(
int saturation)
700 setSystemUpdateProperty(&SystemUpdateData::saturation, saturation);
703void QOhosView::setWindowKeepScreenOn(
bool keepScreenOn)
705 if (m_ohosWindowProxy !=
nullptr)
706 m_ohosWindowProxy->setWindowKeepScreenOn(keepScreenOn);
709void QOhosView::setFixedSizeStateEnabled(
bool enabled)
711 if (m_ohosWindowProxy ==
nullptr || viewType() != ViewType::MainWindow)
716 "%s: fixed size state is not supported while in HandheldDeviceFullScreen mode",
721 using SupportWindowMode = QOhosWindowProxy::SupportWindowMode;
722 const auto supportedWindowModes = enabled
723 ? std::set<SupportWindowMode>({SupportWindowMode::FLOATING})
724 : std::set<SupportWindowMode>({SupportWindowMode::FULL_SCREEN, SupportWindowMode::FLOATING, SupportWindowMode::SPLIT});
726 m_ohosWindowProxy->setSupportedWindowModes(supportedWindowModes);
731 auto *ohosPlatformWindow =
static_cast<QOhosPlatformWindow *>(m_ownerWindow->handle());
732 m_ohosWindowProxy->showWindow(
733 QOhosWindowProxy::ShowWindowOptions{
734 .focusOnShow = ohosPlatformWindow->shouldShowWindowWithoutActivating()
735 ? std::optional(
false)
740void QOhosView::sendAsyncSyntheticWindowActiveEvent()
742 QMetaObject::invokeMethod(
745 QOhosWindowProxy::WindowEvent syntheticWindowActiveEvent = {
746 .type = QOhosWindowProxy::WindowEventType::WINDOW_ACTIVE,
748 Q_EMIT windowEvent(syntheticWindowActiveEvent);
750 Qt::QueuedConnection);
755 setSystemUpdateProperty(&SystemUpdateData::cursor, cursor);
760 setSystemUpdateProperty(&SystemUpdateData::modality, modality);
765 setSystemUpdateProperty(&SystemUpdateData::title, title);
770 if (m_ohosWindowProxy ==
nullptr) {
771 m_nativeNode->raise();
775 switch (viewType()) {
776 case ViewType::MainWindow:
779 case ViewType::SubWindow:
780 m_ohosWindowProxy->raiseToAppTop();
782 case ViewType::FloatWindow:
783 case ViewType::EmbeddedWindow:
790 if (m_ohosWindowProxy !=
nullptr && m_ownerWindow->isVisible())
793 m_nativeNode->lower();
796void QOhosView::updateWindowSize(
const QSize &size)
798 if (m_ohosWindowProxy !=
nullptr)
799 m_ohosWindowProxy->setSize(size);
801 m_nativeNode->setSize(size);
804void QOhosView::updateWindowPosition(
const std::pair<QPoint, std::optional<QOhosDisplayInfo::JsDisplayId>> &positionProp)
808 std::tie(position, displayId) = positionProp;
810 if (m_ohosWindowProxy !=
nullptr) {
811 m_ohosWindowProxy->moveWindowToGlobalOrGlobalDisplay(position, displayId);
813 m_nativeNode->setPosition(position);
817void QOhosView::updateWindowBackgroundTransparency(
bool transparent)
819 if (m_ohosWindowProxy !=
nullptr) {
820 auto opaqueSystemBackgroundRgb = QGuiApplicationPrivate::platformTheme()
821 ->palette(QPlatformTheme::SystemPalette)
825 m_ohosWindowProxy->setWindowBackgroundColor(
827 ? QColor(Qt::transparent)
828 : tryGetBackgroundColorFromWindow(m_ownerWindow).value_or(
829 QColor(opaqueSystemBackgroundRgb)));
833void QOhosView::updateWindowCursor(
const QCursor &cursor)
835 if (m_ohosWindowProxy ==
nullptr)
838 if (cursor.shape() == Qt::BitmapCursor || cursor.shape() == Qt::BlankCursor) {
840 cursor.shape() == Qt::BlankCursor
841 ? makeTransparentBitmapCursor({1, 1})
844 QImage bitmapCursorImage = bitmapCursor.pixmap().isNull()
845 ? createImageFromBitmapAndMask(getCursorBitmap(bitmapCursor), getCursorMask(bitmapCursor))
846 : bitmapCursor.pixmap().toImage();
848 m_ohosWindowProxy->setCustomCursor(bitmapCursorImage, bitmapCursor.hotSpot());
850 m_ohosWindowProxy->setPointerStyleSync(cursor);
854void QOhosView::updateWindowFocusable(
bool focusable)
856 if (m_ohosWindowProxy !=
nullptr)
857 m_ohosWindowProxy->setWindowFocusable(focusable);
858 m_nativeNode->setFocusable(focusable);
861void QOhosView::updateWindowBackgroundColor(
const QColor &color)
863 m_nativeNode->setBackgroundColor(color);
866void QOhosView::updateWindowBrightness(
int brightness)
868 m_nativeNode->setBrightness(brightness);
871void QOhosView::updateWindowContrast(
int contrast)
873 m_nativeNode->setContrast(contrast);
876void QOhosView::updateWindowSaturation(
int saturation)
878 m_nativeNode->setSaturation(saturation);
881void QOhosView::updateWindowTransparentForInput(
bool transparentForInput)
883 if (m_ohosWindowProxy !=
nullptr)
884 m_ohosWindowProxy->setWindowTouchable(!transparentForInput);
885 m_nativeNode->setTransparentForInput(transparentForInput);
888void QOhosView::updateWindowSizeLimits(
const std::pair<QSize, QSize> &sizeLimits)
890 if (m_ohosWindowProxy !=
nullptr) {
891 auto windowMargins = QOhosPlatformWindow::fromQWindow(m_ownerWindow)->frameMargins();
892 m_ohosWindowProxy->setWindowLimits(
893 getQSizeGrownBy(sizeLimits.first, windowMargins),
894 getQSizeGrownBy(sizeLimits.second, windowMargins));
898void QOhosView::updateWindowModality(Qt::WindowModality modality)
900 if (m_ohosWindowProxy !=
nullptr) {
901 if (viewType() != ViewType::SubWindow) {
902 qCWarning(QtForOhos,
"%s: Modality is supported only for sub-windows.", Q_FUNC_INFO);
905 if (modality == Qt::WindowModality::ApplicationModal) {
908 "%s: Qt::ApplicationModal policy is unsupported by the platform. The window will behave like Qt::WindowModal.",
912 auto ohosModalityType = mapQtWindowModalityToOhosOrDefault(modality);
913 if (ohosModalityType.has_value())
914 m_ohosWindowProxy->setSubWindowModalEnabled(ohosModalityType.value());
916 m_ohosWindowProxy->setSubWindowModalDisabled();
920void QOhosView::updateWindowTitle(
const QString &title)
922 if (m_ohosWindowProxy !=
nullptr)
923 m_ohosWindowProxy->setTitle(title);
926void QOhosView::scheduleSystemUpdateIfNeeded()
930 m_updatePending = QMetaObject::invokeMethod(
933 flushSystemPropertyUpdatesImmediate();
935 Qt::QueuedConnection);
940 return m_ownerWindow;
945 auto *platformWindow = QOhosPlatformWindow::fromQWindow(m_ownerWindow);
947 auto currentViewTypeInfo = determineViewTypeAndLogicalParent(platformWindow);
948 const bool hadWindowProxy = m_ohosWindowProxy !=
nullptr;
949 const bool needsWindowProxy = !hadWindowProxy
950 && currentViewTypeInfo.viewType != ViewType::EmbeddedWindow;
951 const bool windowProxyRoleChanged = hadWindowProxy
952 && viewType() != currentViewTypeInfo.viewType;
954 if (needsWindowProxy || windowProxyRoleChanged) {
955 auto qOhosWindowProxy = tryCreateWindowProxyIfNeeded(currentViewTypeInfo.viewType, currentViewTypeInfo.optLogicalParent);
957 if (qOhosWindowProxy !=
nullptr
958 && currentViewTypeInfo.viewType == ViewType::SubWindow) {
959 constexpr bool preventSubWindowClose =
true;
960 qOhosWindowProxy->setSubWindowCloseHandler(
962 if (!m_ownerWindow.isNull()) {
963 qOhosPrintfDebug(
"onSubWindowCloseHandler: calling close()");
964 QOhosCloseEventContext::runWithCloseRootCauseSet(
965 QOhosCloseEventContext::CloseRootCause::SubWindowClose,
967 m_ownerWindow->close();
971 preventSubWindowClose);
974 if (qOhosWindowProxy !=
nullptr) {
975 m_nativeNode->setParent(qOhosWindowProxy->nodeXComponent());
976 m_nativeNode->fillToParent();
979 m_viewType = currentViewTypeInfo.viewType;
980 setOrResetWindowProxy(qOhosWindowProxy, currentViewTypeInfo.optLogicalParent);
982 syncWindowStateImmediate();
985 if (viewType() == ViewType::MainWindow) {
986 const auto windowStates = m_ownerWindow->windowStates();
987 if (windowStates.testFlag(Qt::WindowState::WindowFullScreen)) {
993 }
else if (windowStates.testFlag(Qt::WindowState::WindowMaximized)) {
995 }
else if (QOhosDeviceInfo::isPhone()
996 && m_ownerWindow->flags().testFlag(Qt::ExpandedClientAreaHint)) {
997 applyPhoneWindowChrome();
999 }
else if (viewType() == ViewType::SubWindow && m_ohosWindowProxy !=
nullptr) {
1000 m_ohosWindowProxy->setFollowParentMultiScreenPolicy(
true);
1003 if (m_ohosWindowProxy !=
nullptr) {
1009 if (surface !=
nullptr)
1012 m_nativeNode->setVisibility(
true);
1017 if (m_ohosWindowProxy ==
nullptr)
1022 const bool fullScreen = m_ownerWindow->windowStates().testFlag(Qt::WindowFullScreen);
1023 const bool expanded = m_ownerWindow->flags().testFlag(Qt::ExpandedClientAreaHint);
1024 m_ohosWindowProxy->setWindowLayoutFullScreen(fullScreen || expanded);
1025 m_ohosWindowProxy->setWindowSystemBarEnable(
1026 fullScreen ? QStringList{}
1027 : QStringList{ QStringLiteral(
"status"), QStringLiteral(
"navigation") });
1032 auto *windowProxy = flushedWindowProxyOrNull();
1033 if (windowProxy ==
nullptr)
1037 windowProxy->maximize(QOhosWindowProxy::MaximizePresentation::ENTER_IMMERSIVE);
1039 applyPhoneWindowChrome();
1044 auto *windowProxy = flushedWindowProxyOrNull();
1045 if (windowProxy ==
nullptr)
1051 applyPhoneWindowChrome();
1056 auto *windowProxy = flushedWindowProxyOrNull();
1057 if (windowProxy !=
nullptr)
1063 if (m_ohosWindowProxy !=
nullptr) {
1064 if (QGuiApplicationPrivate::focus_window) {
1065 const auto *focusPlatformWindow = QOhosPlatformWindow::fromQWindow(QGuiApplicationPrivate::focus_window);
1066 const auto *focusView = focusPlatformWindow->ownedViewOrNull();
1067 if (focusView && focusView !=
this) {
1068 if (focusView->m_ohosWindowProxy) {
1069 focusView->m_ohosWindowProxy->shiftAppWindowFocus(*m_ohosWindowProxy);
1072 sendAsyncSyntheticWindowActiveEvent();
1078 sendAsyncSyntheticWindowActiveEvent();
1084 auto *windowProxy = flushedWindowProxyOrNull();
1085 if (windowProxy !=
nullptr)
1086 windowProxy->maximize(QOhosWindowProxy::MaximizePresentation::EXIT_IMMERSIVE);
1091 auto *qWindow = window->window();
1092 QNativeNode::CreateInfo createInfo;
1093 createInfo.geometry = window->geometry();
1094 createInfo.window = qWindow;
1095 createInfo.backgroundColor = windowPropertiesProvider.tryGetProperty<QColor, &QOhosPlatformWindow::surfaceBackgroundColorProperty>();
1096 createInfo.renderFitPolicyHint = qTransform(
1097 windowPropertiesProvider.tryGetProperty<
int, &QOhosPlatformWindow::nativeNodeRenderFitPolicyHintProperty>(),
1099 return static_cast<::ArkUI_RenderFit>(renderFit);
1102 QPlatformWindow *parentPlatformWindow = window->parent();
1104 if (parentPlatformWindow !=
nullptr) {
1106 auto *parentView = parentPlatformWindow->ownedViewOrNull();
1107 createInfo.optParent = parentView !=
nullptr
1108 ?
std::optional(parentView->m_nativeNode.get())
1112 auto nativeNode = QSharedPointer<QNativeNode>::create(createInfo);
1113 return std::make_unique<
QOhosView>(qWindow, nativeNode, windowPropertiesProvider);
1119 if (m_ohosWindowProxy !=
nullptr) {
1120 auto windowProperties = m_ohosWindowProxy->getWindowProperties();
1121 result.frameGeometry = windowProperties.windowRect;
1123 result.geometry = windowProperties.drawableRect.translated(windowProperties.windowRect.topLeft());
1128 result.geometry.setSize(
1129 evaluateGeometrySizeBasedOnFrameGeometry(result.geometry.topLeft(), result.frameGeometry));
1130 result.displayId = windowProperties.displayId;
1132 result.frameGeometry = m_nativeNode->geometry().toRect();
1133 result.geometry = result.frameGeometry;
1135 const auto *ancestorViewWithWindow = ancestorViewWithWindowOrNull();
1136 result.displayId = ancestorViewWithWindow !=
nullptr
1137 ? ancestorViewWithWindow->m_ohosWindowProxy->getWindowProperties().displayId
1144QMargins
QOhosView::avoidAreaMargins(QOhosWindowProxy::AvoidAreaType type)
const
1146 auto avoidArea = m_avoidAreasProvider(type);
1148 tryUpdateMaximumMarginsFromAvoidArea(margins, avoidArea);
1154 return m_ohosWindowProxy !=
nullptr ? m_ohosWindowProxy->getDisplayCutoutRects()
1160 return m_viewType.value_or(ViewType::EmbeddedWindow);
1165 auto *platformWindow = QOhosPlatformWindow::fromQWindow(m_ownerWindow);
1166 auto targetWindowGeometry = platformWindow->geometry().marginsAdded(platformWindow->frameMargins());
1168 m_updateData.position.optPendingUpdateRequest = {targetWindowGeometry.topLeft(), {}};
1169 m_updateData.size.optPendingUpdateRequest = targetWindowGeometry.size();
1170 scheduleSystemUpdateIfNeeded();
1175 switch (viewType()) {
1176 case ViewType::MainWindow:
1179 case ViewType::FloatWindow:
1180 case ViewType::SubWindow:
1182 setOrResetWindowProxy(
nullptr,
nullptr);
1183 auto syntheticWindowHiddenEvent = QOhosWindowProxy::WindowEvent {
1184 .type = QOhosWindowProxy::WindowEventType::WINDOW_HIDDEN,
1186 Q_EMIT windowEvent(syntheticWindowHiddenEvent);
1189 case ViewType::EmbeddedWindow:
1190 Q_EMIT windowVisibilityChange(
false);
1194 m_nativeNode->setVisibility(
false);
1204 if (m_ohosWindowProxy !=
nullptr)
1205 m_ohosWindowProxy->setWindowMask(mask);
1210 return m_nativeNode->surfaceOrNull();
1215 return m_nativeNode->windowId();
1220 qCDebug(QtForOhos) <<
"view:" <<
this <<
"setParentOrReparent parentView:" << &parentView;
1221 m_nativeNode->setParent(*parentView.m_nativeNode);
1223 setOrResetWindowProxy(
nullptr, parentView.ownerWindow());
1228 if (viewType() != ViewType::EmbeddedWindow) {
1229 qCDebug(QtForOhos) << Q_FUNC_INFO << m_ownerWindow;
1233 m_nativeNode->detachFromParentIfPresent();
1234 m_optLogicalParent =
nullptr;
1236 if (m_ownerWindow->isVisible() && !m_ohosWindowProxy)
1242 m_nativeNode->setVisibility(visible);
1243 m_lastMainWindowHideMethod = WindowHideMethod::NativeNodeVisibility;
1248 if (m_ohosWindowProxy->tryHideAbility()) {
1249 m_lastMainWindowHideMethod = WindowHideMethod::HideAbility;
1253 if (QOhosPlatformWindow::isWindowBeingClosedOrDestroyed(m_ownerWindow)) {
1258 m_ohosWindowProxy->minimize();
1259 m_lastMainWindowHideMethod = WindowHideMethod::Minimize;
1261 auto *platformWindow = QOhosPlatformWindow::fromQWindow(m_ownerWindow);
1262 if (!platformWindow->windowStates().testFlag(Qt::WindowMinimized))
1263 ++m_pendingSelfMinimizeEchoes;
1268 if (m_ohosWindowProxy ==
nullptr && m_optLogicalParent ==
nullptr)
1271 std::vector<std::function<
void()>> postSurfaceDrawTasks;
1272 auto updatePostSurfaceDrawTask = qScopeGuard([&]() {
1273 if (!postSurfaceDrawTasks.empty()) {
1274 m_optPostSurfaceDrawTask = [postSurfaceDrawTasks = std::move(postSurfaceDrawTasks)]() {
1275 for (
const auto &task: postSurfaceDrawTasks)
1281 if (reason == WindowStateSyncReason::ViewTypeChanged && m_ohosWindowProxy
1282 && viewType() == ViewType::MainWindow) {
1283 postSurfaceDrawTasks.emplace_back(
1284 [weakWindowProxy = QtOhos::makeWeakPtr(m_ohosWindowProxy)]() {
1285 auto windowProxy = weakWindowProxy.lock();
1287 windowProxy->removeStartingWindow();
1291 auto *platformWindow = QOhosPlatformWindow::fromQWindow(m_ownerWindow);
1293 auto targetWindowLimitsToSet =
1294 viewType() == ViewType::EmbeddedWindow
1295 ? std::make_pair(m_ownerWindow->minimumSize(), m_ownerWindow->maximumSize())
1296 : std::make_pair(platformWindow->windowMinimumSize(), platformWindow->windowMaximumSize());
1298 auto windowFlags = QOhosPlatformWindow::platformWindowFlagsForQWindow(m_ownerWindow);
1299 bool focusable = !windowFlags.testFlag(Qt::WindowDoesNotAcceptFocus);
1301 auto submitSystemPropertyUpdate = [](
auto &targetProperty,
const auto &targetValue) {
1302 targetProperty.optPendingUpdateRequest = targetValue;
1305 auto submitOrResetSystemPropertyUpdate = [&submitSystemPropertyUpdate](
1306 auto &targetProperty,
1307 const auto &targetValue,
1310 targetProperty.optPendingUpdateRequest.reset();
1312 submitSystemPropertyUpdate(targetProperty, targetValue);
1315 submitSystemPropertyUpdate(m_updateData.title, m_ownerWindow->title());
1317 auto windowGeometryPersistenceState =
1318 viewType() == ViewType::MainWindow
1319 && m_geometryPersistencePolicy != ViewGeometryPersistencePolicy::Ignore
1320 ? syncWindowGeometryPersistenceState(m_ohosWindowProxy.get())
1321 : WindowGeometryPersistenceState::Disabled;
1324 bool windowGeometrySyncEnabled =
false;
1325 switch (currentRuntimeDeviceTypeAndMode) {
1328 windowGeometrySyncEnabled =
true;
1330 case QOhosRuntimeDeviceTypeAndMode::HandheldDeviceFullScreen:
1331 windowGeometrySyncEnabled = viewType() != ViewType::MainWindow;
1336 switch (viewType()) {
1337 case ViewType::SubWindow:
1338 if (m_optLogicalParent ==
nullptr)
1339 qOhosReportFatalErrorAndAbort(
"%s: logical parent for a subwindow is null", Q_FUNC_INFO);
1340 targetDisplayId = tryGetSubWindowJsDisplayId(m_optLogicalParent, *m_ohosWindowProxy);
1342 case ViewType::MainWindow:
1344 targetDisplayId = m_ohosWindowProxy->tryGetMainWindowJsDisplayId();
1347 case ViewType::FloatWindow:
1348 case ViewType::EmbeddedWindow:
1352 auto targetGeometryToSet = platformWindow->lastRequestedWindowFrameGeometry();
1354 if (windowGeometrySyncEnabled) {
1355 submitSystemPropertyUpdate(m_updateData.sizeLimits, targetWindowLimitsToSet);
1356 submitOrResetSystemPropertyUpdate(
1357 m_updateData.size, targetGeometryToSet.size(), windowGeometryPersistenceState);
1359 if (!qt_window_private(m_ownerWindow)->positionAutomatic) {
1360 submitOrResetSystemPropertyUpdate(
1361 m_updateData.position,
1362 std::make_pair(targetGeometryToSet.topLeft(), targetDisplayId),
1363 windowGeometryPersistenceState);
1367 submitSystemPropertyUpdate(m_updateData.backgroundTransparent, isWindowTransparencyRequested());
1370 submitSystemPropertyUpdate(m_updateData.focusable, focusable);
1372 if (viewType() == ViewType::SubWindow)
1373 submitSystemPropertyUpdate(m_updateData.modality, m_ownerWindow->modality());
1375 submitSystemPropertyUpdate(
1376 m_updateData.windowMinMaxCloseButtonsState,
1378 .maxButtonShown = windowFlags.testFlag(Qt::WindowMaximizeButtonHint),
1379 .minButtonShown = windowFlags.testFlag(Qt::WindowMinimizeButtonHint),
1380 .closeButtonShown = windowFlags.testFlag(Qt::WindowCloseButtonHint),
1383 submitSystemPropertyUpdate(
1384 m_updateData.windowStaysOnTop, windowFlags.testFlag(Qt::WindowStaysOnTopHint));
1386 submitSystemPropertyUpdate(m_updateData.frameless, windowFlags.testFlag(Qt::FramelessWindowHint));
1388 submitSystemPropertyUpdate(
1389 m_updateData.windowTransparentForInput, windowFlags.testFlag(Qt::WindowTransparentForInput));
1391 flushSystemPropertyUpdatesImmediate();
1393 bool disableWindowShadow = windowFlags.testFlag(Qt::WindowType::NoDropShadowWindowHint);
1394 if (disableWindowShadow)
1397 if (!m_ownerWindow->mask().isNull() && m_ohosWindowProxy !=
nullptr) {
1398 m_ohosWindowProxy->setWindowMask(
1399 QOhosWindowProxy::WindowMask {
1400 .windowMaskRegion = m_ownerWindow->mask(),
1402 targetGeometryToSet.size());
1404 const auto privacyModeSetting = m_windowPropertiesProvider
1405 .tryGetProperty<
bool, &QOhosPlatformWindow::windowPrivacyModeSettingProperty>();
1406 if (privacyModeSetting.has_value())
1407 setPrivacyMode(privacyModeSetting.value());
1409 const auto windowCornerRadius = m_windowPropertiesProvider
1410 .tryGetProperty<
double, &QOhosPlatformWindow::windowCornerRadiusProperty>();
1411 if (windowCornerRadius.has_value())
1412 setWindowCornerRadius(windowCornerRadius.value());
1414 const auto keepScreenOn = m_windowPropertiesProvider
1415 .tryGetProperty<
bool, &QOhosPlatformWindow::windowKeepScreenOnProperty>();
1416 if (keepScreenOn.has_value())
1417 setWindowKeepScreenOn(keepScreenOn.value());
1419 auto fixedSizeStateEnabled = m_windowPropertiesProvider
1420 .tryGetProperty<
bool, &QOhosPlatformWindow::windowFixedSizeStateProperty>();
1421 if (fixedSizeStateEnabled.has_value())
1422 setFixedSizeStateEnabled(fixedSizeStateEnabled.value());
1424 auto windowDragResizable = m_windowPropertiesProvider
1425 .tryGetProperty<
bool, &QOhosPlatformWindow::windowDragResizableProperty>();
1426 if (windowDragResizable.has_value())
1427 setWindowDragResizable(windowDragResizable.value());
1432 bool shouldSynchronizeTargetDisplayIdWithQpa =
1433 qt_window_private(m_ownerWindow)->positionAutomatic
1434 && reason == WindowStateSyncReason::ViewTypeChanged
1435 && m_ohosWindowProxy !=
nullptr;
1437 if (shouldSynchronizeTargetDisplayIdWithQpa) {
1438 auto optTargetDisplayId = m_ohosWindowProxy->getWindowProperties().displayId;
1439 if (optTargetDisplayId.has_value()) {
1440 QOhosDisplayInfo::JsDisplayId syntheticDisplayIdChangeEvent = optTargetDisplayId.value();
1441 Q_EMIT windowDisplayIdChanged(syntheticDisplayIdChangeEvent);
1446void QOhosView::flushSystemPropertyUpdatesImmediate()
1448 static const auto systemDataPropertyUpdateFuncPairsTuple = makeSystemUpdateDataPropertyUpdateFuncPairsTuple();
1451 systemDataPropertyUpdateFuncPairsTuple,
1452 [&](
const auto &updateDataMemberPtrUpdateFuncPair) {
1453 auto memberPtr = updateDataMemberPtrUpdateFuncPair.first;
1454 auto updateFuncPtr = updateDataMemberPtrUpdateFuncPair.second;
1455 auto &property = m_updateData.*memberPtr;
1456 auto optUpdateRequest = std::exchange(property.optPendingUpdateRequest, {});
1457 if (optUpdateRequest.has_value())
1458 (
this->*updateFuncPtr)(optUpdateRequest.value());
1460 m_updatePending =
false;
1465 if (m_ohosWindowProxy ==
nullptr)
1468 flushSystemPropertyUpdatesImmediate();
1469 return m_ohosWindowProxy.get();
1474 m_nativeNode->addForeignWindowChild(foreignWindow);
1479 auto *surface = m_nativeNode->surfaceOrNull();
1480 return surface !=
nullptr
1481 ? surface->surfaceResolution()
1487 return m_ohosWindowProxy !=
nullptr
1488 ? m_ohosWindowProxy->getImmersiveModeEnabledState()
1494 if (viewType() == ViewType::SubWindow) {
1495 auto *screen = m_ownerWindow->screen();
1496 return screen !=
nullptr && m_ownerWindow->geometry().size() == screen->geometry().size();
1504 if (m_ohosWindowProxy !=
nullptr) {
1505 m_ohosWindowProxy->setWindowTitleButtonVisible(
1506 state.maxButtonShown, state.minButtonShown, state.closeButtonShown);
1510void QOhosView::updateWindowStaysOnTop(
bool staysOnTop)
1512 if (m_ohosWindowProxy !=
nullptr)
1513 m_ohosWindowProxy->setWindowTopmost(staysOnTop);
1516void QOhosView::updateWindowFrameless(
bool frameless)
1518 bool supportsFramelessWindow = viewType() == ViewType::MainWindow || viewType() == ViewType::SubWindow;
1519 if (m_ohosWindowProxy !=
nullptr && supportsFramelessWindow) {
1520 m_ohosWindowProxy->setWindowDecorVisible(!frameless);
1521 m_ohosWindowProxy->setWindowTitleMoveEnabled(!frameless);
1525void QOhosView::setWindowDragResizable(
bool dragResizable)
1527 if (m_ohosWindowProxy !=
nullptr)
1528 m_ohosWindowProxy->enableDrag(dragResizable);
1533 setSystemUpdateProperty(&SystemUpdateData::windowMinMaxCloseButtonsState, state);
1538 setSystemUpdateProperty(&SystemUpdateData::windowStaysOnTop, staysOnTop);
1543 setSystemUpdateProperty(&SystemUpdateData::frameless, frameless);
1548 if (m_ohosWindowProxy !=
nullptr) {
1549 constexpr double windowShadowDisabledRadius = 0.0;
1550 m_ohosWindowProxy->setWindowShadowRadius(windowShadowDisabledRadius);
1554void QOhosView::setWindowCornerRadius(
double radius)
1556 if (m_ohosWindowProxy !=
nullptr)
1557 m_ohosWindowProxy->setWindowCornerRadius(radius);
1562 setSystemUpdateProperty(&SystemUpdateData::windowTransparentForInput, transparentForInput);
1567 if (m_ohosWindowProxy !=
nullptr)
1568 return m_ohosWindowProxy->startMoving();
1572void QOhosView::setPrivacyMode(
bool privacyModeEnabled)
1574 if (m_ohosWindowProxy !=
nullptr)
1575 m_ohosWindowProxy->setWindowPrivacyMode(privacyModeEnabled);
1579 const std::vector<QImage> &images,
const QPointF &hotspot,
1580 const QMimeData &mimeData, QOhosConsumer<Qt::DropAction> dropActionConsumer)
1582 m_nativeNode->startDrag(images, hotspot, mimeData, std::move(dropActionConsumer));
1587 const auto lastMainWindowHideMethod = std::exchange(m_lastMainWindowHideMethod, {});
1588 if (m_ohosWindowProxy ==
nullptr || !m_ohosWindowProxy->qtIsMainWindow())
1591 if (!lastMainWindowHideMethod.has_value()) {
1592 m_ohosWindowProxy->restore();
1596 switch (lastMainWindowHideMethod.value()) {
1597 case WindowHideMethod::NativeNodeVisibility:
1598 case WindowHideMethod::Minimize:
1599 m_ohosWindowProxy->restore();
1601 case WindowHideMethod::HideAbility:
1602 m_ohosWindowProxy->showAbility();
1608 Qt::WindowStates previousWindowState, Qt::WindowStates currentWindowState)
1610 auto stateChange = previousWindowState ^ currentWindowState;
1611 if (stateChange.testFlag(Qt::WindowState::WindowMinimized) && !currentWindowState.testFlag(Qt::WindowState::WindowMinimized)) {
1612 if (viewType() == ViewType::MainWindow)
1614 else if (m_ohosWindowProxy)
1618 if (stateChange.testFlag(Qt::WindowState::WindowMaximized) && currentWindowState.testFlag(Qt::WindowState::WindowMaximized)) {
1623 if (stateChange.testFlag(Qt::WindowState::WindowFullScreen) && currentWindowState.testFlag(Qt::WindowState::WindowFullScreen)) {
1628 if (stateChange.testFlag(Qt::WindowState::WindowMinimized) && currentWindowState.testFlag(Qt::WindowState::WindowMinimized)) {
1633 if (!currentWindowState) {
1640 Qt::WindowFlags previousWindowFlags, Qt::WindowFlags currentWindowFlags)
1642 const auto flagsChange = previousWindowFlags ^ currentWindowFlags;
1644 bool minMaxCloseButtonStateChanged = (flagsChange & (Qt::WindowMinMaxButtonsHint | Qt::WindowCloseButtonHint)) != 0;
1645 bool framelessChanged = (flagsChange & Qt::FramelessWindowHint) != 0;
1647 if (minMaxCloseButtonStateChanged || framelessChanged) {
1649 .maxButtonShown = currentWindowFlags.testFlag(Qt::WindowMaximizeButtonHint),
1650 .minButtonShown = currentWindowFlags.testFlag(Qt::WindowMinimizeButtonHint),
1651 .closeButtonShown = currentWindowFlags.testFlag(Qt::WindowCloseButtonHint),
1655 bool windowStaysOnTopChanged = (flagsChange & Qt::WindowStaysOnTopHint) != 0;
1656 if (windowStaysOnTopChanged)
1659 bool transparentForInputChanged = (flagsChange & Qt::WindowTransparentForInput) != 0;
1660 if (transparentForInputChanged)
1663 if (framelessChanged)
1666 bool focusableChanged = (flagsChange & Qt::WindowDoesNotAcceptFocus) != 0;
1667 if (focusableChanged) {
1668 bool windowAcceptsFocus = !currentWindowFlags.testFlag(Qt::WindowDoesNotAcceptFocus);
1672 bool disableWindowShadowChanged = (flagsChange & Qt::NoDropShadowWindowHint) != 0;
1673 if (disableWindowShadowChanged && currentWindowFlags.testFlag(Qt::NoDropShadowWindowHint))
1676 bool expandedClientAreaChanged = (flagsChange & Qt::ExpandedClientAreaHint) != 0;
1678 applyPhoneWindowChrome();
1683 return m_nativeNode->nodeAreaInfo();
1695 return !(*
this == other);
1700 m_ohosWindowProxy.reset();
1701 m_ohosWindowProxy = windowProxy
1702 ? QtOhos::makeSharedPtrWithAttachedExtraData<QOhosWindowProxy>(
1704 QWindowProxyRegistry::instance().registerQWindowWithWindowProxy(ownerWindow(), *windowProxy))
1706 m_optLogicalParent = optLogicalParent;
1712 auto *platformWindow = m_optLogicalParent !=
nullptr
1713 ? QOhosPlatformWindow::fromQWindowOrNull(m_optLogicalParent)
1716 return platformWindow !=
nullptr
1717 ? platformWindow->ownedViewOrNull()
1724 while (parent !=
nullptr && !parent->m_ohosWindowProxy)
1727 return parent !=
nullptr && parent->m_ohosWindowProxy
1734 return m_ohosWindowProxy ? m_ohosWindowProxy->snapshot() : QPixmap();
1739 return m_nativeNode->nodeScreenGeometryPixels();
1744 return m_nativeNode->nodeParentRelativeGeometryPixels();
1749 if (m_pendingSelfMinimizeEchoes <= 0)
1752 --m_pendingSelfMinimizeEchoes;
void externalContentClickDetected()
void clearNativeWindowSurface()
void setParentOrReparent(QOhosView &parentView)
bool consumePendingSelfMinimizeEcho()
void setCursor(const QCursor &cursor)
void handleWindowFlagsChange(Qt::WindowFlags previousWindowFlags, Qt::WindowFlags currentWindowFlags)
void addForeignWindowChild(QOhosForeignWindow *foreignWindow)
void handleWindowStateChange(Qt::WindowStates previousWindowState, Qt::WindowStates currentWindowState)
void setFocusable(bool focusable)
QArkUi::QQtEmbeddedWindowNode::NodeAreaInfo nodeAreaInfo() const
QOhosSurface * surfaceOrNull() const
void windowVisibilityChange(bool visibility)
void setPositionOnScreenImmediate(const QPoint &position, QOhosDisplayInfo::JsDisplayId jsDisplayId)
QList< QRect > displayCutoutRects() const
void setTransparentBackground(bool transparent)
void setModality(Qt::WindowModality modality)
bool isFullscreenImmersiveModeEnabled()
void setFramelessWindow(bool frameless)
QPixmap makeSnapshot() const
void setWindowShadowDisabled()
void setWindowTransparentForInput(bool transparentForInput)
void tryDetachFromEmbeddedParent()
ViewType viewType() const
QWindow * ownerWindow() const
void handleSurfaceContentsUpdated()
void forceGeometryUpdate()
void externalContentInteractionDetected()
void setWindowMinMaxCloseButtonState(const WindowMinMaxCloseButtonsState &state)
void setWindowMask(const QOhosWindowProxy::WindowMask &windowMask)
void setSizeLimits(const QSize &minSize, const QSize &maxSize)
std::optional< QSize > surfaceResolution() const
void windowTouchOutside()
void handlePaletteChange()
void windowDisplayIdChanged(QOhosDisplayInfo::JsDisplayId)
void setNativeNodeVisibility(bool visible)
void setWindowStaysOnTop(bool staysOnTop)
ViewGeometry viewGeometry() const
void setSize(const QSize &size)
void setPosition(const QPoint &position)
QOhosView(QWindow *ownerWindow, QSharedPointer< QNativeNode > nativeNode, QOhosPropertiesProvider propertiesProvider)
bool isSubWindowCoveringFullScreen() const
QRect nodeParentRelativeGeometryPixels() const
void setTitle(const QString &title)
const QOhosView * viewParentOrNull() const
QRect nodeScreenGeometryPixels() const
void setWindowRectAutoSave(bool enabed)
static std::shared_ptr< QOhosWindowProxy > createFloatWindow(const FloatWindowCreateInfo &createInfo)
std::optional< QOhosDisplayInfo::JsDisplayId > tryGetMainWindowJsDisplayId() const
QOhosWindowProxyExistingMainWindowCreateInfo ExistingMainWindowCreateInfo
static std::shared_ptr< QOhosWindowProxy > createForExistingMainWindow(const ExistingMainWindowCreateInfo &createInfo)
bool isWindowRectAutoSave() const
QOhosWindowProxySubWindowCreateInfo SubWindowCreateInfo
QtOhos::enums::ohos::window::WindowEventType WindowEventType
QOhosWindowProxyMainWindowCreateInfo MainWindowCreateInfo
QOhosWindowProxyFloatWindowCreateInfo FloatWindowCreateInfo
static std::shared_ptr< QOhosWindowProxy > createMainWindow(const MainWindowCreateInfo &createInfo)
AvoidAreaCache(std::function< AvoidArea(AvoidAreaType)> avoidAreasProvider)
AvoidArea getStoredOrRetrieveFromWindowProxy(AvoidAreaType avoidAreaType)
void put(AvoidAreaType avoidAreaType, const AvoidArea &avoidArea)
static QWindowProxyRegistry & instance()
Combined button and popup list for selecting options.
QSize evaluateGeometrySizeBasedOnFrameGeometry(const QPoint &geometryOrigin, const QRect &frameGeometry)
std::function< void(SignalParams...)> makeViewConditionalSignalEmitter(QPointer< QOhosView > viewPtr, std::function< bool(QOhosView &)> predicate, void(QOhosView::*signalFuncPtr)(SignalParams ...))
std::optional< QColor > tryGetBackgroundColorFromWindow(QWindow *window)
QCursor makeTransparentBitmapCursor(QSize cursorSize)
QWindow * syntheticParentForQWindowOrNull(QWindow *qWindow)
std::optional< QOhosWindowProxy::ModalityType > mapQtWindowModalityToOhosOrDefault(Qt::WindowModality windowModality)
QBitmap getCursorMask(const QCursor &cursor)
WindowGeometryPersistenceState
QSize getQSizeGrownBy(const QSize &size, const QMargins &margins)
void tryUpdateMaximumMarginsFromAvoidArea(QMargins &marginsToUpdate, const QOhosWindowProxy::AvoidArea &avoidArea)
QWindow * getFirstTopLevelWindowWithSystemFocusOrNull()
QWindow * getFirstTopLevelWindowOrNull()
QBitmap getCursorBitmap(const QCursor &cursor)
ViewGeometryPersistencePolicy determineViewGeometryPersistencePolicy()
std::optional< QOhosDisplayInfo::JsDisplayId > tryGetSubWindowJsDisplayId(QWindow *logicalParent, QOhosWindowProxy &windowProxy)
ViewTypeInfo determineViewTypeAndLogicalParent(const QOhosPlatformWindow *platformWindow)
WindowGeometryPersistenceState syncWindowGeometryPersistenceState(QOhosWindowProxy *windowProxy)
QImage createImageFromBitmapAndMask(const QBitmap &bitmap, const QBitmap &mask)
bool acquireAndCleanPendingAutoStartedInstanceWindowFlag()
bool isHandheldDeviceType()
QOhosRuntimeDeviceTypeAndMode
@ HandheldDeviceFullScreen
@ HandheldDeviceWindowPcMode
QOhosRuntimeDeviceTypeAndMode queryQOhosRuntimeDeviceAndMode()
std::string qAbilityInstanceId
bool disableWindowFocusableBeforeLoadContentHack
std::string qAbilityInstanceId
QWindow * optLogicalParent
QOhosView::ViewType viewType