From 74f31bf083378aa49c76d95a50cab785069f6b64 Mon Sep 17 00:00:00 2001 From: lu Date: Thu, 13 Jan 2022 21:18:06 +0800 Subject: [PATCH] Get Screen form RSScreen Signed-off-by: lu Change-Id: Ic6b05286f50d5db12d8a99c154500d0720e3bdeb --- dm/src/screen_group.cpp | 6 +- dm/src/screen_manager.cpp | 4 + .../include/abstract_display_controller.h | 22 ++- dmserver/include/abstract_screen.h | 32 ++++- dmserver/include/abstract_screen_controller.h | 35 +++-- dmserver/include/display_manager_service.h | 3 +- dmserver/src/abstract_display_controller.cpp | 54 ++++++- dmserver/src/abstract_screen.cpp | 32 +++++ dmserver/src/abstract_screen_controller.cpp | 133 +++++++++++++----- dmserver/src/display_manager_service.cpp | 17 ++- interfaces/innerkits/dm/screen_group.h | 4 +- interfaces/innerkits/dm/screen_manager.h | 1 + wm/BUILD.gn | 2 + 13 files changed, 269 insertions(+), 76 deletions(-) diff --git a/dm/src/screen_group.cpp b/dm/src/screen_group.cpp index 6b8ee375f3..9ac0d71c0c 100644 --- a/dm/src/screen_group.cpp +++ b/dm/src/screen_group.cpp @@ -24,7 +24,7 @@ private: std::vector> children_; std::vector position_; - ScreenType type_ { ScreenType::SCREEN_ALONE }; + ScreenCombination combination_ { ScreenCombination::SCREEN_ALONE }; }; ScreenGroup::ScreenGroup() @@ -36,9 +36,9 @@ ScreenGroup::~ScreenGroup() { } -ScreenType ScreenGroup::GetType() const +ScreenCombination ScreenGroup::GetCombination() const { - return pImpl_->type_; + return pImpl_->combination_; } std::vector> ScreenGroup::GetChildren() const diff --git a/dm/src/screen_manager.cpp b/dm/src/screen_manager.cpp index 9278df3f0b..b8e076f884 100644 --- a/dm/src/screen_manager.cpp +++ b/dm/src/screen_manager.cpp @@ -48,6 +48,10 @@ std::vector> ScreenManager::GetAllScreens() return res; } +void ScreenManager::RegisterScreenChangeListener(sptr listener) +{ +} + sptr ScreenManager::makeExpand(std::vector screenId, std::vector startPoint) { return nullptr; diff --git a/dmserver/include/abstract_display_controller.h b/dmserver/include/abstract_display_controller.h index 67c8e53512..0ece7f31ac 100644 --- a/dmserver/include/abstract_display_controller.h +++ b/dmserver/include/abstract_display_controller.h @@ -19,29 +19,37 @@ #include #include #include +#include #include "abstract_display.h" -#include "wm_single_instance.h" +#include "abstract_screen_controller.h" #include "transaction/rs_interfaces.h" #include "virtual_display_info.h" namespace OHOS::Rosen { -class AbstractDisplayController { -WM_DECLARE_SINGLE_INSTANCE_BASE(AbstractDisplayController); +class AbstractDisplayController : public RefBase { public: - std::map> abstractDisplayMap_; + AbstractDisplayController(std::recursive_mutex& mutex); + ~AbstractDisplayController(); + void Init(sptr abstractScreenController); ScreenId GetDefaultScreenId(); RSScreenModeInfo GetScreenActiveMode(ScreenId id); ScreenId CreateVirtualScreen(const VirtualDisplayInfo &virtualDisplayInfo, sptr surface); bool DestroyVirtualScreen(ScreenId screenId); sptr GetScreenSnapshot(ScreenId screenId); + std::map> abstractDisplayMap_; private: - AbstractDisplayController(); - ~AbstractDisplayController(); - void parepareRSScreenManger(); + void OnAbstractScreenConnected(sptr absScreen); + void OnAbstractScreenDisconnected(sptr absScreen); + void OnAbstractScreenChanged(sptr absScreen); + void CreateAndBindDisplayLocked(sptr absScreen); + std::recursive_mutex& mutex_; + volatile DisplayId displayCount_; + sptr abstractScreenController_; + sptr abstractScreenCallback_; OHOS::Rosen::RSInterfaces *rsInterface_; }; } // namespace OHOS::Rosen diff --git a/dmserver/include/abstract_screen.h b/dmserver/include/abstract_screen.h index 6c3112190e..9b9a0c3e60 100644 --- a/dmserver/include/abstract_screen.h +++ b/dmserver/include/abstract_screen.h @@ -16,29 +16,52 @@ #ifndef FOUNDATION_DMSERVER_ABSTRACT_SCREEN_H #define FOUNDATION_DMSERVER_ABSTRACT_SCREEN_H +#include + #include #include namespace OHOS::Rosen { +constexpr static ScreenId SCREEN_ID_INVALID = INVALID_SCREEN_ID; + struct Point { int32_t posX_; int32_t posY_; }; -enum class AbstractScreenType : uint32_t { +enum class ScreenCombination : uint32_t { SCREEN_ALONE, SCREEN_EXPAND, SCREEN_MIRROR, }; +enum class ScreenType : uint32_t { + UNDEFINE, + REAL, + VIRTUAL +}; + +struct AbstractScreenInfo : public RefBase { + int32_t width_; + int32_t height_; + uint32_t freshRate_; +}; + +class AbstractScreenGroup; class AbstractScreen : public RefBase { public: AbstractScreen(ScreenId dmsId, ScreenId rsId); AbstractScreen() = delete; ~AbstractScreen(); + sptr GetGroup() const; + ScreenId dmsId_; ScreenId rsId_; + ScreenId groupDmsId_; + ScreenType type_ { ScreenType::REAL }; + int32_t activeIdx_; + std::vector> infos_ = {}; }; class AbstractScreenGroup : public AbstractScreen { @@ -47,9 +70,14 @@ public: AbstractScreenGroup() = delete; ~AbstractScreenGroup(); - AbstractScreenType GetType() const; + void AddChild(ScreenCombination combination, sptr& dmsScreen, Point& startPoint); + void AddChild(ScreenCombination combination, + std::vector>& dmsScreens, + std::vector& startPoints); std::vector> GetChildren() const; std::vector GetChildrenPosition() const; + + ScreenCombination combination_ { ScreenCombination::SCREEN_ALONE }; }; } // namespace OHOS::Rosen #endif // FOUNDATION_DMSERVER_ABSTRACT_SCREEN_H \ No newline at end of file diff --git a/dmserver/include/abstract_screen_controller.h b/dmserver/include/abstract_screen_controller.h index 394dcac4fc..4d5d185c3b 100644 --- a/dmserver/include/abstract_screen_controller.h +++ b/dmserver/include/abstract_screen_controller.h @@ -27,38 +27,43 @@ namespace OHOS::Rosen { class AbstractScreenController : public RefBase { -using OnAbstractScreenCallback = std::function; -struct AbstractScreenCallback : public RefBase { - OnAbstractScreenCallback onConnected_; - OnAbstractScreenCallback onDisconnected_; - OnAbstractScreenCallback onChanged_; -}; - +using OnAbstractScreenCallback = std::function)>; public: + struct AbstractScreenCallback : public RefBase { + OnAbstractScreenCallback onConnected_; + OnAbstractScreenCallback onDisconnected_; + OnAbstractScreenCallback onChanged_; + }; + AbstractScreenController(std::recursive_mutex& mutex); ~AbstractScreenController(); + void Init(); std::vector GetAllScreenIds(); - std::shared_ptr> ConvertToRsScreenId(ScreenId dmsScreenId); - std::shared_ptr> ConvertToDmsScreenId(ScreenId rsScreenId); + sptr GetAbstractScreen(ScreenId dmsScreenId); + sptr GetAbstractScreenGroup(ScreenId dmsScreenId); + ScreenId ConvertToRsScreenId(ScreenId dmsScreenId); + ScreenId ConvertToDmsScreenId(ScreenId rsScreenId); void RegisterAbstractScreenCallback(sptr cb); std::map> abstractDisplayMap_; private: - void PrepareRSScreenManger(); void OnRsScreenChange(ScreenId rsScreenId, ScreenEvent screenEvent); - void AddToGroup(sptr newScreen); - void AddAsFirstScreenLocked(sptr newScreen); + bool FillAbstractScreen(sptr& absScreen, ScreenId rsScreenId); + sptr AddToGroupLocked(sptr newScreen); + sptr AddAsFirstScreenLocked(sptr newScreen); void AddAsSuccedentScreenLocked(sptr newScreen); std::recursive_mutex& mutex_; RSInterfaces& rsInterface_; volatile ScreenId dmsScreenCount_; - std::map>> rs2DmsScreenIdMap_; - std::map>> dms2RsScreenIdMap_; + // No AbstractScreenGroup + std::map rs2DmsScreenIdMap_; + std::map dms2RsScreenIdMap_; std::map> dmsScreenMap_; - ScreenId defaultScreenId_ {INVALID_SCREEN_ID}; + std::map> dmsScreenGroupMap_; + ScreenId defaultDmsScreenId_ { SCREEN_ID_INVALID }; sptr abstractScreenCallback_; }; } // namespace OHOS::Rosen diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index f1c17fa5f4..395a22c9e8 100644 --- a/dmserver/include/display_manager_service.h +++ b/dmserver/include/display_manager_service.h @@ -62,7 +62,8 @@ private: std::recursive_mutex mutex_; static inline SingletonDelegator delegator_; std::map> abstractDisplayMap_; - AbstractScreenController screenController_ = AbstractScreenController(mutex_); + sptr abstractScreenController_; + sptr abstractDisplayController_; DisplayPowerController displayPowerController_; }; } // namespace OHOS::Rosen diff --git a/dmserver/src/abstract_display_controller.cpp b/dmserver/src/abstract_display_controller.cpp index 40f24ba2a1..d03bcec0fa 100644 --- a/dmserver/src/abstract_display_controller.cpp +++ b/dmserver/src/abstract_display_controller.cpp @@ -18,6 +18,7 @@ #include #include +#include "display_manager_service.h" #include "window_manager_hilog.h" namespace OHOS::Rosen { @@ -25,18 +26,29 @@ namespace { constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0, "AbstractDisplayController"}; } -AbstractDisplayController::AbstractDisplayController() : rsInterface_(&(RSInterfaces::GetInstance())) +AbstractDisplayController::AbstractDisplayController(std::recursive_mutex& mutex) + : mutex_(mutex), rsInterface_(&(RSInterfaces::GetInstance())) { - parepareRSScreenManger(); } AbstractDisplayController::~AbstractDisplayController() { rsInterface_ = nullptr; + abstractScreenController_ = nullptr; } -void AbstractDisplayController::parepareRSScreenManger() +void AbstractDisplayController::Init(sptr abstractScreenController) { + WLOGFD("display controller init"); + displayCount_ = 0; + abstractScreenCallback_ = new AbstractScreenController::AbstractScreenCallback(); + abstractScreenCallback_->onConnected_ + = std::bind(&AbstractDisplayController::OnAbstractScreenConnected, this, std::placeholders::_1); + abstractScreenCallback_->onDisconnected_ + = std::bind(&AbstractDisplayController::OnAbstractScreenDisconnected, this, std::placeholders::_1); + abstractScreenCallback_->onChanged_ + = std::bind(&AbstractDisplayController::OnAbstractScreenChanged, this, std::placeholders::_1); + abstractScreenController->RegisterAbstractScreenCallback(abstractScreenCallback_); } ScreenId AbstractDisplayController::GetDefaultScreenId() @@ -60,7 +72,7 @@ ScreenId AbstractDisplayController::CreateVirtualScreen(const VirtualDisplayInfo sptr surface) { if (rsInterface_ == nullptr) { - return INVALID_SCREEN_ID; + return SCREEN_ID_INVALID; } ScreenId result = rsInterface_->CreateVirtualScreen(virtualDisplayInfo.name_, virtualDisplayInfo.width_, virtualDisplayInfo.height_, surface, virtualDisplayInfo.displayIdToMirror_, virtualDisplayInfo.flags_); @@ -88,4 +100,38 @@ sptr AbstractDisplayController::GetScreenSnapshot(ScreenId scre return screenshot; } + +void AbstractDisplayController::OnAbstractScreenConnected(sptr absScreen) +{ + WLOGI("connect new screen. id:%{public}" PRIu64"", absScreen->dmsId_); + std::lock_guard lock(mutex_); + if (absScreen->type_ == ScreenType::REAL) { + sptr group = absScreen->GetGroup(); + if (group == nullptr) { + WLOGE("the group information of the screen is wrong"); + return; + } + if (group->combination_ == ScreenCombination::SCREEN_ALONE) { + CreateAndBindDisplayLocked(absScreen); + } else if (group->combination_ == ScreenCombination::SCREEN_MIRROR) { + + } else { + WLOGE("support in future. combination:%{public}ud", group->combination_); + } + } +} + +void AbstractDisplayController::OnAbstractScreenDisconnected(sptr absScreen) +{ +} + +void AbstractDisplayController::OnAbstractScreenChanged(sptr absScreen) +{ +} + +void AbstractDisplayController::CreateAndBindDisplayLocked(sptr absScreen) +{ + WLOGI("create display for new screen id:%{public}" PRIu64"", absScreen->dmsId_); + displayCount_++; +} } // namespace OHOS::Rosen \ No newline at end of file diff --git a/dmserver/src/abstract_screen.cpp b/dmserver/src/abstract_screen.cpp index 72c7b87869..5538b535c1 100644 --- a/dmserver/src/abstract_screen.cpp +++ b/dmserver/src/abstract_screen.cpp @@ -15,6 +15,8 @@ #include "abstract_screen.h" +#include "abstract_screen_controller.h" + namespace OHOS::Rosen { AbstractScreen::AbstractScreen(ScreenId dmsId, ScreenId rsId) : dmsId_(dmsId), rsId_(rsId) @@ -25,11 +27,41 @@ AbstractScreen::~AbstractScreen() { } +sptr AbstractScreen::GetGroup() const +{ + //sptr group = AbstractScreenController::GetInstance().GetAbstractScreenGroup(groupDmsId_); + //return group; + return nullptr; +} + AbstractScreenGroup::AbstractScreenGroup(ScreenId dmsId, ScreenId rsId) : AbstractScreen(dmsId, rsId) { + type_ = ScreenType::UNDEFINE; } AbstractScreenGroup::~AbstractScreenGroup() { } + +void AbstractScreenGroup::AddChild(ScreenCombination type, sptr& dmsScreen, Point& startPoint) +{ +} + +void AbstractScreenGroup::AddChild(ScreenCombination type, + std::vector>& dmsScreens, + std::vector& startPoints) +{ +} + +std::vector> AbstractScreenGroup::GetChildren() const +{ + std::vector> tmp; + return tmp; +} + +std::vector AbstractScreenGroup::GetChildrenPosition() const +{ + std::vector tmp; + return tmp; +} } // namespace OHOS::Rosen \ No newline at end of file diff --git a/dmserver/src/abstract_screen_controller.cpp b/dmserver/src/abstract_screen_controller.cpp index 8144c6da97..7b9c91952b 100644 --- a/dmserver/src/abstract_screen_controller.cpp +++ b/dmserver/src/abstract_screen_controller.cpp @@ -16,6 +16,7 @@ #include "abstract_screen_controller.h" #include +#include #include #include @@ -30,69 +31,90 @@ namespace { AbstractScreenController::AbstractScreenController(std::recursive_mutex& mutex) : mutex_(mutex), rsInterface_(RSInterfaces::GetInstance()) { - dmsScreenCount_ = 0; - // TODO : PrepareRSScreenManger } AbstractScreenController::~AbstractScreenController() { } +void AbstractScreenController::Init() +{ + WLOGFD("screen controller init"); + dmsScreenCount_ = 0; + rsInterface_.SetScreenChangeCallback( + std::bind(&AbstractScreenController::OnRsScreenChange, this, std::placeholders::_1, std::placeholders::_2)); +} + std::vector AbstractScreenController::GetAllScreenIds() { std::vector tmp; return tmp; } -std::shared_ptr> AbstractScreenController::ConvertToRsScreenId(ScreenId dmsScreenId) +sptr AbstractScreenController::GetAbstractScreen(ScreenId dmsScreenId) { - std::lock_guard lock(mutex_); - std::shared_ptr> empty = std::make_shared>(); - return empty; + auto iter = dmsScreenMap_.find(dmsScreenId); + if (iter == dmsScreenMap_.end()) { + WLOGE("didnot find screen:%{public}" PRIu64"", dmsScreenId); + return nullptr; + } + sptr screen = iter->second; + return screen; +} + +sptr AbstractScreenController::GetAbstractScreenGroup(ScreenId dmsScreenId) +{ + auto iter = dmsScreenGroupMap_.find(dmsScreenId); + if (iter == dmsScreenGroupMap_.end()) { + WLOGE("didnot find screen:%{public}" PRIu64"", dmsScreenId); + return nullptr; + } + sptr screen = iter->second; + return screen; } -std::shared_ptr> AbstractScreenController::ConvertToDmsScreenId(ScreenId rsScreenId) +ScreenId AbstractScreenController::ConvertToRsScreenId(ScreenId dmsScreenId) { std::lock_guard lock(mutex_); - std::shared_ptr> empty = std::make_shared>(); - return empty; + return SCREEN_ID_INVALID; } -void AbstractScreenController::RegisterAbstractScreenCallback(sptr cb) +ScreenId AbstractScreenController::ConvertToDmsScreenId(ScreenId rsScreenId) { std::lock_guard lock(mutex_); - abstractScreenCallback_ = cb; + return SCREEN_ID_INVALID; } -void AbstractScreenController::PrepareRSScreenManger() +void AbstractScreenController::RegisterAbstractScreenCallback(sptr cb) { - { - std::lock_guard lock(mutex_); - defaultScreenId_ = rsInterface_.GetDefaultScreenId(); - } - rsInterface_.SetScreenChangeCallback( - std::bind(&AbstractScreenController::OnRsScreenChange, this, std::placeholders::_1, std::placeholders::_2)); + std::lock_guard lock(mutex_); + abstractScreenCallback_ = cb; } void AbstractScreenController::OnRsScreenChange(ScreenId rsScreenId, ScreenEvent screenEvent) { + WLOGFI("rs screen event. id:%{public}" PRIu64", event:%{public}ud", rsScreenId, static_cast(screenEvent)); ScreenId dmsScreenId = INVALID_SCREEN_ID; std::lock_guard lock(mutex_); if (screenEvent == ScreenEvent::CONNECTED) { auto iter = rs2DmsScreenIdMap_.find(rsScreenId); if (iter == rs2DmsScreenIdMap_.end()) { - dmsScreenId = dmsScreenCount_++; - std::shared_ptr> dmsVector = std::make_shared>(); - dmsVector->push_back(dmsScreenId); - rs2DmsScreenIdMap_.insert(std::make_pair(rsScreenId, dmsVector)); - std::shared_ptr> rsVector = std::make_shared>(); - dmsVector->push_back(rsScreenId); - dms2RsScreenIdMap_.insert(std::make_pair(dmsScreenId, rsVector)); + WLOGFD("connect new screen. dmsId:%{public}" PRIu64"", dmsScreenId); + dmsScreenId = dmsScreenCount_; sptr absScreen = new AbstractScreen(dmsScreenId, rsScreenId); + if (!FillAbstractScreen(absScreen, rsScreenId)) { + return; + } + rs2DmsScreenIdMap_.insert(std::make_pair(rsScreenId, dmsScreenId)); + dms2RsScreenIdMap_.insert(std::make_pair(dmsScreenId, rsScreenId)); dmsScreenMap_.insert(std::make_pair(dmsScreenId, absScreen)); - // TODO: rsInterface_.GetScreenActiveMode() - // TODO: rsInterface_.GetScreenSupportedModes() - AddToGroup(absScreen); + dmsScreenCount_++; + sptr screenGroup = AddToGroupLocked(absScreen); + if (screenGroup != nullptr && abstractScreenCallback_ != nullptr) { + abstractScreenCallback_->onConnected_(absScreen); + } + } else { + WLOGE("reconnect screen, screenId=%{public}" PRIu64"", rsScreenId); } } else if (screenEvent == ScreenEvent::DISCONNECTED) { WLOGI("connect screen"); @@ -101,22 +123,61 @@ void AbstractScreenController::OnRsScreenChange(ScreenId rsScreenId, ScreenEvent } } -void AbstractScreenController::AddToGroup(sptr newScreen) +bool AbstractScreenController::FillAbstractScreen(sptr& absScreen, ScreenId rsScreenId) { - std::lock_guard lock(mutex_); - auto iter = dmsScreenMap_.find(defaultScreenId_); - if (iter == dmsScreenMap_.end()) { - WLOGE("did not find default screen screenId:%{public}" PRIu64"", defaultScreenId_); - AddAsFirstScreenLocked(newScreen); + std::vector allModes = rsInterface_.GetScreenSupportedModes(rsScreenId); + if (allModes.size() == 0) { + WLOGE("supported screen mode is 0, screenId=%{public}" PRIu64"", rsScreenId); + return false; + } + for (RSScreenModeInfo rsScreenModeInfo : allModes) { + sptr info = new AbstractScreenInfo(); + info->width_ = rsScreenModeInfo.GetScreenWidth(); + info->height_ = rsScreenModeInfo.GetScreenHeight(); + info->freshRate_ = rsScreenModeInfo.GetScreenFreshRate(); + absScreen->infos_.push_back(info); + WLOGD("fill screen w/h:%{public}d/%{public}d", info->width_, info->height_); + } + int32_t activeModeId = rsInterface_.GetScreenActiveMode(rsScreenId).GetScreenModeId(); + WLOGD("fill screen activeModeId:%{public}d", activeModeId); + if (activeModeId >= allModes.size()) { + WLOGE("activeModeId exceed, screenId=%{public}" PRIu64", activeModeId:%{public}d/%{public}d", + rsScreenId, activeModeId, allModes.size()); + return false; + } + absScreen->activeIdx_ = activeModeId; + return true; +} + +sptr AbstractScreenController::AddToGroupLocked(sptr newScreen) +{ + if (defaultDmsScreenId_ == SCREEN_ID_INVALID) { + WLOGE("connect the first screen"); + return AddAsFirstScreenLocked(newScreen); } else { - sptr defaultScreen = iter->second; AddAsSuccedentScreenLocked(newScreen); + return nullptr; } } -void AbstractScreenController::AddAsFirstScreenLocked(sptr newScreen) +sptr AbstractScreenController::AddAsFirstScreenLocked(sptr newScreen) { // TODO: Create default display + ScreenId dmsGroupScreenId = dmsScreenCount_++; + sptr sreenGroup = new AbstractScreenGroup(dmsGroupScreenId, SCREEN_ID_INVALID); + Point point; + sreenGroup->AddChild(ScreenCombination::SCREEN_ALONE, newScreen, point); + newScreen->groupDmsId_ = dmsGroupScreenId; + auto iter = dmsScreenGroupMap_.find(dmsGroupScreenId); + if (iter != dmsScreenGroupMap_.end()) { + WLOGE("group screen existed. id=%{public}" PRIu64"", dmsGroupScreenId); + dmsScreenGroupMap_.erase(iter); + } + dmsScreenGroupMap_.insert(std::make_pair(dmsGroupScreenId, sreenGroup)); + dmsScreenMap_.insert(std::make_pair(dmsGroupScreenId, sreenGroup)); + WLOGI("connect new group screen. id=%{public}" PRIu64"/%{public}" PRIu64", combination:%{public}ud", + newScreen->dmsId_, dmsGroupScreenId, newScreen->type_); + return sreenGroup; } void AbstractScreenController::AddAsSuccedentScreenLocked(sptr newScreen) diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index 3825b07401..94791e6368 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -31,7 +31,10 @@ namespace { const bool REGISTER_RESULT = SystemAbility::MakeAndRegisterAbility(&SingletonContainer::Get()); -DisplayManagerService::DisplayManagerService() : SystemAbility(DISPLAY_MANAGER_SERVICE_SA_ID, true) +DisplayManagerService::DisplayManagerService() : + SystemAbility(DISPLAY_MANAGER_SERVICE_SA_ID, true), + abstractScreenController_(new AbstractScreenController(mutex_)), + abstractDisplayController_(new AbstractDisplayController(mutex_)) { } @@ -51,6 +54,8 @@ bool DisplayManagerService::Init() WLOGFW("DisplayManagerService::Init failed"); return false; } + abstractScreenController_->Init(); + abstractDisplayController_->Init(abstractScreenController_); WLOGFI("DisplayManagerService::Init success"); return true; } @@ -67,7 +72,7 @@ ScreenId DisplayManagerService::GetScreenIdFromDisplayId(DisplayId displayId) DisplayId DisplayManagerService::GetDefaultDisplayId() { - ScreenId screenId = AbstractDisplayController::GetInstance().GetDefaultScreenId(); + ScreenId screenId = abstractDisplayController_->GetDefaultScreenId(); WLOGFI("GetDefaultDisplayId %{public}" PRIu64"", screenId); return GetDisplayIdFromScreenId(screenId); } @@ -76,7 +81,7 @@ DisplayInfo DisplayManagerService::GetDisplayInfoById(DisplayId displayId) { DisplayInfo displayInfo; ScreenId screenId = GetScreenIdFromDisplayId(displayId); - auto screenModeInfo = AbstractDisplayController::GetInstance().GetScreenActiveMode(screenId); + auto screenModeInfo = abstractDisplayController_->GetScreenActiveMode(screenId); displayInfo.id_ = displayId; displayInfo.width_ = screenModeInfo.GetScreenWidth(); displayInfo.height_ = screenModeInfo.GetScreenHeight(); @@ -90,7 +95,7 @@ DisplayId DisplayManagerService::CreateVirtualDisplay(const VirtualDisplayInfo & WLOGFI("name %{public}s, width %{public}u, height %{public}u, mirrotId %{public}" PRIu64", flags %{public}d", virtualDisplayInfo.name_.c_str(), virtualDisplayInfo.width_, virtualDisplayInfo.height_, virtualDisplayInfo.displayIdToMirror_, virtualDisplayInfo.flags_); - ScreenId screenId = AbstractDisplayController::GetInstance().CreateVirtualScreen(virtualDisplayInfo, surface); + ScreenId screenId = abstractDisplayController_->CreateVirtualScreen(virtualDisplayInfo, surface); return GetDisplayIdFromScreenId(screenId); } @@ -98,13 +103,13 @@ bool DisplayManagerService::DestroyVirtualDisplay(DisplayId displayId) { WLOGFI("DisplayManagerService::DestroyVirtualDisplay"); ScreenId screenId = GetScreenIdFromDisplayId(displayId); - return AbstractDisplayController::GetInstance().DestroyVirtualScreen(screenId); + return abstractDisplayController_->DestroyVirtualScreen(screenId); } sptr DisplayManagerService::GetDispalySnapshot(DisplayId displayId) { ScreenId screenId = GetScreenIdFromDisplayId(displayId); - sptr screenSnapshot = AbstractDisplayController::GetInstance().GetScreenSnapshot(screenId); + sptr screenSnapshot = abstractDisplayController_->GetScreenSnapshot(screenId); return screenSnapshot; } diff --git a/interfaces/innerkits/dm/screen_group.h b/interfaces/innerkits/dm/screen_group.h index df7346d173..50e2a0d04b 100644 --- a/interfaces/innerkits/dm/screen_group.h +++ b/interfaces/innerkits/dm/screen_group.h @@ -21,7 +21,7 @@ #include "screen.h" namespace OHOS::Rosen { -enum class ScreenType : uint32_t { +enum class ScreenCombination : uint32_t { SCREEN_ALONE, SCREEN_EXPAND, SCREEN_MIRROR, @@ -29,7 +29,7 @@ enum class ScreenType : uint32_t { class ScreenGroup : public Screen { public: - ScreenType GetType() const; + ScreenCombination GetCombination() const; std::vector> GetChildren() const; std::vector GetChildrenPosition() const; diff --git a/interfaces/innerkits/dm/screen_manager.h b/interfaces/innerkits/dm/screen_manager.h index ece342b836..7900ef8bc0 100644 --- a/interfaces/innerkits/dm/screen_manager.h +++ b/interfaces/innerkits/dm/screen_manager.h @@ -34,6 +34,7 @@ WM_DECLARE_SINGLE_INSTANCE_BASE(ScreenManager); public: sptr GetScreenById(ScreenId id); std::vector> GetAllScreens(); + void RegisterScreenChangeListener(sptr listener); sptr makeExpand(std::vector screenId, std::vector startPoint); sptr makeMirror(ScreenId mainScreenId, std::vector mirrorScreenId); sptr createVirtualScreen(VirtualScreenOption option); diff --git a/wm/BUILD.gn b/wm/BUILD.gn index cde38987b4..2dd8b71b0a 100644 --- a/wm/BUILD.gn +++ b/wm/BUILD.gn @@ -109,6 +109,8 @@ ohos_shared_library("libwm") { "../dm/src/display_manager.cpp", "../dm/src/display_manager_adapter.cpp", "../dm/src/screen.cpp", + "../dm/src/screen_group.cpp", + "../dm/src/screen_manager.cpp", "../dmserver/src/display_manager_proxy.cpp", "../wmserver/src/window_manager_proxy.cpp", "src/input_transfer_station.cpp", -- Gitee