diff --git a/dmserver/src/abstract_screen_controller.cpp b/dmserver/src/abstract_screen_controller.cpp index d3cba00d483e95e66a774ae438264f08f2e527a3..0dfe11f8a0ecde6d5739a628a2fd13b543d2acfb 100644 --- a/dmserver/src/abstract_screen_controller.cpp +++ b/dmserver/src/abstract_screen_controller.cpp @@ -681,6 +681,10 @@ DMError AbstractScreenController::DestroyVirtualScreen(ScreenId screenId) ScreenId rsScreenId = SCREEN_ID_INVALID; screenIdManager_.ConvertToRsScreenId(screenId, rsScreenId); + if (rsScreenId == defaultRsScreenId_) { + TLOGI(WmsLogTag::DMS, "Not destroy default virtual screen"); + return DMError::DM_ERROR_INVALID_PARAM; + } sptr displayManagerAgent = nullptr; bool agentFound = false; for (auto &agentIter : screenAgentMap_) { @@ -1555,6 +1559,22 @@ bool AbstractScreenController::SetVirtualScreenAsDefault(ScreenId screenId) return false; } defaultRsScreenId_ = rsScreenId; + // Erase default virtual screen in screenAgentMap_ + { + std::lock_guard lock(mutex_); + for (auto it = screenAgentMap_.begin(); it != screenAgentMap_.end(); it++) { + auto& screenIds = it->second; + auto iter = std::find(screenIds.begin(), screenIds.end(), screenId); + if (iter == screenIds.end()) { + continue; + } + screenIds.erase(iter); + if (screenIds.empty()) { + screenAgentMap_.erase(it); + } + break; + } + } abstractScreenCallback_->onConnect_(absScreen); return true; }