From 440f084fcaa6dd22218ac038f553bdcc9dbeeddf Mon Sep 17 00:00:00 2001 From: lu Date: Sat, 19 Feb 2022 17:20:36 +0800 Subject: [PATCH] update the size of the Display after rotate screen Signed-off-by: lu Change-Id: I918630d93678f4cdce904461e4a0f0efc846b2fd --- dm/include/display_manager_adapter.h | 2 ++ dm/src/display.cpp | 22 ++++++++++++++++ dm/src/display_manager_adapter.cpp | 32 ++++++++++++++++++++++++ dm/src/screen.cpp | 32 ++++++++++++++++++++++++ dmserver/include/abstract_display.h | 1 + dmserver/src/abstract_display.cpp | 5 ++++ dmserver/src/display_manager_service.cpp | 1 + 7 files changed, 95 insertions(+) diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index bc1e6377db..aa129871b2 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -67,6 +67,8 @@ public: virtual void NotifyDisplayEvent(DisplayEvent event); virtual DMError MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId); virtual void Clear(); + virtual DisplayInfo GetDisplayInfo(DisplayId displayId); + virtual sptr GetScreenInfo(ScreenId screenId); virtual sptr GetScreenById(ScreenId screenId); virtual sptr GetScreenGroupById(ScreenId screenId); virtual std::vector> GetAllScreens(); diff --git a/dm/src/display.cpp b/dm/src/display.cpp index 503d1d4171..faa6ebf744 100644 --- a/dm/src/display.cpp +++ b/dm/src/display.cpp @@ -15,19 +15,32 @@ #include "display.h" #include "display_info.h" +#include "display_manager_adapter.h" namespace OHOS::Rosen { class Display::Impl : public RefBase { friend class Display; private: + void UpdateDisplay(DisplayInfo& info); + std::string name_; DisplayId id_ { DISPLAY_ID_INVALD }; int32_t width_ { 0 }; int32_t height_ { 0 }; uint32_t freshRate_ { 0 }; ScreenId screenId_ {SCREEN_ID_INVALID}; + Rotation rotation_ { Rotation::ROTATION_0 }; }; +void Display::Impl::UpdateDisplay(DisplayInfo& info) +{ + width_ = info.width_; + height_ = info.height_; + freshRate_ = info.freshRate_; + screenId_ = info.screenId_; + rotation_ = info.rotation_; +} + Display::Display(const std::string& name, DisplayInfo* info) : pImpl_(new Impl()) { @@ -37,6 +50,7 @@ Display::Display(const std::string& name, DisplayInfo* info) pImpl_->height_ = info->height_; pImpl_->freshRate_ = info->freshRate_; pImpl_->screenId_ = info->screenId_; + pImpl_->rotation_ = info->rotation_; } DisplayId Display::GetId() const @@ -46,21 +60,29 @@ DisplayId Display::GetId() const int32_t Display::GetWidth() const { + DisplayInfo info = SingletonContainer::Get().GetDisplayInfo(pImpl_->id_); + pImpl_->UpdateDisplay(info); return pImpl_->width_; } int32_t Display::GetHeight() const { + DisplayInfo info = SingletonContainer::Get().GetDisplayInfo(pImpl_->id_); + pImpl_->UpdateDisplay(info); return pImpl_->height_; } uint32_t Display::GetFreshRate() const { + DisplayInfo info = SingletonContainer::Get().GetDisplayInfo(pImpl_->id_); + pImpl_->UpdateDisplay(info); return pImpl_->freshRate_; } ScreenId Display::GetScreenId() const { + DisplayInfo info = SingletonContainer::Get().GetDisplayInfo(pImpl_->id_); + pImpl_->UpdateDisplay(info); return pImpl_->screenId_; } diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index 9e2151b24f..80ad19ba5e 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -378,6 +378,38 @@ DMError DisplayManagerAdapter::MakeMirror(ScreenId mainScreenId, std::vectorMakeMirror(mainScreenId, mirrorScreenId); } +sptr DisplayManagerAdapter::GetScreenInfo(ScreenId screenId) +{ + if (screenId == SCREEN_ID_INVALID) { + WLOGFE("screen id is invalid"); + return nullptr; + } + std::lock_guard lock(mutex_); + if (!InitDMSProxyLocked()) { + WLOGFE("InitDMSProxyLocked failed!"); + return nullptr; + } + sptr screenInfo = displayManagerServiceProxy_->GetScreenInfoById(screenId); + if (screenInfo == nullptr) { + WLOGFE("screenInfo is null"); + } + return screenInfo; +} + +DisplayInfo DisplayManagerAdapter::GetDisplayInfo(DisplayId displayId) +{ + if (displayId == DISPLAY_ID_INVALD) { + WLOGFE("screen id is invalid"); + return DisplayInfo(); + } + std::lock_guard lock(mutex_); + if (!InitDMSProxyLocked()) { + WLOGFE("InitDMSProxyLocked failed!"); + return DisplayInfo(); + } + return displayManagerServiceProxy_->GetDisplayInfoById(displayId); +} + sptr DisplayManagerAdapter::GetScreenById(ScreenId screenId) { std::lock_guard lock(mutex_); diff --git a/dm/src/screen.cpp b/dm/src/screen.cpp index 61875599b5..d4a227b3df 100644 --- a/dm/src/screen.cpp +++ b/dm/src/screen.cpp @@ -29,6 +29,7 @@ friend class Screen; public: Impl() = default; ~Impl() = default; + void UpdateScreen(sptr info); ScreenId id_ { SCREEN_ID_INVALID }; uint32_t virtualWidth_ { 0 }; @@ -41,6 +42,22 @@ public: Rotation rotation_ { Rotation::ROTATION_0 }; }; +void Screen::Impl::UpdateScreen(sptr info) +{ + if (info == nullptr) { + WLOGFE("info is nullptr."); + return; + } + virtualWidth_ = info->virtualWidth_; + virtualHeight_ = info->virtualHeight_; + virtualPixelRatio_ = info->virtualPixelRatio_; + parent_ = info->parent_; + canHasChild_ = info->canHasChild_; + modeId_ = info->modeId_; + modes_ = info->modes_; + rotation_ = info->rotation_; +} + Screen::Screen(const ScreenInfo* info) : pImpl_(new Impl()) { @@ -56,6 +73,7 @@ Screen::Screen(const ScreenInfo* info) pImpl_->canHasChild_ = info->canHasChild_; pImpl_->modeId_ = info->modeId_; pImpl_->modes_ = info->modes_; + pImpl_->rotation_ = info->rotation_; } Screen::~Screen() @@ -64,6 +82,8 @@ Screen::~Screen() bool Screen::IsGroup() const { + sptr info = SingletonContainer::Get().GetScreenInfo(pImpl_->id_); + pImpl_->UpdateScreen(info); return pImpl_->canHasChild_; } @@ -74,6 +94,8 @@ ScreenId Screen::GetId() const uint32_t Screen::GetWidth() const { + sptr info = SingletonContainer::Get().GetScreenInfo(pImpl_->id_); + pImpl_->UpdateScreen(info); auto modeId = pImpl_->modeId_; auto modes = pImpl_->modes_; if (modeId < 0 || modeId >= modes.size()) { @@ -84,6 +106,8 @@ uint32_t Screen::GetWidth() const uint32_t Screen::GetHeight() const { + sptr info = SingletonContainer::Get().GetScreenInfo(pImpl_->id_); + pImpl_->UpdateScreen(info); auto modeId = pImpl_->modeId_; auto modes = pImpl_->modes_; if (modeId < 0 || modeId >= modes.size()) { @@ -94,21 +118,29 @@ uint32_t Screen::GetHeight() const uint32_t Screen::GetVirtualWidth() const { + sptr info = SingletonContainer::Get().GetScreenInfo(pImpl_->id_); + pImpl_->UpdateScreen(info); return pImpl_->virtualWidth_; } uint32_t Screen::GetVirtualHeight() const { + sptr info = SingletonContainer::Get().GetScreenInfo(pImpl_->id_); + pImpl_->UpdateScreen(info); return pImpl_->virtualHeight_; } float Screen::GetVirtualPixelRatio() const { + sptr info = SingletonContainer::Get().GetScreenInfo(pImpl_->id_); + pImpl_->UpdateScreen(info); return pImpl_->virtualPixelRatio_; } Rotation Screen::GetRotation() { + sptr info = SingletonContainer::Get().GetScreenInfo(pImpl_->id_); + pImpl_->UpdateScreen(info); return pImpl_->rotation_; } diff --git a/dmserver/include/abstract_display.h b/dmserver/include/abstract_display.h index bfd4e03cfd..3b505006f3 100644 --- a/dmserver/include/abstract_display.h +++ b/dmserver/include/abstract_display.h @@ -51,6 +51,7 @@ public: void SetFreshRate(uint32_t freshRate); void SetVirtualPixelRatio(float virtualPixelRatio); bool RequestRotation(Rotation rotation); + Rotation GetRotation(); private: DisplayId id_ { DISPLAY_ID_INVALD }; diff --git a/dmserver/src/abstract_display.cpp b/dmserver/src/abstract_display.cpp index 7f8334a95f..e9ad85f94a 100644 --- a/dmserver/src/abstract_display.cpp +++ b/dmserver/src/abstract_display.cpp @@ -107,6 +107,11 @@ bool AbstractDisplay::RequestRotation(Rotation rotation) return true; } +Rotation AbstractDisplay::GetRotation() +{ + return rotation_; +} + bool AbstractDisplay::BindAbstractScreen(ScreenId dmsScreenId) { sptr screenController diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index 5bc967c94c..2847f89840 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -102,6 +102,7 @@ DisplayInfo DisplayManagerService::GetDisplayInfoById(DisplayId displayId) displayInfo.height_ = display->GetHeight(); displayInfo.freshRate_ = display->GetFreshRate(); displayInfo.screenId_ = display->GetAbstractScreenId(); + displayInfo.rotation_ = display->GetRotation(); return displayInfo; } -- Gitee