4#include <qohosscreenmanager.h>
7#include <qarkui/displaymanager.h>
8#include <qohosdisplayinfo.h>
9#include <qohosjsutils.h>
10#include <qohosplatformscreen.h>
11#include <qpa/qwindowsysteminterface.h>
15QOhosScreenManager::QOhosScreenManager()
17 auto selfRef = QtOhos::QThreadSafeRef<QOhosScreenManager>(
this);
19 std::vector<QOhosDisplayInfo> registeredDisplays;
20 QtOhos::runInJsThreadAndWait([&](QtOhos::JsState &jsState) {
21 m_jsScopeData = QtOhos::makeProxyWithJsThreadDeleter(
22 QArkUi::QOhosDisplayManager::create(
23 jsState, QArkUi::QOhosDisplayManager::CreateInfo{
24 .displaysUpdatedCb = [selfRef](QtOhos::JsState &, std::vector<QOhosDisplayInfo> displayInfos) {
25 selfRef.visitInQtThreadIfAlive([displayInfos = std::move(displayInfos)](QOhosScreenManager &self) {
26 self.rebuildScreenList(displayInfos);
29 .displayAvailableAreaChangedCb = [selfRef](QtOhos::JsState &, JsDisplayId displayId, QRectF availableArea) {
30 selfRef.visitInQtThreadIfAlive([displayId, availableArea](QOhosScreenManager &self) {
31 self.handleDisplayAvailableAreaChanged(displayId, availableArea);
35 registeredDisplays = m_jsScopeData->getRegisteredDisplayInfos();
39 rebuildScreenList(registeredDisplays);
43 std::unique_ptr<QOhosPlatformScreen> screen)
45 m_platformScreen = screen.get();
46 QWindowSystemInterface::handleScreenAdded(screen.release());
51 return m_platformScreen;
56 return m_platformScreen !=
nullptr
57 ? std::optional(m_platformScreen->displayInfo())
66 return displayInfo.id;
72 if (m_platformScreen !=
nullptr)
73 QWindowSystemInterface::handleScreenRemoved(m_platformScreen);
79 auto it = std::find_if(
80 m_displays.begin(), m_displays.end(),
81 [&](
const std::unique_ptr<QOhosPlatformScreenHolder> &platformScreenHolder) {
82 return platformScreenHolder->displayIdOrEmpty() == displayId;
85 return it != m_displays.end()
92 auto *platformScreenHolder = platformScreenHolderForDisplayIdOrNull(displayId);
93 return platformScreenHolder !=
nullptr
94 ? platformScreenHolder->platformScreenOrNull()
101 if (platformScreen ==
nullptr)
102 qOhosReportFatalErrorAndAbort(
"Failed to find platform screen for display id: %f", displayId.value());
103 return platformScreen;
107 JsDisplayId jsDisplayId, QRectF availableArea)
110 if (platformScreen !=
nullptr)
111 platformScreen->setAvailableGeometry(availableArea.toRect());
114void QOhosScreenManager::rebuildScreenList(std::vector<QOhosDisplayInfo> updatedDisplayInfos)
116 const auto primaryDisplayId = JsDisplayId(0);
118 if (updatedDisplayInfos.empty())
119 qOhosReportFatalErrorAndAbort(
"Empty display list. This should not happen");
121 auto currentDisplays = std::exchange(m_displays, {});
124 for (
const auto &displayInfo: updatedDisplayInfos) {
125 auto availablePlatformScreenHolderIt = std::find_if(
126 currentDisplays.begin(), currentDisplays.end(),
127 [](
const std::unique_ptr<QOhosPlatformScreenHolder> &platformScreenHolder) {
128 return platformScreenHolder && platformScreenHolder->platformScreenOrNull() !=
nullptr;
131 auto platformScreenHolder = availablePlatformScreenHolderIt != currentDisplays.end()
132 ? std::move(*availablePlatformScreenHolderIt)
133 : std::make_unique<QOhosPlatformScreenHolder>(
134 std::make_unique<QOhosPlatformScreen>(
137 std::vector<QOhosPlatformScreen *> result;
138 for (
const auto &screenHolder : m_displays) {
139 auto *platformScreen = screenHolder->platformScreenOrNull();
140 if (platformScreen !=
nullptr)
141 result.push_back(platformScreen);
146 auto *platformScreen = platformScreenHolder->platformScreenOrNull();
147 if (Q_UNLIKELY(platformScreen ==
nullptr))
148 qOhosReportFatalErrorAndAbort(
"platformScreenHolder->platformScreenOrNull() == nullptr. This should not happen.");
150 platformScreen->setDisplayInfo(displayInfo);
151 if (displayInfo.id == primaryDisplayId)
152 primaryScreen = platformScreen;
154 m_displays.push_back(std::move(platformScreenHolder));
157 if (primaryScreen !=
nullptr) {
158 QWindowSystemInterface::handlePrimaryScreenChanged(primaryScreen);
160 qCCritical(QtForOhos) << Q_FUNC_INFO <<
"no primary screen was found in the updated list";
QOhosPlatformScreen * platformScreenForDisplayIdOrNull(QOhosDisplayInfo::JsDisplayId displayId) const
QOhosPlatformScreen * platformScreenForDisplayIdOrFail(QOhosDisplayInfo::JsDisplayId displayId) const
Combined button and popup list for selecting options.