From e0bcd0ebe24543d03b48751aeba14b88a6dcdb80 Mon Sep 17 00:00:00 2001 From: Klaus_q Date: Tue, 22 Feb 2022 11:00:49 +0800 Subject: [PATCH 1/2] fix window snapshot nullptr bug Signed-off-by: Klaus_q Change-Id: I01d62fdb363941be9c375d8ad6be273c6a9516bc --- wmserver/include/window_snapshot/snapshot_controller.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wmserver/include/window_snapshot/snapshot_controller.h b/wmserver/include/window_snapshot/snapshot_controller.h index 2f5ce9ad..7fc60fd3 100644 --- a/wmserver/include/window_snapshot/snapshot_controller.h +++ b/wmserver/include/window_snapshot/snapshot_controller.h @@ -46,8 +46,8 @@ private: void OnSurfaceCapture(std::shared_ptr pixelmap) override { if (flag_ == false) { - flag_ = true; pixelMap_ = pixelmap; + flag_ = true; } } bool IsPixelMapOk() From 370a87914650af25ff200444c3caf5e417b0a09d Mon Sep 17 00:00:00 2001 From: Klaus_q Date: Mon, 21 Feb 2022 20:49:42 +0800 Subject: [PATCH 2/2] fix DMS inner temp code Signed-off-by: Klaus_q Change-Id: Ida8b9d4a28dd8748a492b5ca68decab77ed41c87 --- dm/include/display_manager_adapter.h | 1 + dm/src/display_manager.cpp | 5 +---- dm/src/display_manager_adapter.cpp | 9 +++++++++ dmserver/include/abstract_display_controller.h | 1 + dmserver/include/abstract_screen_controller.h | 2 ++ dmserver/include/display_manager_interface.h | 2 ++ dmserver/include/display_manager_proxy.h | 1 + dmserver/include/display_manager_service.h | 2 ++ dmserver/src/abstract_display_controller.cpp | 10 ++++++++++ dmserver/src/abstract_screen_controller.cpp | 7 +++++++ dmserver/src/display_manager_proxy.cpp | 18 ++++++++++++++++++ dmserver/src/display_manager_service.cpp | 16 +++++++++++++--- dmserver/src/display_manager_service_inner.cpp | 13 +++++++------ dmserver/src/display_manager_stub.cpp | 5 +++++ 14 files changed, 79 insertions(+), 13 deletions(-) diff --git a/dm/include/display_manager_adapter.h b/dm/include/display_manager_adapter.h index 199979fc..1ebe3023 100644 --- a/dm/include/display_manager_adapter.h +++ b/dm/include/display_manager_adapter.h @@ -56,6 +56,7 @@ WM_DECLARE_SINGLE_INSTANCE(DisplayManagerAdapter); public: virtual DisplayId GetDefaultDisplayId(); virtual sptr GetDisplayInfoByScreenId(ScreenId screenId); + virtual std::vector GetAllDisplayIds(); virtual std::shared_ptr GetDisplaySnapshot(DisplayId displayId); virtual bool WakeUpBegin(PowerStateChangeReason reason); virtual bool WakeUpEnd(); diff --git a/dm/src/display_manager.cpp b/dm/src/display_manager.cpp index 38e028f6..c6a84bdb 100644 --- a/dm/src/display_manager.cpp +++ b/dm/src/display_manager.cpp @@ -315,10 +315,7 @@ sptr DisplayManager::GetDefaultDisplay() std::vector DisplayManager::GetAllDisplayIds() { - std::vector res; - res.push_back(GetDefaultDisplayId()); - // 获取所有displayIds - return res; + return SingletonContainer::Get().GetAllDisplayIds(); } std::vector> DisplayManager::GetAllDisplays() diff --git a/dm/src/display_manager_adapter.cpp b/dm/src/display_manager_adapter.cpp index f1bf5efd..dd61c31e 100644 --- a/dm/src/display_manager_adapter.cpp +++ b/dm/src/display_manager_adapter.cpp @@ -326,6 +326,15 @@ sptr ScreenManagerAdapter::GetScreenInfo(ScreenId screenId) return screenInfo; } +std::vector DisplayManagerAdapter::GetAllDisplayIds() +{ + if (!InitDMSProxy()) { + WLOGFE("InitDMSProxyLocked failed!"); + return {}; + } + return displayManagerServiceProxy_->GetAllDisplayIds(); +} + sptr DisplayManagerAdapter::GetDisplayInfo(DisplayId displayId) { if (displayId == DISPLAY_ID_INVALD) { diff --git a/dmserver/include/abstract_display_controller.h b/dmserver/include/abstract_display_controller.h index 7c311ea7..eb2fc366 100644 --- a/dmserver/include/abstract_display_controller.h +++ b/dmserver/include/abstract_display_controller.h @@ -41,6 +41,7 @@ public: std::shared_ptr GetScreenSnapshot(DisplayId displayId); sptr GetAbstractDisplay(DisplayId displayId) const; sptr GetAbstractDisplayByScreen(ScreenId screenId) const; + std::vector GetAllDisplayIds() const; void AddDisplayForExpandScreen(sptr absScreen); private: diff --git a/dmserver/include/abstract_screen_controller.h b/dmserver/include/abstract_screen_controller.h index 4de2b39f..c58eaabc 100644 --- a/dmserver/include/abstract_screen_controller.h +++ b/dmserver/include/abstract_screen_controller.h @@ -49,6 +49,7 @@ public: std::vector GetAllExpandOrMirrorScreenIds(std::vector) const; sptr GetAbstractScreenGroup(ScreenId dmsScreenId); ScreenId GetDefaultAbstractScreenId(); + ScreenId GetDefaultScreenId() const; // save default screenID got by GetDefaultAbstractScreenId as cache ScreenId ConvertToRsScreenId(ScreenId dmsScreenId); ScreenId ConvertToDmsScreenId(ScreenId rsScreenId); void RegisterAbstractScreenCallback(sptr cb); @@ -95,6 +96,7 @@ private: std::map> dmsScreenMap_; std::map> dmsScreenGroupMap_; sptr abstractScreenCallback_; + ScreenId defaultScreenId = INVALID_SCREEN_ID; }; } // namespace OHOS::Rosen #endif // FOUNDATION_DMSERVER_ABSTRACT_SCREEN_CONTROLLER_H \ No newline at end of file diff --git a/dmserver/include/display_manager_interface.h b/dmserver/include/display_manager_interface.h index 56896b10..9812be7f 100644 --- a/dmserver/include/display_manager_interface.h +++ b/dmserver/include/display_manager_interface.h @@ -46,6 +46,7 @@ public: TRANS_ID_SET_SCREEN_POWER_FOR_ALL, TRANS_ID_SET_DISPLAY_STATE, TRANS_ID_GET_DISPLAY_STATE, + TRANS_ID_GET_ALL_DISPLAYIDS, TRANS_ID_NOTIFY_DISPLAY_EVENT, TRANS_ID_SCREEN_BASE = 1000, TRANS_ID_CREATE_VIRTUAL_SCREEN = TRANS_ID_SCREEN_BASE, @@ -97,6 +98,7 @@ public: virtual bool SetScreenPowerForAll(DisplayPowerState state, PowerStateChangeReason reason) = 0; virtual bool SetDisplayState(DisplayState state) = 0; virtual DisplayState GetDisplayState(DisplayId displayId) = 0; + virtual std::vector GetAllDisplayIds() = 0; virtual void NotifyDisplayEvent(DisplayEvent event) = 0; virtual sptr GetScreenInfoById(ScreenId screenId) = 0; virtual sptr GetScreenGroupInfoById(ScreenId screenId) = 0; diff --git a/dmserver/include/display_manager_proxy.h b/dmserver/include/display_manager_proxy.h index 8fc3f3fa..aceded36 100644 --- a/dmserver/include/display_manager_proxy.h +++ b/dmserver/include/display_manager_proxy.h @@ -59,6 +59,7 @@ public: bool SuspendEnd() override; bool SetScreenPowerForAll(DisplayPowerState state, PowerStateChangeReason reason) override; bool SetDisplayState(DisplayState state) override; + std::vector GetAllDisplayIds() override; DisplayState GetDisplayState(DisplayId displayId) override; void NotifyDisplayEvent(DisplayEvent event) override; ScreenId MakeMirror(ScreenId mainScreenId, std::vector mirrorScreenId) override; diff --git a/dmserver/include/display_manager_service.h b/dmserver/include/display_manager_service.h index 2a04939e..0b5af535 100644 --- a/dmserver/include/display_manager_service.h +++ b/dmserver/include/display_manager_service.h @@ -89,6 +89,8 @@ public: sptr GetScreenInfoById(ScreenId screenId) override; sptr GetScreenGroupInfoById(ScreenId screenId) override; std::vector> GetAllScreenInfos() override; + + std::vector GetAllDisplayIds() override; bool SetScreenActiveMode(ScreenId screenId, uint32_t modeId) override; private: diff --git a/dmserver/src/abstract_display_controller.cpp b/dmserver/src/abstract_display_controller.cpp index 27d8178f..99861609 100644 --- a/dmserver/src/abstract_display_controller.cpp +++ b/dmserver/src/abstract_display_controller.cpp @@ -99,6 +99,16 @@ sptr AbstractDisplayController::GetAbstractDisplayByScreen(Scre return nullptr; } +std::vector AbstractDisplayController::GetAllDisplayIds() const +{ + std::lock_guard lock(mutex_); + std::vector res; + for (auto iter = abstractDisplayMap_.begin(); iter != abstractDisplayMap_.end(); ++iter) { + res.push_back(iter->first); + } + return res; +} + std::shared_ptr AbstractDisplayController::GetScreenSnapshot(DisplayId displayId) { sptr abstractDisplay = GetAbstractDisplay(displayId); diff --git a/dmserver/src/abstract_screen_controller.cpp b/dmserver/src/abstract_screen_controller.cpp index 0c611ef3..b25e3fb7 100644 --- a/dmserver/src/abstract_screen_controller.cpp +++ b/dmserver/src/abstract_screen_controller.cpp @@ -159,6 +159,7 @@ ScreenId AbstractScreenController::GetDefaultAbstractScreenId() auto iter = rs2DmsScreenIdMap_.find(rsDefaultId); if (iter != rs2DmsScreenIdMap_.end()) { WLOGI("GetDefaultAbstractScreenId, screen:%{public}" PRIu64"", iter->second); + defaultScreenId = iter->second; return iter->second; } WLOGFI("GetDefaultAbstractScreenId, default screen is null, try to get."); @@ -172,9 +173,15 @@ ScreenId AbstractScreenController::GetDefaultAbstractScreenId() dms2RsScreenIdMap_.insert(std::make_pair(dmsScreenId, rsDefaultId)); dmsScreenMap_.insert(std::make_pair(dmsScreenId, absScreen)); dmsScreenCount_++; + defaultScreenId = dmsScreenId; return dmsScreenId; } +ScreenId AbstractScreenController::GetDefaultScreenId() const +{ + return defaultScreenId; +} + ScreenId AbstractScreenController::ConvertToRsScreenId(ScreenId dmsScreenId) { std::lock_guard lock(mutex_); diff --git a/dmserver/src/display_manager_proxy.cpp b/dmserver/src/display_manager_proxy.cpp index 0e11ebdf..4a3cf0e3 100644 --- a/dmserver/src/display_manager_proxy.cpp +++ b/dmserver/src/display_manager_proxy.cpp @@ -638,6 +638,24 @@ DisplayState DisplayManagerProxy::GetDisplayState(DisplayId displayId) return static_cast(reply.ReadUint32()); } +std::vector DisplayManagerProxy::GetAllDisplayIds() +{ + std::vector allDisplayIds; + MessageParcel data; + MessageParcel reply; + MessageOption option; + if (!data.WriteInterfaceToken(GetDescriptor())) { + WLOGFE("WriteInterfaceToken failed"); + return allDisplayIds; + } + if (Remote()->SendRequest(TRANS_ID_GET_ALL_DISPLAYIDS, data, reply, option) != ERR_NONE) { + WLOGFW("SendRequest failed"); + return allDisplayIds; + } + reply.ReadUInt64Vector(&allDisplayIds); + return allDisplayIds; +} + void DisplayManagerProxy::NotifyDisplayEvent(DisplayEvent event) { MessageParcel data; diff --git a/dmserver/src/display_manager_service.cpp b/dmserver/src/display_manager_service.cpp index 06dd227c..7d8fbe69 100644 --- a/dmserver/src/display_manager_service.cpp +++ b/dmserver/src/display_manager_service.cpp @@ -85,9 +85,14 @@ ScreenId DisplayManagerService::GetScreenIdFromDisplayId(DisplayId displayId) DisplayId DisplayManagerService::GetDefaultDisplayId() { - ScreenId screenId = abstractDisplayController_->GetDefaultScreenId(); - WLOGFI("GetDefaultDisplayId %{public}" PRIu64"", screenId); - return GetDisplayIdFromScreenId(screenId); + ScreenId dmsScreenId = abstractScreenController_->GetDefaultScreenId(); + WLOGFI("GetDefaultDisplayId %{public}" PRIu64"", dmsScreenId); + sptr display = GetDisplayByScreen(dmsScreenId); + if (display == nullptr) { + WLOGFE("fail to get displayInfo by id: invalid display"); + return DISPLAY_ID_INVALD; + } + return display->GetId(); } sptr DisplayManagerService::GetDisplayInfoById(DisplayId displayId) @@ -458,6 +463,11 @@ sptr DisplayManagerService::GetScreenGroupInfoById(ScreenId scr return screenGroup->ConvertToScreenGroupInfo(); } +std::vector DisplayManagerService::GetAllDisplayIds() +{ + return abstractDisplayController_->GetAllDisplayIds(); +} + std::vector> DisplayManagerService::GetAllScreenInfos() { std::vector screenIds = abstractScreenController_->GetAllScreenIds(); diff --git a/dmserver/src/display_manager_service_inner.cpp b/dmserver/src/display_manager_service_inner.cpp index 8c84b84a..0c97b615 100644 --- a/dmserver/src/display_manager_service_inner.cpp +++ b/dmserver/src/display_manager_service_inner.cpp @@ -41,23 +41,24 @@ const sptr DisplayManagerServiceInner::GetDisplayById(DisplayId { sptr display = DisplayManagerService::GetInstance().GetAbstractDisplay(displayId); if (display == nullptr) { - auto displayInfo = DisplayManagerService::GetInstance().GetDisplayInfoById(displayId); - display = new AbstractDisplay(displayInfo); - WLOGFE("GetDisplayById create new!\n"); + WLOGFE("GetDisplayById can not find corresponding display!\n"); } return display; } const sptr DisplayManagerServiceInner::GetDefaultDisplay() { + DisplayId defaultDisplayId = GetDefaultDisplayId(); + if (defaultDisplayId == DISPLAY_ID_INVALD) { + WLOGFE("Fail to get default displayId"); + return nullptr; + } return GetDisplayById(GetDefaultDisplayId()); } std::vector DisplayManagerServiceInner::GetAllDisplayIds() { - std::vector res; - res.push_back(GetDefaultDisplayId()); - return res; + return DisplayManagerService::GetInstance().GetAllDisplayIds(); } std::vector> DisplayManagerServiceInner::GetAllDisplays() diff --git a/dmserver/src/display_manager_stub.cpp b/dmserver/src/display_manager_stub.cpp index 9e90b2db..cb8f283f 100644 --- a/dmserver/src/display_manager_stub.cpp +++ b/dmserver/src/display_manager_stub.cpp @@ -194,6 +194,11 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data, } break; } + case TRANS_ID_GET_ALL_DISPLAYIDS: { + std::vector allDisplayIds = GetAllDisplayIds(); + reply.WriteUInt64Vector(allDisplayIds); + break; + } case TRANS_ID_SCREEN_MAKE_EXPAND: { std::vector screenId; if (!data.ReadUInt64Vector(&screenId)) {