4#include <qohosscreenmanager.h>
8#include <qarkui/displaymanager.h>
9#include <qohosdisplayinfo.h>
10#include <qohosjsutils.h>
11#include <qohosplatformscreen.h>
12#include <qpa/qwindowsysteminterface.h>
16QOhosScreenManager::QOhosScreenManager()
18 auto selfRef = QtOhos::QThreadSafeRef<QOhosScreenManager>(
this);
20 std::vector<QOhosDisplayInfo> registeredDisplays;
21 QtOhos::runInJsThreadAndWait([&](QtOhos::JsState &jsState) {
22 m_jsScopeData = QtOhos::makeProxyWithJsThreadDeleter(
23 QArkUi::QOhosDisplayManager::create(
24 jsState, QArkUi::QOhosDisplayManager::CreateInfo{
25 .displaysUpdatedCb = [selfRef](QtOhos::JsState &, std::vector<QOhosDisplayInfo> displayInfos) {
26 selfRef.visitInQtThreadIfAlive([displayInfos = std::move(displayInfos)](QOhosScreenManager &self) {
27 self.rebuildScreenList(displayInfos);
30 .displayAvailableAreaChangedCb = [selfRef](QtOhos::JsState &, JsDisplayId displayId, QRectF availableArea) {
31 selfRef.visitInQtThreadIfAlive([displayId, availableArea](QOhosScreenManager &self) {
32 self.handleDisplayAvailableAreaChanged(displayId, availableArea);
36 registeredDisplays = m_jsScopeData->getRegisteredDisplayInfos();
40 rebuildScreenList(registeredDisplays);
44 std::unique_ptr<QOhosPlatformScreen> screen)
46 m_platformScreen = screen.get();
47 QWindowSystemInterface::handleScreenAdded(screen.release());
52 return m_platformScreen;
55QOhosOptional<QOhosDisplayInfo>
QOhosScreenManager::QOhosPlatformScreenHolder::displayInfoOrEmpty()
const
57 return m_platformScreen !=
nullptr
58 ? makeQOhosOptional(m_platformScreen->displayInfo())
59 : makeEmptyQOhosOptional();
62QOhosOptional<QOhosDisplayInfo::JsDisplayId>
QOhosScreenManager::QOhosPlatformScreenHolder::displayIdOrEmpty()
const
67 return displayInfo.id;
73 if (m_platformScreen !=
nullptr)
74 QWindowSystemInterface::handleScreenRemoved(m_platformScreen);
80 auto it = std::find_if(
81 m_displays.begin(), m_displays.end(),
82 [&](
const std::unique_ptr<QOhosPlatformScreenHolder> &platformScreenHolder) {
83 return platformScreenHolder->displayIdOrEmpty() == displayId;
86 return it != m_displays.end()
93 auto *platformScreenHolder = platformScreenHolderForDisplayIdOrNull(displayId);
94 return platformScreenHolder !=
nullptr
95 ? platformScreenHolder->platformScreenOrNull()
102 if (platformScreen ==
nullptr)
103 qOhosReportFatalErrorAndAbort(
"Failed to find platform screen for display id: %f", displayId.value());
104 return platformScreen;
108 JsDisplayId jsDisplayId, QRectF availableArea)
111 if (platformScreen !=
nullptr)
112 platformScreen->setAvailableGeometry(availableArea.toRect());
115void QOhosScreenManager::rebuildScreenList(std::vector<QOhosDisplayInfo> updatedDisplayInfos)
117 const auto primaryDisplayId = JsDisplayId(0);
119 if (updatedDisplayInfos.empty())
120 qOhosReportFatalErrorAndAbort(
"Empty display list. This should not happen");
122 auto currentDisplays =
std::exchange(m_displays, {});
125 for (
const auto &displayInfo: updatedDisplayInfos) {
126 auto availablePlatformScreenHolderIt = std::find_if(
127 currentDisplays.begin(), currentDisplays.end(),
128 [](
const std::unique_ptr<QOhosPlatformScreenHolder> &platformScreenHolder) {
129 return platformScreenHolder && platformScreenHolder->platformScreenOrNull() !=
nullptr;
132 auto platformScreenHolder = availablePlatformScreenHolderIt != currentDisplays.end()
133 ? std::move(*availablePlatformScreenHolderIt)
134 : std::make_unique<QOhosPlatformScreenHolder>(
135 std::make_unique<QOhosPlatformScreen>(
138 std::vector<QOhosPlatformScreen *> result;
139 for (
const auto &screenHolder : m_displays) {
140 auto *platformScreen = screenHolder->platformScreenOrNull();
141 if (platformScreen !=
nullptr)
142 result.push_back(platformScreen);
147 auto *platformScreen = platformScreenHolder->platformScreenOrNull();
148 if (Q_UNLIKELY(platformScreen ==
nullptr))
149 qOhosReportFatalErrorAndAbort(
"platformScreenHolder->platformScreenOrNull() == nullptr. This should not happen.");
151 platformScreen->setDisplayInfo(displayInfo);
152 if (displayInfo.id == primaryDisplayId)
153 primaryScreen = platformScreen;
155 m_displays.push_back(std::move(platformScreenHolder));
158 if (primaryScreen !=
nullptr) {
159 QWindowSystemInterface::handlePrimaryScreenChanged(primaryScreen);
161 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.