diff --git a/interfaces/innerkits/native_cpp/screen_source/BUILD.gn b/interfaces/innerkits/native_cpp/screen_source/BUILD.gn index 0b5ecb743ff8c3df5f65537ef6375822c9b4efdf..90fe89a4aeee18a19f7e524b7b2423b33f5142cf 100644 --- a/interfaces/innerkits/native_cpp/screen_source/BUILD.gn +++ b/interfaces/innerkits/native_cpp/screen_source/BUILD.gn @@ -52,9 +52,13 @@ ohos_shared_library("distributed_screen_source_sdk") { external_deps = [ "c_utils:utils", + "graphic_2d:libcomposer", + "graphic_2d:librender_service_client", + "graphic_2d:surface", "hitrace:hitrace_meter", "ipc:ipc_core", "samgr:samgr_proxy", + "window_manager:libdm", ] subsystem_name = "distributedhardware" diff --git a/interfaces/innerkits/native_cpp/screen_source/include/dscreen_source_handler.h b/interfaces/innerkits/native_cpp/screen_source/include/dscreen_source_handler.h index 6f13791a8b105a12878e593eb493f83d0e284547..3f8322d7a5514f7fcb6fc31a74a4eb04fe9b8e4c 100644 --- a/interfaces/innerkits/native_cpp/screen_source/include/dscreen_source_handler.h +++ b/interfaces/innerkits/native_cpp/screen_source/include/dscreen_source_handler.h @@ -52,7 +52,7 @@ private: DScreenSourceHandler(); ~DScreenSourceHandler() = default; - + void DeleteExistDScreens(); std::mutex proxyMutex_; std::condition_variable proxyConVar_; sptr dScreenSourceProxy_ = nullptr; diff --git a/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_handler.cpp b/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_handler.cpp index 4b14d84d1043141afb9f652d2831bd3268f3b9aa..0bc3a0ceaa87d182fd46196b0c216bcbeaea2337 100644 --- a/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_handler.cpp +++ b/interfaces/innerkits/native_cpp/screen_source/src/dscreen_source_handler.cpp @@ -34,6 +34,7 @@ #include "dscreen_log.h" #include "dscreen_source_load_callback.h" #include "dscreen_util.h" +#include "screen_manager.h" namespace OHOS { namespace DistributedHardware { @@ -137,9 +138,32 @@ int32_t DScreenSourceHandler::ReleaseSource() return ret; } +void DScreenSourceHandler::DeleteExistDScreens() +{ + std::vector> screens; + Rosen::ScreenManager::GetInstance().GetAllScreens(screens); + DHLOGI("screens size is: %" PRId32, screens.size()); + for (const auto &screen : screens) { + if (screen == nullptr) { + DHLOGE("screen is nullptr."); + continue; + } + std::string screenName = screen->GetName(); + DHLOGI("DeleteExistDScreens, screenName:%s", screenName.c_str()); + if (screenName.find(DSCREEN_PREFIX) != std::string::npos) { + DHLOGI("DestroyVirtualScreen"); + Rosen::DMError err = Rosen::ScreenManager::GetInstance().DestroyVirtualScreen(screen->GetId()); + if (err != Rosen::DMError::DM_OK) { + DHLOGE("remove virtual screen failed, screenId:%" PRIu64, screen->GetId()); + } + } + } +} + int32_t DScreenSourceHandler::RegisterDistributedHardware(const std::string &devId, const std::string &dhId, const EnableParam ¶m, std::shared_ptr callback) { + DeleteExistDScreens(); if (devId.empty() || dhId.empty()) { DHLOGE("device id or dh id empty."); return ERR_DH_SCREEN_STRING_PARAM_EMPTY; diff --git a/screenhandler/src/dscreen_handler.cpp b/screenhandler/src/dscreen_handler.cpp index d127e6f01238ebcc7009e6f9422e87f7d089d6cf..8a2b00a3c8b83157445f823f3609f5b10f3216f1 100644 --- a/screenhandler/src/dscreen_handler.cpp +++ b/screenhandler/src/dscreen_handler.cpp @@ -82,9 +82,11 @@ void ScreenListener::OnConnect(uint64_t screenId) DHLOGE("screen not found, screenId is: %" PRIu64, screenId); return; } - + if (!screen->IsReal()) { + DHLOGI("screen is not real"); + return; + } std::string dhId = DSCREEN_PREFIX + SEPERATOR + std::to_string(screenId); - uint32_t screenWidth = screen->GetWidth(); screenWidth = ByteCalculate(screenWidth); DHLOGI("screenWidth is : %" PRIu32, screenWidth); @@ -138,7 +140,10 @@ std::vector DScreenHandler::Query() if (screen->GetWidth() <= 0) { continue; } - std::string dhId = SCREEN_PREFIX + SEPERATOR + std::to_string(screen->GetId()); + if (!screen->IsReal()) { + continue; + } + std::string dhId = DSCREEN_PREFIX + SEPERATOR + std::to_string(screen->GetId()); uint32_t screenWidth = screen->GetWidth(); if (screenListener_ == nullptr) { screenListener_ = new (std::nothrow) ScreenListener();