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 m_lastRequestedWindowFrameGeometry = rect.marginsAdded(frameMargins());
95 QPlatformWindow::setGeometry(adjustedRect);
100 QRect availableGeometry = screen()->availableGeometry();
101 return geometry().width() > 0
102 && geometry().height() > 0
103 && availableGeometry.width() > 0
104 && availableGeometry.height() > 0;
110 QPlatformWindow::setVisible(visible);
116 if (view !=
nullptr) {
118 view->setCursor(cursor);
126 view->setTitle(title);
131 if (newParent !=
nullptr && newParent->isForeignWindow())
132 qOhosReportFatalErrorAndAbort(
"Reparenting to foreign windows is not supported");
138 if (newParent ==
nullptr) {
149 if (!m_displayId.has_value())
150 return QPlatformWindow::screen();
154 if (platformScreen !=
nullptr)
155 return platformScreen;
158 << Q_FUNC_INFO <<
"window:" << window()
159 <<
"display id" << m_displayId.value().value()
160 <<
"has no platform screen. Returning QWindow associated one.";
162 return QPlatformWindow::screen();
167 if (m_windowState == state)
170 auto oldWindowState =
std::exchange(m_windowState, state);
171 onWindowStateChanged(oldWindowState, m_windowState);
176 static QSet<Qt::WindowType> disableFocusableWindowTypes{Qt::ToolTip, Qt::Popup};
178 auto *qWindow = window();
179 auto correctedFlags = flags;
180 bool ohosOverrideDisableFocusableFeatures = disableFocusableWindowTypes.contains(qWindow->type());
181 if (ohosOverrideDisableFocusableFeatures) {
184 "Setting Qt::WindowDoesNotAcceptFocus flag on window %s(%s) because of its type",
185 qPrintable(internalWindowId().toString()),
186 qPrintable(qWindow->objectName()));
187 correctedFlags.setFlag(Qt::WindowDoesNotAcceptFocus,
true);
190 if (correctedFlags.testFlag(Qt::FramelessWindowHint)) {
191 correctedFlags.setFlag(Qt::WindowMaximizeButtonHint,
false);
192 correctedFlags.setFlag(Qt::WindowMinimizeButtonHint,
false);
193 correctedFlags.setFlag(Qt::WindowCloseButtonHint,
false);
194 }
else if (!correctedFlags.testFlag(Qt::CustomizeWindowHint)) {
195 correctedFlags.setFlag(Qt::WindowMaximizeButtonHint,
true);
196 correctedFlags.setFlag(Qt::WindowMinimizeButtonHint,
true);
197 correctedFlags.setFlag(Qt::WindowCloseButtonHint,
true);
200 auto previousWindowFlags =
std::exchange(m_windowFlags, correctedFlags);
201 onWindowFlagsChanged(previousWindowFlags, m_windowFlags);
206 return m_windowFlags;
211 return static_cast<QOhosPlatformScreen *>(screen());
216 return m_lastRequestedWindowFrameGeometry;
225 setWindowOrWidgetProperty<
bool, &windowFixedSizeStateProperty>(
226 window(), windowMinimumSize() == windowMaximumSize());
228 view->setSizeLimits(windowMinimumSize(), windowMaximumSize());
243 return window()->isTopLevel();
248 constexpr Qt::WindowType showWithoutDecorationWindowTypes[] = {
249 Qt::WindowType::Popup,
250 Qt::WindowType::SplashScreen,
251 Qt::WindowType::ToolTip,
254 auto *qWindow = window();
255 bool showWithoutDecoration =
256 qWindow->parent() !=
nullptr
258 std::begin(showWithoutDecorationWindowTypes),
259 std::end(showWithoutDecorationWindowTypes),
260 qWindow->type()) != std::end(showWithoutDecorationWindowTypes)
261 || windowFlags().testFlag(Qt::WindowType::FramelessWindowHint)
262 || floatWindowTagValueOrFalse();
264 return showWithoutDecoration
271 if (m_optFrameMargins)
272 return *m_optFrameMargins;
280 if (screen ==
nullptr)
285 constexpr auto predefinedWindowTitleBarHeight = 37;
286 const int titlebarHeightPixels =
std::round(predefinedWindowTitleBarHeight * screen->pixelScalingCoefficient());
287 return QMargins{0, titlebarHeightPixels, 0, 0};
300 auto *platformWindow = window->handle();
301 return platformWindow !=
nullptr
309 if (platformWindow ==
nullptr)
310 qOhosReportFatalErrorAndAbort(
"QWindow %s does not have QPlatformWindow", qPrintable(window->objectName()));
311 return platformWindow;
314void QOhosPlatformWindow::tagWindowOrWidgetAsSubWindowOf(QObject *windowOrWidgetToTag, QWindow *targetMainWindow)
316 setWindowOrWidgetProperty<QWindow *, &subWindowOfTagProperty>(windowOrWidgetToTag, targetMainWindow);
319void QOhosPlatformWindow::tagWindowOrWidgetAsMainWindow(QObject *windowOrWidgetToTag,
bool forceMainWindow)
321 setWindowOrWidgetProperty<
bool, &mainWindowTagProperty>(windowOrWidgetToTag, forceMainWindow);
325 QObject *windowOrWidgetToTag,
bool showAsFloatWindow)
327 setWindowOrWidgetProperty<
bool, &floatWindowTagProperty>(windowOrWidgetToTag, showAsFloatWindow);
332 setWindowOrWidgetProperty<
bool, &windowPrivacyModeSettingProperty>(window, privacyModeEnabled);
337 setWindowOrWidgetProperty<
double, &windowCornerRadiusProperty>(windowOrWidget, radius);
342 auto *tagValue = QOhosPlatformWindow::getWindowOrWidgetAsSubWindowOfTagValue(window());
343 const auto &allWindows = QGuiApplicationPrivate::window_list;
344 bool tagValueValid = tagValue !=
nullptr && allWindows.contains(tagValue);
346 QtForOhos,
"Window %s(%s) - subWindowOf tag %s value: %p",
347 qPrintable(internalWindowId().toString()), qPrintable(window()->objectName()),
348 tagValueValid ?
"valid" :
"invalid",
351 return tagValueValid ? tagValue :
nullptr;
356 return m_propertiesStore.tryGetProperty<
bool, &mainWindowTagProperty>().value_or(
false);
361 const auto showWithoutActivating = window()->property(
"_q_showWithoutActivating");
362 return showWithoutActivating.isValid() && showWithoutActivating.toBool() && window()->modality() == Qt::NonModal;
367 return tryGetWindowOrWidgetProperty<QWindow *, &subWindowOfTagProperty>(windowOrWidget).value_or(
nullptr);
373 setWindowOrWidgetProperty<
NativeNodeRenderFitPolicy, &nativeNodeRenderFitPolicyHintProperty>(windowOrWidget, renderFitPolicy);
378 auto *platformWindow = QOhosPlatformWindow::fromQWindow(window);
379 return platformWindow->windowFlags();
384 setWindowOrWidgetProperty<QColor, &surfaceBackgroundColorProperty>(windowOrWidget, color);
389 setWindowOrWidgetProperty<
bool, &windowKeepScreenOnProperty>(windowOrWidget, keepScreenOn);
394 setWindowOrWidgetProperty<
bool, &windowDragResizableProperty>(windowOrWidget, dragResizable);
399 setWindowOrWidgetProperty<
int, &windowBrightnessProperty>(windowOrWidget, brightness);
404 setWindowOrWidgetProperty<
int, &windowContrastProperty>(windowOrWidget, contrast);
409 setWindowOrWidgetProperty<
int, &windowSaturationProperty>(windowOrWidget, saturation);
414 auto windows =
qGuiApp->allWindows();
415 for (
auto *window : windows) {
416 if (window->type() == Qt::Popup && window->isVisible())
417 QWindowSystemInterface::handleCloseEvent(window);
428 auto *qWindow = window();
430 setWindowFlags(qWindow->flags());
432 auto initialWindowGeom = windowGeometry();
434 m_lastRequestedWindowFrameGeometry = initialGeom;
435 QPlatformWindow::setGeometry(initialGeom);
442 return m_windowState;
447 if (m_windowState != state) {
448 m_windowState = state;
449 QWindowSystemInterface::handleWindowStateChanged(window(), m_windowState);
455 if (windowFlags().testFlag(Qt::WindowDoesNotAcceptFocus))
465 bool marginsChanged = !m_optFrameMargins || *m_optFrameMargins != margins;
469 if (m_optFrameMargins) {
470 *m_optFrameMargins = margins;
472 m_optFrameMargins = std::make_unique<QMargins>(margins);
475 qCDebug(QtForOhos) <<
"Window margins changed: " << *m_optFrameMargins;
486 auto *qWindow = window();
488 bool needsGeometryUpdate =
490 && view->viewType() == QOhosView::ViewType::EmbeddedWindow
491 && window()->isVisible();
492 if (needsGeometryUpdate) {
493 auto scaledGeometry = window()->geometry();
494 qWindow->setGeometry(scaledGeometry);
498 qWindow->requestUpdate();
499 setWindowGeometryFromOhos(windowGeometry());
503 QWindow *targetWindow, QObject *surfaceConsumerContext,
504 std::function<
void(QOhosOptional<
void *>)> surfaceConsumer)
510 surfaceConsumerContext->metaObject()->className());
512 auto *view = getWindowsViewOrNull(targetWindow);
516 if (surfaceConsumerContext->thread() != view->thread() || view->thread() != QThread::currentThread()) {
517 qOhosReportFatalErrorAndAbort(
518 "%s: inter-thread surface consumer connection is not supported", Q_FUNC_INFO);
521 auto sharedSurfaceConsumer = QtOhos::moveToSharedPtr(std::move(surfaceConsumer));
523 auto *surface = view->surfaceOrNull();
524 if (surface !=
nullptr) {
525 QMetaObject::invokeMethod(
526 surfaceConsumerContext,
527 [weakSurfaceConsumer = std::weak_ptr<
decltype(surfaceConsumer)>(sharedSurfaceConsumer),
528 targetWindow = QPointer<QWindow>(targetWindow)]() {
529 auto sharedSurfaceConsumer = weakSurfaceConsumer.lock();
530 if (!sharedSurfaceConsumer || targetWindow ==
nullptr)
533 auto *view = getWindowsViewOrNull(targetWindow);
537 auto *surface = view->surfaceOrNull();
538 (*sharedSurfaceConsumer)(
540 ? QOhosOptional<
void *>(surface->nativeWindow())
541 : makeEmptyQOhosOptional());
543 Qt::QueuedConnection);
546 auto surfaceStatusChangedConnectionHandle = QObject::connect(
547 view, &QOhosView::surfaceStatusChanged, surfaceConsumerContext,
548 [view = QPointer<QOhosView>(view), sharedSurfaceConsumer](
const QOhosOptional<QSize> &) {
551 auto *surface = view->surfaceOrNull();
552 (*sharedSurfaceConsumer)(
554 ? QOhosOptional<
void *>(surface->nativeWindow())
555 : makeEmptyQOhosOptional());
558 if (!surfaceStatusChangedConnectionHandle) {
561 "%s: Connection between ohos view and surface consumer context failed",
566 auto viewDestroyedConnectionHandle = QObject::connect(
567 view, &QObject::destroyed, surfaceConsumerContext,
568 [sharedSurfaceConsumer]() {
569 (*sharedSurfaceConsumer)(makeEmptyQOhosOptional());
571 Qt::QueuedConnection);
573 if (!viewDestroyedConnectionHandle) {
576 "%s: Connecting view destroyed signal to surface consumer context failed",
581 return QtOhos::makeDestroyNotifier(
582 [surfaceStatusChangedConnectionHandle = std::move(surfaceStatusChangedConnectionHandle),
583 viewDestroyedConnectionHandle = std::move(viewDestroyedConnectionHandle)] ()
mutable {
584 QObject::disconnect(surfaceStatusChangedConnectionHandle);
585 QObject::disconnect(viewDestroyedConnectionHandle);
591 return m_propertiesStore.tryGetProperty<
bool, &floatWindowTagProperty>().value_or(
false);
601 if (m_displayId != displayId) {
602 m_displayId = displayId;
605 <<
"Screen changed - window:" << window()
606 <<
"displayId:" << (displayId.has_value()
607 ? QString::number(displayId.value().value())
608 : QString::fromUtf8(
"<NO DISPLAY>"));
611 ? QOhosPlatformIntegration::instance()
612 ->screenManager()->platformScreenForDisplayIdOrNull(m_displayId.value())
615 QWindowSystemInterface::handleWindowScreenChanged(
625 qCDebug(QtForOhos) <<
"window:" << window() <<
"geometry change to:" << nativeWindowDrawGeometry;
626 QWindowSystemInterface::handleGeometryChange(window(), nativeWindowDrawGeometry);
642 if (ohosInputContext !=
nullptr) {
643 ohosInputContext->setLastInputTypeToTriggerSoftKeyboard(QOhosInputContext::RequestKeyboardReason::NONE);
661 return QOhosPropertiesProvider(m_propertiesStore);
666 qCDebug(QtForOhos) << Q_FUNC_INFO <<
"window:" << window() <<
"grab:" << grab;
670 inputHandler->grabMouse(window());
679 qCDebug(QtForOhos) << Q_FUNC_INFO <<
"window:" << window() <<
"grab:" << grab;
683 inputHandler->grabKeyboard(window());
692 auto platformWindowFlags = QOhosPlatformWindow::platformWindowFlagsForQWindow(window());
693 return !platformWindowFlags.testFlag(Qt::WindowDoesNotAcceptFocus);
698 auto platformWindowFlags = QOhosPlatformWindow::platformWindowFlagsForQWindow(window());
699 return !platformWindowFlags.testFlag(Qt::WindowTransparentForInput);
704 switch (event->type()) {
705 case QEvent::ApplicationPaletteChange:
709 case QEvent::DynamicPropertyChange: {
710 auto propertyName =
static_cast<QDynamicPropertyChangeEvent *>(event)->propertyName();
711 m_propertiesStore.notifyPropertyWrite(propertyName);
717 return QPlatformWindow::windowEvent(event);
722 QWindowPrivate *windowPriv = qt_window_private(window);
723 return windowPriv && (windowPriv->inClose || windowPriv->visibilityOnDestroy);
728 auto exposedSize = m_exposed
732 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.
Combined button and popup list for selecting options.
constexpr int defaultWindowHeight
QOhosView * getWindowsViewOrNull(QWindow *targetWindow)
constexpr int defaultWindowWidth