4#include <qohosplatformwindow.h>
6#include <QtCore/private/qohoslogger_p.h>
7#include <QtCore/qpointer.h>
8#include <QtGui/private/qguiapplication_p.h>
9#include <QtGui/private/qhighdpiscaling_p.h>
10#include <QtGui/private/qohoswindowhints_p.h>
11#include <QtGui/private/qwindow_p.h>
16#include <qguiapplication.h>
17#include <qohosdeviceinfo_p.h>
18#include <qohosinputcontext.h>
19#include <qohosinputmethodeventhandler.h>
20#include <qohosjsmain.h>
21#include <qohosplatformintegration.h>
22#include <qohosplatformscreen.h>
23#include <qohosruntimedevicetypeandmode.h>
24#include <qohossettings.h>
25#include <qohosutils.h>
26#include <qpa/qwindowsysteminterface.h>
27#include <render/qohosview.h>
28#include <render/qwindowproxyregistry.h>
40 auto *platformWindow = QOhosPlatformWindow::fromQWindowOrNull(targetWindow);
41 if (platformWindow ==
nullptr) {
42 qCWarning(QtForOhos,
"%s: Target window does not contain PlatformWindow", Q_FUNC_INFO);
46 auto *view = platformWindow->ownedViewOrNull();
47 if (view ==
nullptr) {
48 qCCritical(QtForOhos,
"%s: Target window does not contain a view", Q_FUNC_INFO);
75 m_windowFlags = Qt::Widget;
76 m_windowState = window->windowStates();
77 m_windowId = QtOhos::InternalWindowId::generate();
82 const bool frameTopLeftGiven =
83 qt_window_private(window())->positionPolicy == QWindowPrivate::WindowFrameInclusive;
84 const QMargins margins = frameMargins();
85 const QRect clientRect = frameTopLeftGiven
86 ? rect.translated(margins.left(), margins.top())
90 "%s: pos: %d,%d size: %d,%d",
92 clientRect.x(), clientRect.y(),
93 clientRect.width(), clientRect.height());
95 m_lastRequestedWindowFrameGeometry = clientRect.marginsAdded(margins);
96 QPlatformWindow::setGeometry(clientRect);
101 QRect availableGeometry = screen()->availableGeometry();
102 return geometry().width() > 0
103 && geometry().height() > 0
104 && availableGeometry.width() > 0
105 && availableGeometry.height() > 0;
111 QPlatformWindow::setVisible(visible);
117 if (view !=
nullptr) {
119 view->setCursor(cursor);
127 view->setTitle(title);
132 if (newParent !=
nullptr && newParent->isForeignWindow())
133 qOhosReportFatalErrorAndAbort(
"Reparenting to foreign windows is not supported");
139 if (newParent ==
nullptr) {
150 if (!m_displayId.has_value())
151 return QPlatformWindow::screen();
155 if (platformScreen !=
nullptr)
156 return platformScreen;
159 << Q_FUNC_INFO <<
"window:" << window()
160 <<
"display id" << m_displayId.value().value()
161 <<
"has no platform screen. Returning QWindow associated one.";
163 return QPlatformWindow::screen();
168 if (m_windowState == state)
171 auto oldWindowState = std::exchange(m_windowState, state);
172 onWindowStateChanged(oldWindowState, m_windowState);
177 static QSet<Qt::WindowType> disableFocusableWindowTypes{Qt::ToolTip, Qt::Popup};
179 auto *qWindow = window();
180 auto correctedFlags = flags;
181 bool ohosOverrideDisableFocusableFeatures = disableFocusableWindowTypes.contains(qWindow->type());
182 if (ohosOverrideDisableFocusableFeatures) {
185 "Setting Qt::WindowDoesNotAcceptFocus flag on window %s(%s) because of its type",
186 qPrintable(internalWindowId().toString()),
187 qPrintable(qWindow->objectName()));
188 correctedFlags.setFlag(Qt::WindowDoesNotAcceptFocus,
true);
191 if (correctedFlags.testFlag(Qt::FramelessWindowHint)) {
192 correctedFlags.setFlag(Qt::WindowMaximizeButtonHint,
false);
193 correctedFlags.setFlag(Qt::WindowMinimizeButtonHint,
false);
194 correctedFlags.setFlag(Qt::WindowCloseButtonHint,
false);
195 }
else if (!correctedFlags.testFlag(Qt::CustomizeWindowHint)) {
196 correctedFlags.setFlag(Qt::WindowMaximizeButtonHint,
true);
197 correctedFlags.setFlag(Qt::WindowMinimizeButtonHint,
true);
198 correctedFlags.setFlag(Qt::WindowCloseButtonHint,
true);
201 auto previousWindowFlags = std::exchange(m_windowFlags, correctedFlags);
202 onWindowFlagsChanged(previousWindowFlags, m_windowFlags);
207 return m_windowFlags;
212 return static_cast<QOhosPlatformScreen *>(screen());
217 return m_lastRequestedWindowFrameGeometry;
226 setWindowOrWidgetProperty<
bool, &windowFixedSizeStateProperty>(
227 window(), windowMinimumSize() == windowMaximumSize());
229 view->setSizeLimits(windowMinimumSize(), windowMaximumSize());
244 auto internalId = internalWindowId();
246 if (!jsWinId.has_value())
250 "PlatformWindow WIID: %s is returning JsWindowId: %f to the user",
251 qPrintable(internalId.toString()), jsWinId.value().value());
253 return jsWinId.value().value();
259 return view ? view->abilityObjectRef() : QHarmonyJsObjectRef();
265 return view ? view->jsWindowObjectRef() : QHarmonyJsObjectRef();
270 return window()->isTopLevel();
275 constexpr Qt::WindowType showWithoutDecorationWindowTypes[] = {
276 Qt::WindowType::Popup,
277 Qt::WindowType::SplashScreen,
278 Qt::WindowType::ToolTip,
281 auto *qWindow = window();
282 bool showWithoutDecoration =
283 qWindow->parent() !=
nullptr
285 std::begin(showWithoutDecorationWindowTypes),
286 std::end(showWithoutDecorationWindowTypes),
287 qWindow->type()) != std::end(showWithoutDecorationWindowTypes)
288 || windowFlags().testFlag(Qt::WindowType::FramelessWindowHint)
289 || floatWindowTagValueOrFalse();
291 return showWithoutDecoration
298 if (m_optFrameMargins)
299 return *m_optFrameMargins;
307 if (screen ==
nullptr)
312 constexpr auto predefinedWindowTitleBarHeight = 37;
313 const int titlebarHeightPixels =
std::round(predefinedWindowTitleBarHeight * screen->pixelScalingCoefficient());
314 return QMargins{0, titlebarHeightPixels, 0, 0};
327 auto *platformWindow = window->handle();
328 return platformWindow !=
nullptr
336 if (platformWindow ==
nullptr)
337 qOhosReportFatalErrorAndAbort(
"QWindow %s does not have QPlatformWindow", qPrintable(window->objectName()));
338 return platformWindow;
341void QOhosPlatformWindow::tagWindowOrWidgetAsSubWindowOf(QObject *windowOrWidgetToTag, QWindow *targetMainWindow)
343 setWindowOrWidgetProperty<QWindow *, &subWindowOfTagProperty>(windowOrWidgetToTag, targetMainWindow);
346void QOhosPlatformWindow::tagWindowOrWidgetAsMainWindow(QObject *windowOrWidgetToTag,
bool forceMainWindow)
348 setWindowOrWidgetProperty<
bool, &mainWindowTagProperty>(windowOrWidgetToTag, forceMainWindow);
352 QObject *windowOrWidgetToTag,
bool showAsFloatWindow)
354 setWindowOrWidgetProperty<
bool, &floatWindowTagProperty>(windowOrWidgetToTag, showAsFloatWindow);
359 auto *tagValue = QOhosPlatformWindow::getWindowOrWidgetAsSubWindowOfTagValue(window());
360 const auto &allWindows = QGuiApplicationPrivate::window_list;
361 bool tagValueValid = tagValue !=
nullptr && allWindows.contains(tagValue);
363 QtForOhos,
"Window %s(%s) - subWindowOf tag %s value: %p",
364 qPrintable(internalWindowId().toString()), qPrintable(window()->objectName()),
365 tagValueValid ?
"valid" :
"invalid",
368 return tagValueValid ? tagValue :
nullptr;
373 return m_propertiesStore.tryGetProperty<
bool, &mainWindowTagProperty>().value_or(
false);
378 const auto showWithoutActivating = window()->property(
"_q_showWithoutActivating");
379 return showWithoutActivating.isValid() && showWithoutActivating.toBool() && window()->modality() == Qt::NonModal;
384 return tryGetWindowOrWidgetProperty<QWindow *, &subWindowOfTagProperty>(windowOrWidget).value_or(
nullptr);
389 auto *platformWindow = QOhosPlatformWindow::fromQWindow(window);
390 return platformWindow->windowFlags();
395 auto *platformWindow = QOhosPlatformWindow::fromQWindowOrNull(window);
396 auto *view = platformWindow !=
nullptr ? platformWindow->ownedViewOrNull() :
nullptr;
397 return view !=
nullptr && view->viewType() == QOhosView::ViewType::EmbeddedWindow;
402 auto windows =
qGuiApp->allWindows();
403 for (
auto *window : windows) {
404 if (window->type() == Qt::Popup && window->isVisible())
405 QWindowSystemInterface::handleCloseEvent(window);
416 auto *qWindow = window();
418 setWindowFlags(qWindow->flags());
420 auto initialWindowGeom = windowGeometry();
422 QOhosPlatformWindow::setGeometry(initialGeom);
429 return m_windowState;
434 if (m_lastWindowState != state) {
435 m_windowState = state;
436 m_lastWindowState = state;
437 QWindowSystemInterface::handleWindowStateChanged(window(), m_windowState);
443 if (windowFlags().testFlag(Qt::WindowDoesNotAcceptFocus))
453 const auto refusedState = m_windowState;
454 m_windowState &= ~(Qt::WindowMaximized | Qt::WindowFullScreen);
455 QWindowSystemInterface::handleWindowStateChanged(window(), m_windowState, refusedState);
460 bool marginsChanged = !m_optFrameMargins || *m_optFrameMargins != margins;
464 if (m_optFrameMargins) {
465 *m_optFrameMargins = margins;
467 m_optFrameMargins = std::make_unique<QMargins>(margins);
470 qCDebug(QtForOhos) <<
"Window margins changed: " << *m_optFrameMargins;
475 return m_safeAreaMargins;
480 if (m_safeAreaMargins == margins)
483 m_safeAreaMargins = margins;
484 qCDebug(QtForOhos) <<
"Safe area margins changed: " << m_safeAreaMargins;
492 if (exposed && !m_optLastReportedWindowSize) {
493 m_optLastReportedWindowSize = geometry().size();
494 QWindowSystemInterface::handleGeometryChange(window(), geometry());
502 auto *qWindow = window();
504 bool needsGeometryUpdate =
506 && view->viewType() == QOhosView::ViewType::EmbeddedWindow
507 && window()->isVisible();
508 if (needsGeometryUpdate) {
509 auto scaledGeometry = window()->geometry();
510 qWindow->setGeometry(scaledGeometry);
514 qWindow->requestUpdate();
515 setWindowGeometryFromOhos(windowGeometry());
519 QWindow *targetWindow, QObject *surfaceConsumerContext,
520 std::function<
void(
std::optional<
void *>)> surfaceConsumer)
526 surfaceConsumerContext->metaObject()->className());
528 auto *view = getWindowsViewOrNull(targetWindow);
532 if (surfaceConsumerContext->thread() != view->thread() || view->thread() != QThread::currentThread()) {
533 qOhosReportFatalErrorAndAbort(
534 "%s: inter-thread surface consumer connection is not supported", Q_FUNC_INFO);
537 auto sharedSurfaceConsumer = QtOhos::moveToSharedPtr(std::move(surfaceConsumer));
539 auto *surface = view->surfaceOrNull();
540 if (surface !=
nullptr) {
541 QMetaObject::invokeMethod(
542 surfaceConsumerContext,
543 [weakSurfaceConsumer = std::weak_ptr<
decltype(surfaceConsumer)>(sharedSurfaceConsumer),
544 targetWindow = QPointer<QWindow>(targetWindow)]() {
545 auto sharedSurfaceConsumer = weakSurfaceConsumer.lock();
546 if (!sharedSurfaceConsumer || targetWindow ==
nullptr)
549 auto *view = getWindowsViewOrNull(targetWindow);
553 auto *surface = view->surfaceOrNull();
554 (*sharedSurfaceConsumer)(
556 ? std::optional<
void *>(surface->nativeWindow())
559 Qt::QueuedConnection);
562 auto surfaceStatusChangedConnectionHandle = QObject::connect(
563 view, &QOhosView::surfaceStatusChanged, surfaceConsumerContext,
564 [view = QPointer<QOhosView>(view), sharedSurfaceConsumer](
const std::optional<QSize> &) {
567 auto *surface = view->surfaceOrNull();
568 (*sharedSurfaceConsumer)(
570 ? std::optional<
void *>(surface->nativeWindow())
574 if (!surfaceStatusChangedConnectionHandle) {
577 "%s: Connection between ohos view and surface consumer context failed",
582 auto viewDestroyedConnectionHandle = QObject::connect(
583 view, &QObject::destroyed, surfaceConsumerContext,
584 [sharedSurfaceConsumer]() {
585 (*sharedSurfaceConsumer)({});
587 Qt::QueuedConnection);
589 if (!viewDestroyedConnectionHandle) {
592 "%s: Connecting view destroyed signal to surface consumer context failed",
597 return QtOhos::makeDestroyNotifier(
598 [surfaceStatusChangedConnectionHandle = std::move(surfaceStatusChangedConnectionHandle),
599 viewDestroyedConnectionHandle = std::move(viewDestroyedConnectionHandle)] ()
mutable {
600 QObject::disconnect(surfaceStatusChangedConnectionHandle);
601 QObject::disconnect(viewDestroyedConnectionHandle);
607 return m_propertiesStore.tryGetProperty<
bool, &floatWindowTagProperty>().value_or(
false);
617 if (m_displayId != displayId) {
618 m_displayId = displayId;
621 <<
"Screen changed - window:" << window()
622 <<
"displayId:" << (displayId.has_value()
623 ? QString::number(displayId.value().value())
624 : QString::fromUtf8(
"<NO DISPLAY>"));
627 ? QOhosPlatformIntegration::instance()
628 ->screenManager()->platformScreenForDisplayIdOrNull(m_displayId.value())
631 QWindowSystemInterface::handleWindowScreenChanged(
641 qCDebug(QtForOhos) <<
"window:" << window() <<
"geometry change to:" << nativeWindowDrawGeometry;
642 m_optLastReportedWindowSize = nativeWindowDrawGeometry.size();
643 QWindowSystemInterface::handleGeometryChange(window(), nativeWindowDrawGeometry);
651 return m_optLastReportedWindowSize.value_or(
652 QHighDpi::toNativeWindowGeometry(qt_window_private(window())->geometry, window()).size());
665 if (ohosInputContext !=
nullptr) {
666 ohosInputContext->setLastInputTypeToTriggerSoftKeyboard(QOhosInputContext::RequestKeyboardReason::NONE);
684 return QOhosPropertiesProvider(m_propertiesStore);
689 qCDebug(QtForOhos) << Q_FUNC_INFO <<
"window:" << window() <<
"grab:" << grab;
693 inputHandler->grabMouse(window());
702 qCDebug(QtForOhos) << Q_FUNC_INFO <<
"window:" << window() <<
"grab:" << grab;
706 inputHandler->grabKeyboard(window());
715 auto platformWindowFlags = QOhosPlatformWindow::platformWindowFlagsForQWindow(window());
716 return !platformWindowFlags.testFlag(Qt::WindowDoesNotAcceptFocus);
721 auto platformWindowFlags = QOhosPlatformWindow::platformWindowFlagsForQWindow(window());
722 return !platformWindowFlags.testFlag(Qt::WindowTransparentForInput);
727 switch (event->type()) {
728 case QEvent::ApplicationPaletteChange:
732 case QEvent::DynamicPropertyChange: {
733 auto propertyName =
static_cast<QDynamicPropertyChangeEvent *>(event)->propertyName();
734 m_propertiesStore.notifyPropertyWrite(propertyName);
738 case QEvent::WindowUnblocked:
740 inputMethodEventHandler->forgetEnteredWindow(window());
745 return QPlatformWindow::windowEvent(event);
750 QWindowPrivate *windowPriv = qt_window_private(window);
751 return windowPriv && (windowPriv->inClose || windowPriv->visibilityOnDestroy);
756 auto exposedSize = m_exposed
760 QWindowSystemInterface::handleExposeEvent(window(), QRegion(QRect(QPoint(), exposedSize)));
QOhosPlatformScreen * platformScreenForDisplayIdOrNull(QOhosDisplayInfo::JsDisplayId displayId) const
void setParentOrReparent(QOhosView &parentView)
void tryDetachFromEmbeddedParent()
void forceGeometryUpdate()
void handlePaletteChange()
QRect window() const
Returns the window rectangle.
static QWindowProxyRegistry & instance()
Combined button and popup list for selecting options.
constexpr int defaultWindowHeight
QOhosView * getWindowsViewOrNull(QWindow *targetWindow)
constexpr int defaultWindowWidth