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/qwindow_p.h>
14#include <qguiapplication.h>
15#include <qohosdeviceinfo_p.h>
16#include <qohosinputcontext.h>
17#include <qohosinputmethodeventhandler.h>
18#include <qohosjsmain.h>
19#include <qohosplatformintegration.h>
20#include <qohosplatformscreen.h>
21#include <qohosqpafunctions_p.h>
22#include <qohosruntimedevicetypeandmode.h>
23#include <qohossettings.h>
24#include <qohosutils.h>
25#include <qpa/qwindowsysteminterface.h>
26#include <render/qohosview.h>
27#include <private/qwindow_p.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 QRect adjustedRect = rect;
83 if (qt_window_private(
const_cast<QWindow *>(window()))->positionPolicy
84 == QWindowPrivate::WindowFrameInclusive) {
85 const auto margins = frameMargins();
86 adjustedRect.adjust(margins.left(), margins.top(), -margins.right(), -margins.bottom());
90 "%s: pos: %d,%d size: %d,%d",
92 adjustedRect.x(), adjustedRect.y(),
93 adjustedRect.width(), adjustedRect.height());
94 QPlatformWindow::setGeometry(adjustedRect);
99 QRect availableGeometry = screen()->availableGeometry();
100 return geometry().width() > 0
101 && geometry().height() > 0
102 && availableGeometry.width() > 0
103 && availableGeometry.height() > 0;
109 QPlatformWindow::setVisible(visible);
115 if (view !=
nullptr) {
117 view->setCursor(cursor);
125 view->setTitle(title);
130 if (newParent !=
nullptr && newParent->isForeignWindow())
131 qOhosReportFatalErrorAndAbort(
"Reparenting to foreign windows is not supported");
137 if (newParent ==
nullptr) {
148 if (platformScreen ==
nullptr) {
149 qCWarning(QtForOhos) << Q_FUNC_INFO <<
"platform screen is null. Ignoring";
154 if (view ==
nullptr) {
155 qCWarning(QtForOhos) << Q_FUNC_INFO <<
"view is nullptr";
160 m_lastRequestedDisplayId = makeQOhosOptional(screenDisplayId);
162 if (view->viewType() == QOhosView::ViewType::EmbeddedWindow) {
163 qCWarning(QtForOhos) << Q_FUNC_INFO <<
"view is of invalid type";
167 if (m_displayId == screenDisplayId) {
168 qCWarning(QtForOhos) << Q_FUNC_INFO <<
"Screen has not changed. Ignoring";
172 auto currentWindowPosition = windowFrameGeometry().topLeft();
173 auto availableArea = platformScreen->availableGeometry();
175 auto adjustedWindowPosition = QPoint(
176 qBound<
int>(availableArea.left(), currentWindowPosition.x(), availableArea.right()),
177 qBound<
int>(availableArea.top(), currentWindowPosition.y(), availableArea.bottom()));
180 << Q_FUNC_INFO <<
"window:" << window()
181 <<
"screen id" << screenDisplayId.value()
182 <<
"target position:" << adjustedWindowPosition;
184 view->setPositionOnScreenImmediate(adjustedWindowPosition, screenDisplayId);
190 if (!m_displayId.hasValue())
191 return QPlatformWindow::screen();
195 if (platformScreen !=
nullptr)
196 return platformScreen;
199 << Q_FUNC_INFO <<
"window:" << window()
200 <<
"display id" << m_displayId.value().value()
201 <<
"has no platform screen. Returning QWindow associated one.";
203 return QPlatformWindow::screen();
208 if (m_windowState == state)
211 auto oldWindowState =
std::exchange(m_windowState, state);
212 onWindowStateChanged(oldWindowState, m_windowState);
217 static QSet<Qt::WindowType> disableFocusableWindowTypes{Qt::ToolTip, Qt::Popup};
219 auto *qWindow = window();
220 auto correctedFlags = flags;
221 bool ohosOverrideDisableFocusableFeatures = disableFocusableWindowTypes.contains(qWindow->type());
222 if (ohosOverrideDisableFocusableFeatures) {
225 "Setting Qt::WindowDoesNotAcceptFocus flag on window %s(%s) because of its type",
226 qPrintable(internalWindowId().toString()),
227 qPrintable(qWindow->objectName()));
228 correctedFlags.setFlag(Qt::WindowDoesNotAcceptFocus,
true);
231 if (correctedFlags.testFlag(Qt::FramelessWindowHint)) {
232 correctedFlags.setFlag(Qt::WindowMaximizeButtonHint,
false);
233 correctedFlags.setFlag(Qt::WindowMinimizeButtonHint,
false);
234 correctedFlags.setFlag(Qt::WindowCloseButtonHint,
false);
235 }
else if (!correctedFlags.testFlag(Qt::CustomizeWindowHint)) {
236 correctedFlags.setFlag(Qt::WindowMaximizeButtonHint,
true);
237 correctedFlags.setFlag(Qt::WindowMinimizeButtonHint,
true);
238 correctedFlags.setFlag(Qt::WindowCloseButtonHint,
true);
241 auto previousWindowFlags =
std::exchange(m_windowFlags, correctedFlags);
242 onWindowFlagsChanged(previousWindowFlags, m_windowFlags);
247 return m_windowFlags;
252 return static_cast<QOhosPlatformScreen *>(screen());
266 setWindowOrWidgetProperty<
bool, &windowFixedSizeStateProperty>(
267 window(), windowMinimumSize() == windowMaximumSize());
269 view->setSizeLimits(windowMinimumSize(), windowMaximumSize());
274 return !m_lastExposedRegion.isEmpty();
284 return window()->isTopLevel();
289 constexpr Qt::WindowType showWithoutDecorationWindowTypes[] = {
290 Qt::WindowType::Popup,
291 Qt::WindowType::SplashScreen,
292 Qt::WindowType::ToolTip,
295 auto *qWindow = window();
296 bool showWithoutDecoration =
297 qWindow->parent() !=
nullptr
299 std::begin(showWithoutDecorationWindowTypes),
300 std::end(showWithoutDecorationWindowTypes),
301 qWindow->type()) != std::end(showWithoutDecorationWindowTypes)
302 || windowFlags().testFlag(Qt::WindowType::FramelessWindowHint)
303 || floatWindowTagValueOrFalse();
305 return showWithoutDecoration
312 if (m_optFrameMargins)
313 return *m_optFrameMargins;
321 if (screen ==
nullptr)
326 constexpr auto predefinedWindowTitleBarHeight = 37;
327 const int titlebarHeightPixels =
std::round(predefinedWindowTitleBarHeight * screen->pixelScalingCoefficient());
328 return QMargins{0, titlebarHeightPixels, 0, 0};
341 auto *platformWindow = window->handle();
342 return platformWindow !=
nullptr
350 if (platformWindow ==
nullptr)
351 qOhosReportFatalErrorAndAbort(
"QWindow %s does not have QPlatformWindow", qPrintable(window->objectName()));
352 return platformWindow;
355void QOhosPlatformWindow::tagWindowOrWidgetAsSubWindowOf(QObject *windowOrWidgetToTag, QWindow *targetMainWindow)
357 setWindowOrWidgetProperty<QWindow *, &subWindowOfTagProperty>(windowOrWidgetToTag, targetMainWindow);
360void QOhosPlatformWindow::tagWindowOrWidgetAsMainWindow(QObject *windowOrWidgetToTag,
bool forceMainWindow)
362 setWindowOrWidgetProperty<
bool, &mainWindowTagProperty>(windowOrWidgetToTag, forceMainWindow);
366 QObject *windowOrWidgetToTag,
bool showAsFloatWindow)
368 setWindowOrWidgetProperty<
bool, &floatWindowTagProperty>(windowOrWidgetToTag, showAsFloatWindow);
373 setWindowOrWidgetProperty<
bool, &windowPrivacyModeSettingProperty>(window, privacyModeEnabled);
378 setWindowOrWidgetProperty<
double, &windowCornerRadiusProperty>(windowOrWidget, radius);
383 auto *tagValue = QOhosPlatformWindow::getWindowOrWidgetAsSubWindowOfTagValue(window());
384 const auto &allWindows = QGuiApplicationPrivate::window_list;
385 bool tagValueValid = tagValue !=
nullptr && allWindows.contains(tagValue);
387 QtForOhos,
"Window %s(%s) - subWindowOf tag %s value: %p",
388 qPrintable(internalWindowId().toString()), qPrintable(window()->objectName()),
389 tagValueValid ?
"valid" :
"invalid",
392 return tagValueValid ? tagValue :
nullptr;
397 return m_propertiesStore.tryGetProperty<
bool, &mainWindowTagProperty>().valueOr(
false);
402 const auto showWithoutActivating = window()->property(
"_q_showWithoutActivating");
403 return showWithoutActivating.isValid() && showWithoutActivating.toBool() && window()->modality() == Qt::NonModal;
408 return tryGetWindowOrWidgetProperty<QWindow *, &subWindowOfTagProperty>(windowOrWidget).valueOr(
nullptr);
414 setWindowOrWidgetProperty<
NativeNodeRenderFitPolicy, &nativeNodeRenderFitPolicyHintProperty>(windowOrWidget, renderFitPolicy);
419 auto *platformWindow = QOhosPlatformWindow::fromQWindow(window);
420 return platformWindow->windowFlags();
425 setWindowOrWidgetProperty<QColor, &surfaceBackgroundColorProperty>(windowOrWidget, color);
430 setWindowOrWidgetProperty<
bool, &windowKeepScreenOnProperty>(windowOrWidget, keepScreenOn);
435 setWindowOrWidgetProperty<
int, &windowBrightnessProperty>(windowOrWidget, brightness);
440 setWindowOrWidgetProperty<
int, &windowContrastProperty>(windowOrWidget, contrast);
445 setWindowOrWidgetProperty<
int, &windowSaturationProperty>(windowOrWidget, saturation);
450 auto windows =
qGuiApp->allWindows();
451 for (
auto *window : windows) {
452 if (window->type() == Qt::Popup && window->isVisible())
453 QWindowSystemInterface::handleCloseEvent(window);
464 auto *qWindow = window();
466 setWindowFlags(qWindow->flags());
468 auto initialWindowGeom = windowGeometry();
470 setGeometry(initialGeom);
477 return m_windowState;
482 if (m_windowState != state) {
483 m_windowState = state;
484 QWindowSystemInterface::handleWindowStateChanged(window(), m_windowState);
490 if (windowFlags().testFlag(Qt::WindowDoesNotAcceptFocus))
500 bool marginsChanged = !m_optFrameMargins || *m_optFrameMargins != margins;
504 if (m_optFrameMargins) {
505 *m_optFrameMargins = margins;
507 m_optFrameMargins = std::make_unique<QMargins>(margins);
510 qCDebug(QtForOhos) <<
"Window margins changed: " << *m_optFrameMargins;
515 auto *qWindow = window();
517 bool needsGeometryUpdate =
519 && view->viewType() == QOhosView::ViewType::EmbeddedWindow
520 && window()->isVisible();
521 if (needsGeometryUpdate) {
522 auto scaledGeometry = window()->geometry();
523 qWindow->setGeometry(scaledGeometry);
527 qWindow->requestUpdate();
528 setWindowGeometryFromOhos(windowGeometry());
532 QWindow *targetWindow, QObject *surfaceConsumerContext,
539 surfaceConsumerContext->metaObject()->className());
541 auto *view = getWindowsViewOrNull(targetWindow);
545 auto sharedSurfaceConsumer = QtOhos::moveToSharedPtr(std::move(surfaceConsumer));
547 auto *surface = view->surfaceOrNull();
548 if (surface !=
nullptr) {
549 QMetaObject::invokeMethod(
550 surfaceConsumerContext,
551 [weakSurfaceConsumer = std::weak_ptr<
decltype(surfaceConsumer)>(sharedSurfaceConsumer),
552 targetWindow = QPointer<QWindow>(targetWindow)]() {
553 auto sharedSurfaceConsumer = weakSurfaceConsumer.lock();
554 if (!sharedSurfaceConsumer || targetWindow ==
nullptr)
557 auto *view = getWindowsViewOrNull(targetWindow);
561 auto *surface = view->surfaceOrNull();
562 (*sharedSurfaceConsumer)(
564 ? QOhosOptional<
void *>(surface->nativeWindow())
565 : makeEmptyQOhosOptional());
567 Qt::QueuedConnection);
570 auto surfaceStatusChangedConnectionHandle = QObject::connect(
571 view, &QOhosView::surfaceStatusChanged, surfaceConsumerContext,
572 [view = QPointer<QOhosView>(view), sharedSurfaceConsumer]() {
575 auto *surface = view->surfaceOrNull();
576 (*sharedSurfaceConsumer)(
578 ? QOhosOptional<
void *>(surface->nativeWindow())
579 : makeEmptyQOhosOptional());
580 }, Qt::QueuedConnection);
582 if (!surfaceStatusChangedConnectionHandle) {
585 "%s: Connection between ohos view and surface consumer context failed",
590 auto viewDestroyedConnectionHandle = QObject::connect(
591 view, &QObject::destroyed, surfaceConsumerContext,
592 [sharedSurfaceConsumer]() {
593 (*sharedSurfaceConsumer)(makeEmptyQOhosOptional());
595 Qt::QueuedConnection);
597 if (!viewDestroyedConnectionHandle) {
600 "%s: Connecting view destroyed signal to surface consumer context failed",
605 return QtOhos::makeDestroyNotifier(
606 [surfaceStatusChangedConnectionHandle = std::move(surfaceStatusChangedConnectionHandle),
607 viewDestroyedConnectionHandle = std::move(viewDestroyedConnectionHandle)] ()
mutable {
608 QObject::disconnect(surfaceStatusChangedConnectionHandle);
609 QObject::disconnect(viewDestroyedConnectionHandle);
615 return m_propertiesStore.tryGetProperty<
bool, &floatWindowTagProperty>().valueOr(
false);
620 m_lastExposedRegion = QRegion();
621 QWindowSystemInterface::handleExposeEvent(window(), m_lastExposedRegion);
626 auto fullWindowExposedRegion = QRegion{QRect{{}, windowGeometry().size()}};
627 if (m_lastExposedRegion.intersected(fullWindowExposedRegion) != fullWindowExposedRegion) {
628 m_lastExposedRegion = fullWindowExposedRegion;
629 QWindowSystemInterface::handleExposeEvent(window(), fullWindowExposedRegion);
640 if (m_displayId != displayId) {
641 m_displayId = displayId;
644 <<
"Screen changed - window:" << window()
645 <<
"displayId:" << (displayId.hasValue()
646 ? QString::number(displayId.value().value())
647 : QString::fromUtf8(
"<NO DISPLAY>"));
650 ? QOhosPlatformIntegration::instance()
651 ->screenManager()->platformScreenForDisplayIdOrNull(m_displayId.value())
654 QWindowSystemInterface::handleWindowScreenChanged(
664 if (nativeWindowDrawGeometry == m_lastReportedGeometryFromSystem && nativeWindowDrawGeometry == windowGeometry())
667 auto optOldGeometry =
std::exchange(m_lastReportedGeometryFromSystem, nativeWindowDrawGeometry);
668 if (optOldGeometry.hasValue()) {
669 qCDebug(QtForOhos) <<
"window:" << window() <<
"geometry change from:"
670 << optOldGeometry.value() <<
"to:" << nativeWindowDrawGeometry;
672 QWindowSystemInterface::handleGeometryChange(window(), nativeWindowDrawGeometry);
673 QWindowSystemInterface::handleExposeEvent(window(), QRect(QPoint(), nativeWindowDrawGeometry.size()));
686 if (ohosInputContext !=
nullptr) {
687 ohosInputContext->setLastInputTypeToTriggerSoftKeyboard(QOhosInputContext::RequestKeyboardReason::NONE);
705 return QOhosPropertiesProvider(m_propertiesStore);
710 qCDebug(QtForOhos) << Q_FUNC_INFO <<
"window:" << window() <<
"grab:" << grab;
714 inputHandler->grabMouse(window());
723 qCDebug(QtForOhos) << Q_FUNC_INFO <<
"window:" << window() <<
"grab:" << grab;
727 inputHandler->grabKeyboard(window());
736 auto platformWindowFlags = QOhosPlatformWindow::platformWindowFlagsForQWindow(window());
737 return !platformWindowFlags.testFlag(Qt::WindowDoesNotAcceptFocus);
742 auto platformWindowFlags = QOhosPlatformWindow::platformWindowFlagsForQWindow(window());
743 return !platformWindowFlags.testFlag(Qt::WindowTransparentForInput);
748 switch (event->type()) {
749 case QEvent::ApplicationPaletteChange:
753 case QEvent::DynamicPropertyChange: {
754 auto propertyName =
static_cast<QDynamicPropertyChangeEvent *>(event)->propertyName();
755 m_propertiesStore.notifyPropertyWrite(propertyName);
759 if (isWindowBeingClosedOrDestroyed(window())) {
761 if (ohosView && ohosView->viewType() == QOhosView::ViewType::MainWindow)
768 return QPlatformWindow::windowEvent(event);
773 QWindowPrivate *windowPriv = qt_window_private(window);
774 return windowPriv && (windowPriv->inClose || windowPriv->visibilityOnDestroy);
std::enable_if_t< qohosplugincore_h_detail::isQOhosOptional< QOhosInvokeResult< Func, T > >, QOhosInvokeResult< Func, T > > andThen(Func &&func) const
QOhosPlatformScreen * platformScreenForDisplayIdOrNull(QOhosDisplayInfo::JsDisplayId displayId) const
void setParentOrReparent(QOhosView &parentView)
void tryDetachFromEmbeddedParent()
void forceGeometryUpdate()
void handlePaletteChange()
void setNativeNodeVisibility(bool visible)
QRect window() const
Returns the window rectangle.
Combined button and popup list for selecting options.
constexpr int defaultWindowHeight
QOhosView * getWindowsViewOrNull(QWindow *targetWindow)
constexpr int defaultWindowWidth
QOhosOptional< void > makeEmptyQOhosOptional()