diff --git a/services/screenservice/sourceservice/dscreenmgr/include/screen_manager_adapter.h b/services/screenservice/sourceservice/dscreenmgr/include/screen_manager_adapter.h index 836c4edd53597f36a0adbacfbe8b337649da82cf..da25606f864bcb7604e40a64f492301f2cb55b07 100644 --- a/services/screenservice/sourceservice/dscreenmgr/include/screen_manager_adapter.h +++ b/services/screenservice/sourceservice/dscreenmgr/include/screen_manager_adapter.h @@ -16,6 +16,7 @@ #ifndef OHOS_SCREEN_MGR_ADAPTER_H #define OHOS_SCREEN_MGR_ADAPTER_H +#include #include #include "single_instance.h" @@ -44,6 +45,7 @@ private: ~ScreenMgrAdapter(); bool listenerRegistered = false; + std::map screenIdMap_; }; } // namespace DistributedHardware } // namespace OHOS diff --git a/services/screenservice/sourceservice/dscreenmgr/src/screen_manager_adapter.cpp b/services/screenservice/sourceservice/dscreenmgr/src/screen_manager_adapter.cpp index 4f0850bfb97257fef19a0b4a726e083042500a05..6e6cb06ac7c186e4bfe37212f318581b1fece187 100644 --- a/services/screenservice/sourceservice/dscreenmgr/src/screen_manager_adapter.cpp +++ b/services/screenservice/sourceservice/dscreenmgr/src/screen_manager_adapter.cpp @@ -30,6 +30,7 @@ namespace DistributedHardware { IMPLEMENT_SINGLE_INSTANCE(ScreenMgrAdapter); ScreenMgrAdapter::~ScreenMgrAdapter() { + screenIdMap_.clear(); DHLOGI("~ScreenMgrAdapter"); } @@ -39,6 +40,17 @@ uint64_t ScreenMgrAdapter::CreateVirtualScreen(const std::string &devId, const s DHLOGI("CreateVirtualScreen, width: %u, height: %u", videoParam->GetScreenWidth(), videoParam->GetScreenHeight()); std::string screenName = DSCREEN_PREFIX + SEPERATOR + devId + SEPERATOR + dhId; + auto iter = screenIdMap_.find(screenName); + if (iter != screenIdMap_.end()) { + DHLOGI("remove an exist virtual screen."); + Rosen::DMError err = Rosen::ScreenManager::GetInstance().DestroyVirtualScreen(iter->second); + if (err != Rosen::DMError::DM_OK) { + DHLOGE("remove virtual screen failed, screenId:%ulld", iter->second); + return SCREEN_ID_INVALID; + } + screenIdMap_.erase(screenName); + } + Rosen::VirtualScreenOption option = { screenName, videoParam->GetScreenWidth(), @@ -50,6 +62,7 @@ uint64_t ScreenMgrAdapter::CreateVirtualScreen(const std::string &devId, const s }; uint64_t screenId = Rosen::ScreenManager::GetInstance().CreateVirtualScreen(option); + screenIdMap_.emplace(screenName, screenId); return screenId; }