From fd073df516a5ae9e33588b386addce6263ea2254 Mon Sep 17 00:00:00 2001 From: lu Date: Sat, 22 Jan 2022 16:55:51 +0800 Subject: [PATCH] Modify the interface of 'Screen' Signed-off-by: lu Change-Id: Ic1bf65f9fa7c269204906d67bfb45483661a2ee4 --- bundle.json | 19 +++++--- dm/include/display_manager_adapter.h | 2 +- dm/src/display_manager_adapter.cpp | 8 ++-- dm/src/screen.cpp | 8 ++-- dm/src/screen_group.cpp | 14 +++++- dm/src/screen_manager.cpp | 14 ++---- dm/test/systemtest/screen_manager_test.cpp | 24 ++++++---- dm/test/unittest/screen_manager_test.cpp | 4 +- dmserver/include/abstract_display.h | 3 +- .../include/abstract_display_controller.h | 1 + dmserver/include/abstract_screen.h | 3 +- dmserver/include/abstract_screen_controller.h | 1 + dmserver/include/display_manager_interface.h | 8 ++-- dmserver/include/display_manager_proxy.h | 2 +- dmserver/include/display_manager_service.h | 2 +- dmserver/src/abstract_display.cpp | 16 ++++--- dmserver/src/abstract_display_controller.cpp | 46 ++++++++++++++++++- dmserver/src/abstract_screen.cpp | 7 +++ dmserver/src/abstract_screen_controller.cpp | 17 ++++++- dmserver/src/display_manager_proxy.cpp | 23 +++++----- dmserver/src/display_manager_service.cpp | 26 ++++++----- dmserver/src/display_manager_stub.cpp | 11 +++-- interfaces/innerkits/dm/screen.h | 5 +- interfaces/innerkits/dm/screen_group.h | 6 ++- interfaces/innerkits/dm/screen_manager.h | 5 +- wm/src/window_impl.cpp | 4 -- wmserver/src/window_layout_policy.cpp | 15 ++++++ 27 files changed, 203 insertions(+), 91 deletions(-) diff --git a/bundle.json b/bundle.json index deca69d432..67b6721616 100644 --- a/bundle.json +++ b/bundle.json @@ -1,15 +1,22 @@ { - "name": "@openharmony/window_manager", - "version": "3.1.0", - "description": "window_manager", - "repository": "", + "name": "@ohos/window_manager", + "description": "library for window", + "version": "3.1", "license": "Apache License 2.0", + "publishAs": "code-segment", + "segment": { + "destPath": "foundation/windowmanager" + }, + "dirs": {}, + "scripts": {}, "component": { "name": "window_manager", "subsystem": "window", + "syscap": [], + "features": [], "adapted_system_type": [ "standard" ], - "rom": {}, - "ram": {}, + "rom": "8000KB", + "ram": "8000KB", "deps": { "components": [ "libhilog", diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index b9de904315..6bfcd25ff4 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -54,7 +54,7 @@ public: virtual bool SetDisplayState(DisplayState state); virtual DisplayState GetDisplayState(uint64_t displayId); virtual void NotifyDisplayEvent(DisplayEvent event); - virtual DMError AddMirror(ScreenId mainScreenId, ScreenId mirrorScreenId); + virtual DMError CreateMirror(ScreenId mainScreenId, std::vector mirrorScreenId); virtual void Clear(); private: diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index 4c01ccf593..a9994d92e4 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -81,7 +81,7 @@ std::shared_ptr DisplayManagerAdapter::GetDisplaySnapshot(Displ ScreenId DisplayManagerAdapter::CreateVirtualScreen(VirtualScreenOption option) { if (!InitDMSProxyLocked()) { - return SCREEN_ID_INVALD; + return SCREEN_ID_INVALID; } WLOGFI("DisplayManagerAdapter::CreateVirtualScreen"); return displayManagerServiceProxy_->CreateVirtualScreen(option); @@ -250,13 +250,11 @@ void DisplayManagerAdapter::Clear() displayManagerServiceProxy_ = nullptr; } -DMError DisplayManagerAdapter::AddMirror(ScreenId mainScreenId, ScreenId mirrorScreenId) +DMError DisplayManagerAdapter::CreateMirror(ScreenId mainScreenId, std::vector mirrorScreenId) { if (!InitDMSProxyLocked()) { - WLOGFE("DisplayManagerAdapter::AddMirror: InitDMSProxyLocked failed"); return DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED; } - WLOGFI("DisplayManagerAdapter::AddMirror"); - return displayManagerServiceProxy_->AddMirror(mainScreenId, mirrorScreenId); + return displayManagerServiceProxy_->CreateMirror(mainScreenId, mirrorScreenId); } } // namespace OHOS::Rosen \ No newline at end of file diff --git a/dm/src/screen.cpp b/dm/src/screen.cpp index e881f81ddc..5229618c9d 100644 --- a/dm/src/screen.cpp +++ b/dm/src/screen.cpp @@ -15,6 +15,8 @@ #include "screen.h" +#include "screen_group.h" + namespace OHOS::Rosen { class Screen::Impl : public RefBase { friend class Screen; @@ -22,13 +24,13 @@ public: Impl() = default; ~Impl() = default; - ScreenId id_ { SCREEN_ID_INVALD }; + ScreenId id_ { SCREEN_ID_INVALID }; uint32_t width_ { 0 }; uint32_t height_ { 0 }; uint32_t virtualWidth_ { 0 }; uint32_t virtualHeight_ { 0 }; float virtualPixelRatio_ { 0.0 }; - sptr parent_ { nullptr }; + sptr parent_ { nullptr }; bool hasChild_ { false }; }; @@ -76,7 +78,7 @@ float Screen::GetVirtualPixelRatio() const return pImpl_->virtualPixelRatio_; } -sptr Screen::GetParent() const +sptr Screen::GetParent() const { return pImpl_->parent_; } diff --git a/dm/src/screen_group.cpp b/dm/src/screen_group.cpp index 9ac0d71c0c..5b2e68bdd4 100644 --- a/dm/src/screen_group.cpp +++ b/dm/src/screen_group.cpp @@ -41,13 +41,23 @@ ScreenCombination ScreenGroup::GetCombination() const return pImpl_->combination_; } -std::vector> ScreenGroup::GetChildren() const +std::vector> ScreenGroup::GetChild() const { return pImpl_->children_; } -std::vector ScreenGroup::GetChildrenPosition() const +std::vector ScreenGroup::GetChildPosition() const { return pImpl_->position_; } + +bool AddChild(std::vector id) +{ + return true; +} + +bool AddChild(std::vector> child) +{ + return true; +} } // namespace OHOS::Rosen \ No newline at end of file diff --git a/dm/src/screen_manager.cpp b/dm/src/screen_manager.cpp index 5981a1aa82..cb79e285ae 100644 --- a/dm/src/screen_manager.cpp +++ b/dm/src/screen_manager.cpp @@ -59,21 +59,17 @@ void ScreenManager::RegisterScreenChangeListener(sptr lis { } -sptr ScreenManager::MakeExpand(std::vector screenId, std::vector startPoint) +sptr ScreenManager::CreateExpand(std::vector screenId, std::vector startPoint) { return nullptr; } -sptr ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId) +sptr ScreenManager::CreateMirror(ScreenId mainScreenId, std::vector mirrorScreenId) { - return nullptr; -} - -sptr ScreenManager::AddMirror(ScreenId mainScreenId, ScreenId mirrorScreenId) -{ - DMError result = SingletonContainer::Get().AddMirror(mainScreenId, mirrorScreenId); + WLOGFI("create mirror for screen: %{public}" PRIu64"", mainScreenId); + DMError result = SingletonContainer::Get().CreateMirror(mainScreenId, mirrorScreenId); if (result == DMError::DM_OK) { - WLOGFI("AddMirror::Successful"); + WLOGFI("create mirror success"); } return nullptr; } diff --git a/dm/test/systemtest/screen_manager_test.cpp b/dm/test/systemtest/screen_manager_test.cpp index 76068e0d79..03ece69302 100644 --- a/dm/test/systemtest/screen_manager_test.cpp +++ b/dm/test/systemtest/screen_manager_test.cpp @@ -88,7 +88,7 @@ HWTEST_F(ScreenManagerTest, ScreenManager01, Function | MediumTest | Level1) ASSERT_TRUE(utils.CreateSurface()); defaultoption_.surface_ = utils.psurface_; ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); - ASSERT_NE(SCREEN_ID_INVALD, virtualScreenId); + ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); } @@ -103,8 +103,10 @@ HWTEST_F(ScreenManagerTest, ScreenManager02, Function | MediumTest | Level1) ASSERT_TRUE(utils.CreateSurface()); defaultoption_.surface_ = utils.psurface_; ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); - ScreenManager::GetInstance().AddMirror(defaultDisplayId_, virtualScreenId); - ASSERT_NE(SCREEN_ID_INVALD, virtualScreenId); + std::vector mirrorIds; + mirrorIds.push_back(virtualScreenId); + ScreenManager::GetInstance().CreateMirror(defaultDisplayId_, mirrorIds); + ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); } @@ -120,7 +122,7 @@ HWTEST_F(ScreenManagerTest, ScreenManager03, Function | MediumTest | Level1) defaultoption_.surface_ = utils.psurface_; for (uint32_t i = 0; i < execTimes_; i++) { ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); - ASSERT_NE(SCREEN_ID_INVALD, virtualScreenId); + ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); } } @@ -137,8 +139,10 @@ HWTEST_F(ScreenManagerTest, ScreenManager04, Function | MediumTest | Level1) defaultoption_.surface_ = utils.psurface_; for (uint32_t i = 0; i < execTimes_; i++) { ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); - ScreenManager::GetInstance().AddMirror(static_cast(defaultDisplayId_), virtualScreenId); - ASSERT_NE(SCREEN_ID_INVALD, virtualScreenId); + std::vector mirrorIds; + mirrorIds.push_back(virtualScreenId); + ScreenManager::GetInstance().CreateMirror(static_cast(defaultDisplayId_), mirrorIds); + ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); ASSERT_EQ(DMError::DM_OK, ScreenManager::GetInstance().DestroyVirtualScreen(virtualScreenId)); } } @@ -156,9 +160,11 @@ HWTEST_F(ScreenManagerTest, ScreenManager05, Function | MediumTest | Level1) defaultoption_.surface_ = utils.psurface_; ScreenId virtualScreenId = ScreenManager::GetInstance().CreateVirtualScreen(defaultoption_); - ASSERT_NE(SCREEN_ID_INVALD, virtualScreenId); + ASSERT_NE(SCREEN_ID_INVALID, virtualScreenId); uint32_t lastCount = -1u; - ScreenManager::GetInstance().AddMirror(static_cast(defaultDisplayId_), virtualScreenId); + std::vector mirrorIds; + mirrorIds.push_back(virtualScreenId); + ScreenManager::GetInstance().CreateMirror(static_cast(defaultDisplayId_), mirrorIds); while (utils.successCount_ < acquireFrames_ && waitCount_ <= maxWaitCount_) { if (lastCount != utils.successCount_) { lastCount = utils.successCount_; @@ -173,4 +179,4 @@ HWTEST_F(ScreenManagerTest, ScreenManager05, Function | MediumTest | Level1) } } } // namespace Rosen -} // namespace OHOS +} // namespace OHOS \ No newline at end of file diff --git a/dm/test/unittest/screen_manager_test.cpp b/dm/test/unittest/screen_manager_test.cpp index 3ddd5c6540..9c4ace1580 100644 --- a/dm/test/unittest/screen_manager_test.cpp +++ b/dm/test/unittest/screen_manager_test.cpp @@ -60,11 +60,11 @@ HWTEST_F(ScreenManagerTest, CreateAndDestory01, Function | SmallTest | Level1) VirtualScreenOption wrongOption = {defaultName_, defaultWidth_, defaultHeight_, defaultDensity_, nullptr, defaultFlags_}; std::unique_ptr m = std::make_unique(); - EXPECT_CALL(m->Mock(), CreateVirtualScreen(_)).Times(1).WillOnce(Return(SCREEN_ID_INVALD)); + EXPECT_CALL(m->Mock(), CreateVirtualScreen(_)).Times(1).WillOnce(Return(SCREEN_ID_INVALID)); EXPECT_CALL(m->Mock(), DestroyVirtualScreen(_)).Times(1).WillOnce(Return(DMError::DM_ERROR_INVALID_PARAM)); ScreenId id = ScreenManager::GetInstance().CreateVirtualScreen(wrongOption); DMError ret = ScreenManager::GetInstance().DestroyVirtualScreen(id); - ASSERT_EQ(SCREEN_ID_INVALD, id); + ASSERT_EQ(SCREEN_ID_INVALID, id); ASSERT_EQ(DMError::DM_ERROR_INVALID_PARAM, ret); } diff --git a/dmserver/include/abstract_display.h b/dmserver/include/abstract_display.h index b6959f4a6a..91e543b5cb 100644 --- a/dmserver/include/abstract_display.h +++ b/dmserver/include/abstract_display.h @@ -40,7 +40,8 @@ public: uint32_t GetFreshRate() const; float GetVirtualPixelRatio() const; ScreenId GetAbstractScreenId() const; - bool BindAbstractScreenId(ScreenId dmsScreenId); + bool BindAbstractScreen(ScreenId dmsScreenId); + bool BindAbstractScreen(sptr abstractDisplay); void SetId(DisplayId displayId); void SetWidth(int32_t width); diff --git a/dmserver/include/abstract_display_controller.h b/dmserver/include/abstract_display_controller.h index 64006bfdf6..811abce463 100644 --- a/dmserver/include/abstract_display_controller.h +++ b/dmserver/include/abstract_display_controller.h @@ -45,6 +45,7 @@ private: void OnAbstractScreenChanged(sptr absScreen); void BindAloneScreenLocked(sptr absScreen); void AddScreenToMirrorLocked(sptr group, sptr realAbsScreen); + void ProcessScreenDisconnected(sptr absScreen, sptr screenGroup); std::recursive_mutex& mutex_; std::atomic displayCount_ { 0 }; diff --git a/dmserver/include/abstract_screen.h b/dmserver/include/abstract_screen.h index cdce4a91d3..1cdcd30edb 100644 --- a/dmserver/include/abstract_screen.h +++ b/dmserver/include/abstract_screen.h @@ -26,8 +26,6 @@ #include "screen.h" namespace OHOS::Rosen { -constexpr static ScreenId SCREEN_ID_INVALID = INVALID_SCREEN_ID; - enum class ScreenCombination : uint32_t { SCREEN_ALONE, SCREEN_EXPAND, @@ -74,6 +72,7 @@ public: bool AddChild(sptr& dmsScreen, Point& startPoint); bool AddChildren(std::vector>& dmsScreens, std::vector& startPoints); bool RemoveChild(sptr& dmsScreen); + bool HasChild(ScreenId childScreen) const; std::vector> GetChildren() const; std::vector GetChildrenPosition() const; size_t GetChildCount() const; diff --git a/dmserver/include/abstract_screen_controller.h b/dmserver/include/abstract_screen_controller.h index dd8b09ef9f..e9527f9301 100644 --- a/dmserver/include/abstract_screen_controller.h +++ b/dmserver/include/abstract_screen_controller.h @@ -59,6 +59,7 @@ private: bool FillAbstractScreen(sptr& absScreen, ScreenId rsScreenId); sptr AddToGroupLocked(sptr newScreen); sptr RemoveFromGroupLocked(sptr newScreen); + bool CheckScreenInScreenGroup(sptr newScreen) const; sptr AddAsFirstScreenLocked(sptr newScreen); sptr AddAsSuccedentScreenLocked(sptr newScreen); diff --git a/dmserver/include/display_manager_interface.h b/dmserver/include/display_manager_interface.h index 743602d6d2..544b657be1 100644 --- a/dmserver/include/display_manager_interface.h +++ b/dmserver/include/display_manager_interface.h @@ -44,9 +44,11 @@ public: TRANS_ID_SET_DISPLAY_STATE, TRANS_ID_GET_DISPLAY_STATE, TRANS_ID_NOTIFY_DISPLAY_EVENT, - TRANS_ID_CREATE_VIRTUAL_SCREEN = 100000, + TRANS_ID_CREATE_VIRTUAL_SCREEN = 1000, TRANS_ID_DESTROY_VIRTUAL_SCREEN, - TRANS_ID_ADD_MIRROR, + TRANS_ID_SCREENGROUP_BASE = 1100, + TRANS_ID_SCREEN_CREAT_MIRROR = TRANS_ID_SCREENGROUP_BASE, + TRANS_ID_SCREEN_ADD_MIRROR, }; virtual DisplayId GetDefaultDisplayId() = 0; @@ -68,7 +70,7 @@ public: virtual bool SetDisplayState(DisplayState state) = 0; virtual DisplayState GetDisplayState(uint64_t displayId) = 0; virtual void NotifyDisplayEvent(DisplayEvent event) = 0; - virtual DMError AddMirror(ScreenId mainScreenId, ScreenId mirrorScreenId) = 0; + virtual DMError CreateMirror(ScreenId mainScreenId, std::vector mirrorScreenId) = 0; }; } // namespace OHOS::Rosen diff --git a/dmserver/include/display_manager_proxy.h b/dmserver/include/display_manager_proxy.h index a3c33988c1..213538c6f8 100644 --- a/dmserver/include/display_manager_proxy.h +++ b/dmserver/include/display_manager_proxy.h @@ -50,7 +50,7 @@ public: bool SetDisplayState(DisplayState state) override; DisplayState GetDisplayState(uint64_t displayId) override; void NotifyDisplayEvent(DisplayEvent event) override; - DMError AddMirror(ScreenId mainScreenId, ScreenId mirrorScreenId) override; + DMError CreateMirror(ScreenId mainScreenId, std::vector mirrorScreenId) override; private: static inline BrokerDelegator delegator_; diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index ca28880fc6..8907d79869 100644 --- a/dmserver/include/display_manager_service.h +++ b/dmserver/include/display_manager_service.h @@ -61,7 +61,7 @@ public: bool NotifyDisplayPowerEvent(DisplayPowerEvent event, EventStatus status); sptr GetAbstractScreenController(); - DMError AddMirror(ScreenId mainScreenId, ScreenId mirrorScreenId) override; + DMError CreateMirror(ScreenId mainScreenId, std::vector mirrorScreenId) override; private: DisplayManagerService(); diff --git a/dmserver/src/abstract_display.cpp b/dmserver/src/abstract_display.cpp index c900f648a7..e39987c35b 100644 --- a/dmserver/src/abstract_display.cpp +++ b/dmserver/src/abstract_display.cpp @@ -91,18 +91,22 @@ void AbstractDisplay::SetId(DisplayId id) id_ = id; } -bool AbstractDisplay::BindAbstractScreenId(ScreenId dmsScreenId) +bool AbstractDisplay::BindAbstractScreen(ScreenId dmsScreenId) { sptr screenController = DisplayManagerService::GetInstance().GetAbstractScreenController(); - sptr screen = screenController->GetAbstractScreen(dmsScreenId); - if (screen == nullptr) { - WLOGE("display bind screen error, cannot get screen. display:%{public}" PRIu64", screen:%{public}" PRIu64"", - id_, dmsScreenId); + return BindAbstractScreen(screenController->GetAbstractScreen(dmsScreenId)); +} + +bool AbstractDisplay::BindAbstractScreen(sptr abstractScreen) +{ + if (abstractScreen == nullptr) { + WLOGE("display bind screen error, cannot get screen. display:%{public}" PRIu64"", id_); return false; } + ScreenId dmsScreenId = abstractScreen->dmsId_; // TODO: screen->rsDisplayNode_->SetScreenId(rsScreenId); - sptr info = screen->GetActiveScreenInfo(); + sptr info = abstractScreen->GetActiveScreenInfo(); if (info == nullptr) { WLOGE("display bind screen error, cannot get info. display:%{public}" PRIu64", screen:%{public}" PRIu64"", id_, dmsScreenId); diff --git a/dmserver/src/abstract_display_controller.cpp b/dmserver/src/abstract_display_controller.cpp index 4949d387a1..6bd951281a 100644 --- a/dmserver/src/abstract_display_controller.cpp +++ b/dmserver/src/abstract_display_controller.cpp @@ -130,6 +130,50 @@ void AbstractDisplayController::OnAbstractScreenConnected(sptr a void AbstractDisplayController::OnAbstractScreenDisconnected(sptr absScreen) { + WLOGI("disconnect screen. id:%{public}" PRIu64"", absScreen->dmsId_); + if (absScreen == nullptr) { + WLOGE("the information of the screen is wrong"); + return; + } + std::lock_guard lock(mutex_); + sptr screenGroup = absScreen->GetGroup(); + if (screenGroup == nullptr) { + WLOGE("the group information of the screen is wrong"); + return; + } + if (absScreen->type_ == ScreenType::REAL) { + if (screenGroup->combination_ == ScreenCombination::SCREEN_ALONE + || screenGroup->combination_ == ScreenCombination::SCREEN_MIRROR) { + ProcessScreenDisconnected(absScreen, screenGroup); + } else { + WLOGE("support in future. combination:%{public}u", screenGroup->combination_); + } + } else { + WLOGE("support in future. type_:%{public}u", absScreen->type_); + } +} + +void AbstractDisplayController::ProcessScreenDisconnected( + sptr absScreen, sptr screenGroup) +{ + auto screens = screenGroup->GetChildren(); + sptr defaultScreen; + for (auto iter = screens.begin(); iter != screens.end(); iter++) { + if ((*iter)->type_ == ScreenType::REAL) { + defaultScreen = (*iter); + break; + } + } + for (auto iter = abstractDisplayMap_.begin(); iter != abstractDisplayMap_.end(); iter++) { + sptr abstractDisplay = iter->second; + if (abstractDisplay->GetAbstractScreenId() != absScreen->dmsId_) { + continue; + } + abstractDisplay->BindAbstractScreen(defaultScreen); + if (screenGroup->GetChildCount() == 0) { + abstractDisplayMap_.erase(iter); + } + } } void AbstractDisplayController::OnAbstractScreenChanged(sptr absScreen) @@ -154,7 +198,7 @@ void AbstractDisplayController::BindAloneScreenLocked(sptr realA } else { WLOGI("bind display for new screen. screen:%{public}" PRIu64", display:%{public}" PRIu64"", realAbsScreen->dmsId_, dummyDisplay_->GetId()); - dummyDisplay_->BindAbstractScreenId(realAbsScreen->dmsId_); + dummyDisplay_->BindAbstractScreen(realAbsScreen->dmsId_); dummyDisplay_ = nullptr; } } else { diff --git a/dmserver/src/abstract_screen.cpp b/dmserver/src/abstract_screen.cpp index 04507517f9..ef1a4c71fd 100644 --- a/dmserver/src/abstract_screen.cpp +++ b/dmserver/src/abstract_screen.cpp @@ -116,6 +116,7 @@ bool AbstractScreenGroup::RemoveChild(sptr& dmsScreen) return false; } ScreenId screenId = dmsScreen->dmsId_; + dmsScreen->groupDmsId_ = SCREEN_ID_INVALID; bool res = abstractScreenMap_.erase(screenId); if (abstractScreenMap_.size() == 1) { combination_ = ScreenCombination::SCREEN_ALONE; @@ -123,6 +124,12 @@ bool AbstractScreenGroup::RemoveChild(sptr& dmsScreen) return res; } +bool AbstractScreenGroup::HasChild(ScreenId childScreen) const +{ + auto iter = abstractScreenMap_.find(childScreen); + return iter != abstractScreenMap_.end(); +} + std::vector> AbstractScreenGroup::GetChildren() const { std::vector> res; diff --git a/dmserver/src/abstract_screen_controller.cpp b/dmserver/src/abstract_screen_controller.cpp index f99a1c987f..c21a1d9f59 100644 --- a/dmserver/src/abstract_screen_controller.cpp +++ b/dmserver/src/abstract_screen_controller.cpp @@ -145,10 +145,10 @@ void AbstractScreenController::ProcessScreenDisconnected(ScreenId rsScreenId) dmsScreenId = iter->second; auto dmsScreenMapIter = dmsScreenMap_.find(dmsScreenId); if (dmsScreenMapIter != dmsScreenMap_.end()) { - sptr screenGroup = RemoveFromGroupLocked(dmsScreenMapIter->second); - if (screenGroup != nullptr && abstractScreenCallback_ != nullptr) { + if (abstractScreenCallback_ != nullptr && CheckScreenInScreenGroup(dmsScreenMapIter->second)) { abstractScreenCallback_->onDisconnected_(dmsScreenMapIter->second); } + RemoveFromGroupLocked(dmsScreenMapIter->second); dmsScreenMap_.erase(dmsScreenMapIter); auto firstIter = dmsScreenMap_.begin(); if (firstIter == dmsScreenMap_.end()) { @@ -224,6 +224,19 @@ sptr AbstractScreenController::RemoveFromGroupLocked(sptr screen) const +{ + WLOGI("CheckScreenInScreenGroup."); + auto groupDmsId = screen->groupDmsId_; + auto iter = dmsScreenGroupMap_.find(groupDmsId); + if (iter == dmsScreenGroupMap_.end()) { + WLOGE("CheckScreenInScreenGroup. groupDmsId:%{public}" PRIu64"is not in dmsScreenGroupMap_.", groupDmsId); + return false; + } + sptr screenGroup = iter->second; + return screenGroup->HasChild(screen->dmsId_); +} + sptr AbstractScreenController::AddAsFirstScreenLocked(sptr newScreen) { ScreenId dmsGroupScreenId = dmsScreenCount_.load(); diff --git a/dmserver/src/display_manager_proxy.cpp b/dmserver/src/display_manager_proxy.cpp index 8ff32975a6..404dd9ba7c 100644 --- a/dmserver/src/display_manager_proxy.cpp +++ b/dmserver/src/display_manager_proxy.cpp @@ -86,7 +86,7 @@ ScreenId DisplayManagerProxy::CreateVirtualScreen(VirtualScreenOption virtualOpt sptr remote = Remote(); if (remote == nullptr) { WLOGFW("DisplayManagerProxy::CreateVirtualScreen: remote is nullptr"); - return SCREEN_ID_INVALD; + return SCREEN_ID_INVALID; } MessageParcel data; @@ -94,7 +94,7 @@ ScreenId DisplayManagerProxy::CreateVirtualScreen(VirtualScreenOption virtualOpt MessageOption option; if (!data.WriteInterfaceToken(GetDescriptor())) { WLOGFE("DisplayManagerProxy::CreateVirtualScreen: WriteInterfaceToken failed"); - return SCREEN_ID_INVALD; + return SCREEN_ID_INVALID; } bool res = data.WriteString(virtualOption.name_) && data.WriteUint32(virtualOption.width_) && data.WriteUint32(virtualOption.height_) && data.WriteFloat(virtualOption.density_) && @@ -102,11 +102,11 @@ ScreenId DisplayManagerProxy::CreateVirtualScreen(VirtualScreenOption virtualOpt data.WriteInt32(virtualOption.flags_); if (!res) { WLOGFE("DisplayManagerProxy::Write data failed"); - return SCREEN_ID_INVALD; + return SCREEN_ID_INVALID; } if (remote->SendRequest(TRANS_ID_CREATE_VIRTUAL_SCREEN, data, reply, option) != ERR_NONE) { WLOGFW("DisplayManagerProxy::CreateVirtualScreen: SendRequest failed"); - return SCREEN_ID_INVALD; + return SCREEN_ID_INVALID; } ScreenId screenId = static_cast(reply.ReadUint64()); @@ -382,11 +382,11 @@ void DisplayManagerProxy::NotifyDisplayEvent(DisplayEvent event) } } -DMError DisplayManagerProxy::AddMirror(ScreenId mainScreenId, ScreenId mirrorScreenId) +DMError DisplayManagerProxy::CreateMirror(ScreenId mainScreenId, std::vector mirrorScreenId) { sptr remote = Remote(); if (remote == nullptr) { - WLOGFW("DisplayManagerProxy::AddMirror: remote is nullptr"); + WLOGFW("create mirror fail: remote is null"); return DMError::DM_ERROR_REMOTE_CREATE_FAILED; } @@ -394,20 +394,19 @@ DMError DisplayManagerProxy::AddMirror(ScreenId mainScreenId, ScreenId mirrorScr MessageParcel reply; MessageOption option; if (!data.WriteInterfaceToken(GetDescriptor())) { - WLOGFE("DisplayManagerProxy::AddMirror: WriteInterfaceToken failed"); + WLOGFE("create mirror fail: WriteInterfaceToken failed"); return DMError::DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED; } bool res = data.WriteUint64(static_cast(mainScreenId)) && - data.WriteUint64(static_cast(mirrorScreenId)); + data.WriteUInt64Vector(mirrorScreenId); if (!res) { - WLOGFE("DisplayManagerProxy::AddMirror: data write failed"); + WLOGFE("create mirror fail: data write failed"); return DMError::DM_ERROR_WRITE_DATA_FAILED; } - if (remote->SendRequest(TRANS_ID_ADD_MIRROR, data, reply, option) != ERR_NONE) { - WLOGFW("DisplayManagerProxy::AddMirror: SendRequest failed"); + if (remote->SendRequest(TRANS_ID_SCREEN_CREAT_MIRROR, data, reply, option) != ERR_NONE) { + WLOGFW("create mirror fail: SendRequest failed"); return DMError::DM_ERROR_IPC_FAILED; } - WLOGFI("DisplayManagerProxy::AddMirror"); return static_cast(reply.ReadInt32()); } } // namespace OHOS::Rosen \ No newline at end of file diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index 1809fe8a20..dc30ba431a 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -93,9 +93,9 @@ ScreenId DisplayManagerService::CreateVirtualScreen(VirtualScreenOption option) { WM_SCOPED_TRACE("dms:CreateVirtualScreen(%s)", option.name_.c_str()); ScreenId screenId = abstractScreenController_->CreateVirtualScreen(option); - if (screenId == SCREEN_ID_INVALD) { + if (screenId == SCREEN_ID_INVALID) { WLOGFE("DisplayManagerService::CreateVirtualScreen: Get virtualScreenId failed"); - return SCREEN_ID_INVALD; + return SCREEN_ID_INVALID; } return screenId; } @@ -212,26 +212,30 @@ sptr DisplayManagerService::GetAbstractScreenControlle return abstractScreenController_; } -DMError DisplayManagerService::AddMirror(ScreenId mainScreenId, ScreenId mirrorScreenId) +DMError DisplayManagerService::CreateMirror(ScreenId mainScreenId, std::vector mirrorScreenIds) { - if (mainScreenId == SCREEN_ID_INVALID || mirrorScreenId == SCREEN_ID_INVALID) { + if (mainScreenId == SCREEN_ID_INVALID || mirrorScreenIds.empty()) { + WLOGFI("create mirror fail, screen is invalid. Screen :%{public}" PRIu64", size :%{public}u", + mainScreenId, mirrorScreenIds.size()); return DMError::DM_ERROR_INVALID_PARAM; } - WM_SCOPED_TRACE("dms:AddMirror"); - WLOGFI("AddMirror::ScreenId: %{public}" PRIu64 "", mirrorScreenId); + WM_SCOPED_TRACE("dms:CreateMirror"); + WLOGFI("create mirror. Screen: %{public}" PRIu64"", mainScreenId); std::shared_ptr displayNode = SingletonContainer::Get().GetDisplayNode(mainScreenId); if (displayNode == nullptr) { - WLOGFE("DisplayManagerService::AddMirror: GetDisplayNode failed, displayNode is nullptr"); + WLOGFE("create mirror fail, cannot get DisplayNode"); return DMError::DM_ERROR_NULLPTR; } NodeId nodeId = displayNode->GetId(); - - struct RSDisplayNodeConfig config = {mirrorScreenId, true, nodeId}; - displayNodeMap_[mirrorScreenId] = RSDisplayNode::Create(config); + for (ScreenId mirrorScreenId : mirrorScreenIds) { + struct RSDisplayNodeConfig config = { mirrorScreenId, true, nodeId }; + displayNodeMap_[mirrorScreenId] = RSDisplayNode::Create(config); + WLOGFI("add mirror screen: %{public}" PRIu64"", mirrorScreenId); + } auto transactionProxy = RSTransactionProxy::GetInstance(); transactionProxy->FlushImplicitTransaction(); - WLOGFI("DisplayManagerService::AddMirror: NodeId: %{public}" PRIu64 "", nodeId >> 32); + WLOGFI("create mirror. NodeId: %{public}" PRIu64"", nodeId); return DMError::DM_OK; } } // namespace OHOS::Rosen \ No newline at end of file diff --git a/dmserver/src/display_manager_stub.cpp b/dmserver/src/display_manager_stub.cpp index 927bd23230..83371b83a6 100644 --- a/dmserver/src/display_manager_stub.cpp +++ b/dmserver/src/display_manager_stub.cpp @@ -135,10 +135,15 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, NotifyDisplayEvent(event); break; } - case TRANS_ID_ADD_MIRROR: { + case TRANS_ID_SCREEN_CREAT_MIRROR: { ScreenId mainScreenId = static_cast(data.ReadUint64()); - ScreenId mirrorScreenId = static_cast(data.ReadUint64()); - DMError result = AddMirror(mainScreenId, mirrorScreenId); + std::vector mirrorScreenId; + if (!data.ReadUInt64Vector(&mirrorScreenId)) { + WLOGE("fail to receive mirror screen in stub. screen:%{public}" PRIu64"", mainScreenId); + break; + } + WLOGI("create mirror in stub. screen:%{public}" PRIu64"", mirrorScreenId[0]); + DMError result = CreateMirror(mainScreenId, mirrorScreenId); reply.WriteInt32(static_cast(result)); break; } diff --git a/interfaces/innerkits/dm/screen.h b/interfaces/innerkits/dm/screen.h index cc902bdda0..d13f611b2f 100644 --- a/interfaces/innerkits/dm/screen.h +++ b/interfaces/innerkits/dm/screen.h @@ -22,8 +22,9 @@ #include namespace OHOS::Rosen { +class ScreenGroup; using ScreenId = uint64_t; -static constexpr ScreenId SCREEN_ID_INVALD = -1ULL; +static constexpr ScreenId SCREEN_ID_INVALID = -1ULL; struct Point { int32_t posX_; @@ -50,7 +51,7 @@ public: uint32_t GetVirtualWidth() const; uint32_t GetVirtualHeight() const; float GetVirtualPixelRatio() const; - sptr GetParent() const; + sptr GetParent() const; private: class Impl; diff --git a/interfaces/innerkits/dm/screen_group.h b/interfaces/innerkits/dm/screen_group.h index 50e2a0d04b..a9dd072e95 100644 --- a/interfaces/innerkits/dm/screen_group.h +++ b/interfaces/innerkits/dm/screen_group.h @@ -30,8 +30,10 @@ enum class ScreenCombination : uint32_t { class ScreenGroup : public Screen { public: ScreenCombination GetCombination() const; - std::vector> GetChildren() const; - std::vector GetChildrenPosition() const; + std::vector> GetChild() const; + std::vector GetChildPosition() const; + bool AddChild(std::vector id); + bool AddChild(std::vector> child); private: ScreenGroup(); diff --git a/interfaces/innerkits/dm/screen_manager.h b/interfaces/innerkits/dm/screen_manager.h index 3310d2fdac..547c81be4b 100644 --- a/interfaces/innerkits/dm/screen_manager.h +++ b/interfaces/innerkits/dm/screen_manager.h @@ -38,9 +38,8 @@ public: std::vector> GetAllScreens(); void RegisterScreenChangeListener(sptr listener); - sptr MakeExpand(std::vector screenId, std::vector startPoint); - sptr MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId); - sptr AddMirror(ScreenId mainScreenId, ScreenId mirrorScreenId); + sptr CreateExpand(std::vector screenId, std::vector startPoint); + sptr CreateMirror(ScreenId mainScreenId, std::vector mirrorScreenId); ScreenId CreateVirtualScreen(VirtualScreenOption option); DMError DestroyVirtualScreen(ScreenId screenId); diff --git a/wm/src/window_impl.cpp b/wm/src/window_impl.cpp index 3bda4f56e9..2fccd1e09f 100644 --- a/wm/src/window_impl.cpp +++ b/wm/src/window_impl.cpp @@ -207,10 +207,6 @@ WMError WindowImpl::SetUIContent(const std::string& contentInfo, NativeEngine* engine, NativeValue* storage, bool isdistributed) { WLOGFI("SetUIContent"); - if (context_.get() == nullptr) { - WLOGFE("SetUIContent context_ is nullptr id: %{public}d", property_->GetWindowId()); - return WMError::WM_ERROR_NULLPTR; - } WLOGFI("contentInfo: %{public}s, context_:%{public}p", contentInfo.c_str(), context_.get()); uiContent_ = Ace::UIContent::Create(context_.get(), engine); if (uiContent_ == nullptr) { diff --git a/wmserver/src/window_layout_policy.cpp b/wmserver/src/window_layout_policy.cpp index 8b67bcd9db..a6a78cd26a 100644 --- a/wmserver/src/window_layout_policy.cpp +++ b/wmserver/src/window_layout_policy.cpp @@ -22,6 +22,8 @@ namespace OHOS { namespace Rosen { namespace { constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, 0, "WindowLayoutPolicy"}; + constexpr uint32_t WINDOW_TITLE_BAR_HEIGHT = 48; + constexpr uint32_t WINDOW_FRAME_WIDTH = 4; } WindowLayoutPolicy::WindowLayoutPolicy(const sptr& belowAppNode, @@ -141,6 +143,16 @@ void WindowLayoutPolicy::UpdateFloatingLayoutRect(Rect& limitRect, Rect& winRect winRect.posY_); } +static Rect ComputeDecoratedWindowRect(const Rect& winRect) +{ + Rect rect; + rect.posX_ = winRect.posX_; + rect.posY_ = winRect.posY_; + rect.width_ = winRect.width_ + WINDOW_FRAME_WIDTH + WINDOW_FRAME_WIDTH; + rect.height_ = winRect.height_ + WINDOW_TITLE_BAR_HEIGHT + WINDOW_FRAME_WIDTH; + return rect; +} + void WindowLayoutPolicy::UpdateLayoutRect(sptr& node) { auto type = node->GetWindowType(); @@ -167,6 +179,9 @@ void WindowLayoutPolicy::UpdateLayoutRect(sptr& node) if (!floatingWindow) { // fullscreen window winRect = limitRect; } else { // floating window + if (node->GetWindowProperty()->GetDecorEnable()) { // is decorable + winRect = ComputeDecoratedWindowRect(winRect); + } if (subWindow && parentLimit) { // subwidow and limited by parent limitRect = node->parent_->GetLayoutRect(); UpdateFloatingLayoutRect(limitRect, winRect); -- Gitee