4#include <qohosfloatingwindow.h>
6#include <QtCore/private/qohoslogger_p.h>
7#include "QtGui/private/qguiapplication_p.h"
8#include <QtGui/private/qwindow_p.h>
9#include <qohosdeviceinfo_p.h>
10#include <qohosinputcontext.h>
11#include <qohosinputmethodeventhandler.h>
12#include <qohosjsmain.h>
13#include <qohosplatformbackingstore.h>
14#include <qohosplatformintegration.h>
15#include <qohosplatformwindow.h>
16#include <qohosruntimedevicetypeandmode.h>
17#include <qohossettings.h>
18#include <render/qohossurface.h>
19#include <render/qohoswindowproxy.h>
20#include <render/qwindowproxyregistry.h>
31 && rectChangeOptions.rect.isValid()
32 && window->geometry() != rectChangeOptions.rect
48 bool geometryControlledBySystem =
49 !QOhosPlatformIntegration::instance()->settings()->isWindowPcModeEnabled()
51 && view->viewType() == QOhosView::ViewType::MainWindow;
53 if (geometryControlledBySystem) {
54 setWindowGeometryFromOhos(windowGeometry());
58 auto *currentScreen = QOhosPlatformWindow::screen();
59 QOhosPlatformWindow::setGeometry(rect);
61 auto *targetScreen = QOhosPlatformWindow::screenForGeometry(rect.marginsAdded(frameMargins()));
62 if (targetScreen !=
nullptr && targetScreen != currentScreen)
63 QWindowSystemInterface::handleWindowScreenChanged(window(), targetScreen->screen());
65 if (view !=
nullptr) {
66 auto frameGeometry = rect.marginsAdded(frameMargins());
67 if (!qt_window_private(window())->positionAutomatic)
68 view->setPosition(frameGeometry.topLeft());
69 view->setSize(frameGeometry.size());
78 m_view->showImmediate();
79 startAsyncWaitForNodeResizeIfNeeded();
84 auto windowObjectName = window()->objectName();
87 "%s: winId called for window named: \"%s\"",
89 windowObjectName.toStdString().c_str());
91 return reinterpret_cast<WId>(m_view->viewWindowId());
97 if (view !=
nullptr) {
99 window()->requestUpdate();
106 if (view !=
nullptr) {
108 window()->requestUpdate();
126 m_view = QOhosView::createForWindow(
this, propertiesProvider());
128 auto *qWindow = window();
134 if (m_view->viewType() == QOhosView::ViewType::MainWindow
135 && !QOhosPlatformIntegration::instance()->settings()->isWindowPcModeEnabled()
136 && !m_lastWindowStatusType.has_value()) {
137 m_lastWindowStatusType = QOhosWindowProxy::WindowStatusType::FULL_SCREEN;
141 m_view.get(), &QOhosView::externalContentInteractionDetected,
142 qWindow, &QOhosPlatformWindow::closeAllActivePopups);
145 m_view.get(), &QOhosView::nodeAreaChanged, m_view.get(),
146 [
this](QArkUi::QQtEmbeddedWindowNode::NodeAreaInfo event) {
147 handleNodeResizeEvent(event);
151 m_view.get(), &QOhosView::windowEvent,
153 [
this](QOhosWindowProxy::WindowEvent evt) { handleWindowEvent(evt); });
156 m_view.get(), &QOhosView::windowStatusChange,
158 [
this](QOhosWindowProxy::WindowStatus evt) { handleWindowStatusChange(evt); });
161 m_view.get(), &QOhosView::windowVisibilityChange,
163 [
this](
bool visible) { handleWindowVisibilityChange(visible); });
165 bool monitorAvoidAreaChange =
166 !(isHandheldDeviceType() && m_view->viewType() == QOhosView::ViewType::SubWindow);
168 if (monitorAvoidAreaChange) {
170 m_view.get(), &QOhosView::avoidAreaChanged,
172 [
this](QOhosWindowProxy::AvoidAreaType avoidAreaType,
173 const QOhosWindowProxy::AvoidArea &systemAvoidArea) {
174 handleAvoidAreaChanged(avoidAreaType, systemAvoidArea);
179 m_view.get(), &QOhosView::windowRectChangedInGlobalDisplay,
181 [
this](
const QOhosWindowProxy::RectChangeOptions &rectChangeOptions) {
182 handleWindowRectChanged(rectChangeOptions);
185 QObject::connect(qWindow, &QWindow::modalityChanged, m_view.get(), &QOhosView::setModality);
188 m_view.get(), &QOhosView::surfaceStatusChanged,
190 [
this](
const QOhosOptional<QSize> &optSurfaceSize) { handleSurfaceStatusChanged(optSurfaceSize); });
192 QObject::connect(qWindow, &QWindow::windowTitleChanged, m_view.get(), &QOhosView::setTitle);
195 m_view.get(), &QOhosView::windowDisplayIdChanged,
197 [
this](QOhosDisplayInfo::JsDisplayId displayId) { handleWindowDisplayIdChanged(displayId); });
203 if (view !=
nullptr && m_cursor.has_value())
204 view->setCursor(m_cursor.value());
208 Qt::WindowFlags previousWindowFlags, Qt::WindowFlags currentWindowFlags)
214 view->handleWindowFlagsChange(previousWindowFlags, currentWindowFlags);
218 Qt::WindowStates oldWindowState, Qt::WindowStates currentWindowState)
224 view->handleWindowStateChange(oldWindowState, currentWindowState);
229 QWindowSystemInterface::handleFocusWindowChanged(window(), Qt::PopupFocusReason);
235 QWindowSystemInterface::handleFocusWindowChanged(
236 !systemFocusedWindows.empty() ? systemFocusedWindows.front() :
nullptr,
237 Qt::ActiveWindowFocusReason);
242 m_windowMask = region;
261 if (windowFlags().testFlag(Qt::WindowDoesNotAcceptFocus) && window()->type() == Qt::Popup) {
262 internalHijackSystemFocusAsPopup();
271 auto *qWindow = window();
273 Qt::WindowStates windowStatesToSet = windowStates();
274 bool windowActive =
true;
275 auto previousWindowEventType =
std::exchange(m_lastWindowEventType, makeQOhosOptional(evt
.type));
280 QWindow *modalWindow =
nullptr;
281 if (QGuiApplicationPrivate::instance()->isWindowBlocked(qWindow, &modalWindow)
282 && qWindow != modalWindow) {
283 modalWindow->requestActivate();
291 restoreWindowCurrentCursorIfNeeded();
292 if (windowAcceptsFocusAndInput) {
293 QWindowSystemInterface::handleFocusWindowChanged(qWindow, Qt::ActiveWindowFocusReason);
299 windowActive =
false;
300 if (!windowAcceptsFocusAndInput)
302 if (QGuiApplicationPrivate::focus_window == qWindow
303 || (QGuiApplicationPrivate::focus_window !=
nullptr
304 && QOhosPlatformWindow::platformWindowFlagsForQWindow(
305 QGuiApplicationPrivate::focus_window).testFlag(Qt::WindowDoesNotAcceptFocus))) {
306 QWindowSystemInterface::handleFocusWindowChanged(
nullptr, Qt::ActiveWindowFocusReason);
311 if (!checkWindowAcceptsFocus() && QGuiApplicationPrivate::focus_window == qWindow)
312 focusHijackingPopupHidden();
314 windowActive =
false;
324 qWindow->setVisible(
true);
326 startAsyncWaitForNodeResizeIfNeeded();
329 windowActive =
false;
334 windowStatesToSet.setFlag(Qt::WindowState::WindowActive, windowActive && windowAcceptsFocusAndInput);
335 setWindowStateFromOhos(windowStatesToSet);
340 auto *qWindow = window();
343 "Window status changed, window: %p(%s) status: %d",
345 qPrintable(qWindow->objectName()),
347 Qt::WindowStates windowStatesToSet = windowStates();
348 Qt::WindowState flagToSet;
349 m_lastWindowStatusType = evt.type;
352 case QOhosWindowProxy::WindowStatusType::FULL_SCREEN:
353 flagToSet = Qt::WindowState::WindowFullScreen;
355 case QOhosWindowProxy::WindowStatusType::MAXIMIZE:
356 flagToSet = Qt::WindowState::WindowMaximized;
358 case QOhosWindowProxy::WindowStatusType::MINIMIZE:
359 flagToSet = Qt::WindowState::WindowMinimized;
364 case QOhosWindowProxy::WindowStatusType::SPLIT_SCREEN:
365 flagToSet = Qt::WindowState::WindowNoState;
371 if (flagToSet == Qt::WindowState::WindowFullScreen
372 || flagToSet == Qt::WindowState::WindowMaximized) {
373 windowStatesToSet = m_view->isFullscreenImmersiveModeEnabled()
374 ? Qt::WindowState::WindowFullScreen
375 : Qt::WindowState::WindowMaximized;
377 static constexpr Qt::WindowState mutuallyExclusiveFlags[] = {
378 Qt::WindowState::WindowFullScreen,
379 Qt::WindowState::WindowMaximized,
380 Qt::WindowState::WindowMinimized,
381 Qt::WindowState::WindowNoState,
384 for (
const auto exclusiveState : mutuallyExclusiveFlags)
385 windowStatesToSet.setFlag(exclusiveState, flagToSet == exclusiveState);
388 setWindowStateFromOhos(windowStatesToSet);
394 startAsyncWaitForNodeResizeIfNeeded();
399 auto *qWindow = window();
402 "Window %p(%s) visibility changed: %s",
404 qPrintable(qWindow->objectName()),
405 visible ?
"true" :
"false");
406 if (visible && m_windowMask.has_value())
407 m_view->setWindowMask(QOhosWindowProxy::WindowMask{m_windowMask.value()});
414 const QOhosWindowProxy::AvoidArea &systemAvoidArea)
416 const auto &cached = m_avoidAreaCache[avoidAreaType];
418 bool actuallyChanged =
419 cached.visible != systemAvoidArea.visible
420 || cached.leftRect != systemAvoidArea.leftRect
421 || cached.rightRect != systemAvoidArea.rightRect
422 || cached.bottomRect != systemAvoidArea.bottomRect
423 || cached.topRect != systemAvoidArea.topRect;
425 if (actuallyChanged) {
426 m_avoidAreaCache[avoidAreaType] = systemAvoidArea;
427 qCDebug(QtForOhos) <<
"Avoid area changed:"
428 <<
static_cast<
int>(avoidAreaType)
429 <<
"visible:" << systemAvoidArea.visible
430 <<
"top:" << systemAvoidArea.topRect
431 <<
"left:" << systemAvoidArea.leftRect
432 <<
"right:" << systemAvoidArea.rightRect
433 <<
"bottom:" << systemAvoidArea.bottomRect;
434 startAsyncWaitForNodeResizeIfNeeded();
438void QOhosFloatingWindow::handleSurfaceStatusChanged(
const QOhosOptional<QSize> &optSurfaceSize)
440 m_optLastSurfaceSize = optSurfaceSize;
441 bool hasSurface = m_view->surfaceOrNull() !=
nullptr;
442 if (m_view->viewType() == QOhosView::ViewType::EmbeddedWindow) {
447 startAsyncWaitForNodeResizeIfNeeded();
452 setDisplayIdFromOhos(makeQOhosOptional(displayId));
453 startAsyncWaitForNodeResizeIfNeeded();
457 const QOhosWindowProxy::RectChangeOptions &rectChangeOptions)
462 <<
"windowRectChanged window:" << window()
463 <<
"rect:" << rectChangeOptions.rect
464 <<
"reason:" <<
static_cast<
int>(rectChangeOptions.reason);
466 startAsyncWaitForNodeResizeIfNeeded();
468 if (isWindowRotatedByTabletScreenRotation(window(), rectChangeOptions))
469 needsCloseAllActivePopups =
true;
471 if (needsCloseAllActivePopups)
477 if (event->type() == QEvent::Timer) {
478 auto *timerEvent =
static_cast<QTimerEvent *>(event);
479 if (m_view && timerEvent->timerId() == m_geometryChangeTimer.timerId()) {
480 auto syntheticEvent = m_view->nodeAreaInfo();
481 handleNodeResizeEvent(syntheticEvent);
485 return QOhosPlatformWindow::windowEvent(event);
490 constexpr auto geometryChangeEventTimeoutMs = std::chrono::milliseconds(16);
492 if (!m_geometryChangeTimer.isActive()) {
493 m_geometryChangeTimer.start(
494 geometryChangeEventTimeoutMs.count(),
502 m_geometryChangeTimer.stop();
504 if (Q_UNLIKELY(!m_view))
507 setWindowGeometryFromOhos(
508 m_view->viewType() != QOhosView::ViewType::EmbeddedWindow
509 ? QRect(areaChangeEvent.globalRelativeOffsetPixels, areaChangeEvent.screenGeometryPixels.size())
510 : QRect(areaChangeEvent.parentRelativeOffsetPixels, areaChangeEvent.screenGeometryPixels.size()));
QOhosFloatingWindow(QWindow *window)
~QOhosFloatingWindow() override
void requestActivateWindow() override
Reimplement to let Qt be able to request activation/focus for a window.
void setVisible(bool visible) override
Reimplemented in subclasses to show the surface if visible is true, and hide it if visible is false.
bool startSystemMove() override
Reimplement this method to start a system move operation if the system supports it and return true to...
QOhosView * ownedViewOrNull() const override
void onWindowStateChanged(Qt::WindowStates oldWindowState, Qt::WindowStates currentWindowState) override
WId winId() const override
Reimplement in subclasses to return a handle to the native window.
void initialize() override
Called as part of QWindow::create(), after constructing the window.
void onWindowFlagsChanged(Qt::WindowFlags previousWindowFlags, Qt::WindowFlags currentWindowFlags) override
bool windowEvent(QEvent *event) override
Reimplement this method to be able to do any platform specific event handling.
void setGeometry(const QRect &rect) override
This function is called by Qt whenever a window is moved or resized using the QWindow API.
QOhosSurface * ownedSurfaceOrNull() const override
void setMask(const QRegion ®ion) override
Reimplement to be able to let Qt set the mask of a window.
void lower() override
Reimplement to be able to let Qt lower windows to the bottom of the desktop.
void raise() override
Reimplement to be able to let Qt raise windows to the top of the desktop.
bool isWindowPcModeEnabled() const
QOhosSurface * surfaceOrNull() const
void setWindowMask(const QOhosWindowProxy::WindowMask &windowMask)
QtOhos::enums::ohos::window::AvoidAreaType AvoidAreaType
QtOhos::enums::ohos::window::RectChangeReason RectChangeReason
QtOhos::enums::ohos::window::WindowEventType WindowEventType
QtOhos::enums::ohos::window::WindowStatusType WindowStatusType
static QWindowProxyRegistry & instance()
Combined button and popup list for selecting options.
bool isWindowRotatedByTabletScreenRotation(QWindow *window, QOhosWindowProxy::RectChangeOptions rectChangeOptions)