mirror of
https://gitee.com/openharmony/window_window_manager
synced 2025-02-07 16:36:49 +00:00
!12372 Description:新增makemirrorforrecord
Merge pull request !12372 from zhangyao/112233
This commit is contained in:
commit
9ac7707c46
@ -128,6 +128,8 @@ public:
|
||||
virtual sptr<ScreenGroupInfo> GetScreenGroupInfoById(ScreenId screenId);
|
||||
virtual DMError GetAllScreenInfos(std::vector<sptr<ScreenInfo>>& screenInfos);
|
||||
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, ScreenId& screenGroupId);
|
||||
virtual DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId,
|
||||
ScreenId& screenGroupId);
|
||||
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, DMRect mainScreenRegion,
|
||||
ScreenId& screenGroupId);
|
||||
virtual DMError SetMultiScreenMode(ScreenId mainScreenId, ScreenId secondaryScreenId,
|
||||
|
@ -500,6 +500,14 @@ DMError ScreenManagerAdapter::MakeMirror(ScreenId mainScreenId, std::vector<Scre
|
||||
return displayManagerServiceProxy_->MakeMirror(mainScreenId, mirrorScreenId, screenGroupId);
|
||||
}
|
||||
|
||||
DMError ScreenManagerAdapter::MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId,
|
||||
ScreenId& screenGroupId)
|
||||
{
|
||||
INIT_PROXY_CHECK_RETURN(DMError::DM_ERROR_INIT_DMS_PROXY_LOCKED);
|
||||
|
||||
return displayManagerServiceProxy_->MakeMirrorForRecord(mainScreenId, mirrorScreenId, screenGroupId);
|
||||
}
|
||||
|
||||
DMError ScreenManagerAdapter::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId,
|
||||
DMRect mainScreenRegion, ScreenId& screenGroupId)
|
||||
{
|
||||
|
@ -500,6 +500,22 @@ DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> m
|
||||
return ret;
|
||||
}
|
||||
|
||||
DMError ScreenManager::MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId,
|
||||
ScreenId& screenGroupId)
|
||||
{
|
||||
WLOGFI("Make mirror for screen: %{public}" PRIu64"", mainScreenId);
|
||||
if (mirrorScreenId.size() > MAX_SCREEN_SIZE) {
|
||||
WLOGFW("Make Mirror failed. MirrorScreenId size bigger than %{public}u.", MAX_SCREEN_SIZE);
|
||||
return DMError::DM_ERROR_INVALID_PARAM;
|
||||
}
|
||||
DMError ret = SingletonContainer::Get<ScreenManagerAdapter>().MakeMirrorForRecord(mainScreenId, mirrorScreenId,
|
||||
screenGroupId);
|
||||
if (screenGroupId == SCREEN_ID_INVALID) {
|
||||
WLOGFE("create mirror failed");
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
DMError ScreenManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, DMRect mainScreenRegion,
|
||||
ScreenId& screenGroupId)
|
||||
{
|
||||
|
@ -142,6 +142,11 @@ public:
|
||||
virtual DMError GetAllScreenInfos(std::vector<sptr<ScreenInfo>>& screenInfos) = 0;
|
||||
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
|
||||
ScreenId& screenGroupId) = 0;
|
||||
virtual DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
|
||||
ScreenId& screenGroupId)
|
||||
{
|
||||
return DMError::DM_ERROR_DEVICE_NOT_SUPPORT;
|
||||
}
|
||||
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
|
||||
DMRect mainScreenRegion, ScreenId& screenGroupId)
|
||||
{
|
||||
|
@ -58,6 +58,7 @@ enum class DisplayManagerMessage : unsigned int {
|
||||
TRANS_ID_SET_SCREEN_PRIVACY_MASKIMAGE,
|
||||
TRANS_ID_SCREENGROUP_BASE = 1100,
|
||||
TRANS_ID_SCREEN_MAKE_MIRROR = TRANS_ID_SCREENGROUP_BASE,
|
||||
TRANS_ID_SCREEN_MAKE_MIRROR_FOR_RECORD,
|
||||
TRANS_ID_SCREEN_MAKE_MIRROR_WITH_REGION,
|
||||
TRANS_ID_MULTI_SCREEN_MODE_SWITCH,
|
||||
TRANS_ID_SET_MULTI_SCREEN_POSITION,
|
||||
|
@ -113,6 +113,17 @@ public:
|
||||
*/
|
||||
DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId, ScreenId& screenGroupId);
|
||||
|
||||
/**
|
||||
* @brief Make screens as mirror-screen
|
||||
*
|
||||
* @param mainScreenId Main screen id.
|
||||
* @param mirrorScreenId Mirror screen ids.
|
||||
* @param screenGroupId Screen group id.
|
||||
* @return DM_OK means make mirror success, others means make mirror failed.
|
||||
*/
|
||||
DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId,
|
||||
ScreenId& screenGroupId);
|
||||
|
||||
/**
|
||||
* @brief Make screen as mirror-screen for region of main screen.
|
||||
*
|
||||
|
@ -29,6 +29,7 @@ public:
|
||||
bool IsFakeDisplayExist();
|
||||
bool IsNeedSetSnapshotRect(DisplayId displayId);
|
||||
Drawing::Rect GetSnapshotRect(DisplayId displayId);
|
||||
DMRect GetRecordRect(DisplayId displayId);
|
||||
};
|
||||
}
|
||||
#endif // OHOS_ROSEN_WINDOW_SUPER_FOLD_POLICY_H
|
||||
#endif // OHOS_ROSEN_WINDOW_SUPER_FOLD_POLICY_H
|
||||
|
@ -114,6 +114,8 @@ public:
|
||||
DMError ResizeVirtualScreen(ScreenId screenId, uint32_t width, uint32_t height) override;
|
||||
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
|
||||
ScreenId& screenGroupId) override;
|
||||
virtual DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
|
||||
ScreenId& screenGroupId) override;
|
||||
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
|
||||
DMRect mainScreenRegion, ScreenId& screenGroupId) override;
|
||||
virtual DMError SetMultiScreenMode(ScreenId mainScreenId, ScreenId secondaryScreenId,
|
||||
|
@ -89,6 +89,8 @@ public:
|
||||
|
||||
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
|
||||
ScreenId& screenGroupId) override;
|
||||
virtual DMError MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
|
||||
ScreenId& screenGroupId) override;
|
||||
virtual DMError MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
|
||||
DMRect mainScreenRegion, ScreenId& screenGroupId) override;
|
||||
virtual DMError SetMultiScreenMode(ScreenId mainScreenId, ScreenId secondaryScreenId,
|
||||
|
@ -58,4 +58,32 @@ Drawing::Rect SuperFoldPolicy::GetSnapshotRect(DisplayId displayId)
|
||||
TLOGW(WmsLogTag::DMS, "%{public}s", oss.str().c_str());
|
||||
return snapshotRect;
|
||||
}
|
||||
} // namespace OHOS::Rosen
|
||||
|
||||
DMRect SuperFoldPolicy::GetRecordRect(DisplayId displayId)
|
||||
{
|
||||
auto defaultInfo = ScreenSessionManager::GetInstance().GetDisplayInfoById(DEFAULT_DISPLAY_ID);
|
||||
auto fakeInfo = ScreenSessionManager::GetInstance().GetDisplayInfoById(DISPLAY_ID_FAKE);
|
||||
DMRect recordRect = {0, 0, 0, 0};
|
||||
if (defaultInfo == nullptr) {
|
||||
return recordRect;
|
||||
}
|
||||
if (displayId == DISPLAY_ID_FAKE) {
|
||||
if (fakeInfo != nullptr) {
|
||||
recordRect = {0, defaultInfo->GetHeight(), defaultInfo->GetWidth(),
|
||||
fakeInfo->GetHeight()};
|
||||
}
|
||||
} else {
|
||||
recordRect = {0, 0, defaultInfo->GetWidth(), defaultInfo->GetHeight()};
|
||||
}
|
||||
std::ostringstream oss;
|
||||
oss << "snapshot displayId: " << static_cast<uint32_t>(displayId)
|
||||
<< " left: 0"
|
||||
<< " top:" << recordRect.posY_
|
||||
<< " right:" << recordRect.width_
|
||||
<< " bottom:" << recordRect.height_;
|
||||
|
||||
TLOGW(WmsLogTag::DMS, "%{public}s", oss.str().c_str());
|
||||
return recordRect;
|
||||
}
|
||||
|
||||
} // namespace OHOS::Rosen
|
||||
|
@ -3937,6 +3937,27 @@ DMError ScreenSessionManager::MakeMirror(ScreenId mainScreenId, std::vector<Scre
|
||||
return DoMakeMirror(mainScreenId, mirrorScreenIds, DMRect::NONE(), screenGroupId);
|
||||
}
|
||||
|
||||
DMError ScreenSessionManager::MakeMirrorForRecord(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
|
||||
ScreenId& screenGroupId)
|
||||
{
|
||||
TLOGW(WmsLogTag::DMS, "start");
|
||||
ScreenId realScreenId = mainScreenId;
|
||||
if (FoldScreenStateInternel::IsSuperFoldDisplayDevice() && mainScreenId == DISPLAY_ID_FAKE) {
|
||||
if (!SuperFoldPolicy::GetInstance().IsFakeDisplayExist()) {
|
||||
TLOGE(WmsLogTag::DMS, "fake display is not exist!");
|
||||
return DMError::DM_ERROR_INVALID_PARAM;
|
||||
}
|
||||
realScreenId = 0;
|
||||
}
|
||||
if (FoldScreenStateInternel::IsSuperFoldDisplayDevice() &&
|
||||
SuperFoldPolicy::GetInstance().IsNeedSetSnapshotRect(mainScreenId)) {
|
||||
DMRect mainScreenRect = SuperFoldPolicy::GetInstance().GetRecordRect(mainScreenId);
|
||||
return DoMakeMirror(realScreenId, mirrorScreenIds, mainScreenRect, screenGroupId);
|
||||
}
|
||||
return DoMakeMirror(mainScreenId, mirrorScreenIds, DMRect::NONE(), screenGroupId);
|
||||
}
|
||||
|
||||
|
||||
DMError ScreenSessionManager::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
|
||||
DMRect mainScreenRegion, ScreenId& screenGroupId)
|
||||
{
|
||||
|
@ -1335,6 +1335,39 @@ DMError ScreenSessionManagerProxy::MakeMirror(ScreenId mainScreenId,
|
||||
return ret;
|
||||
}
|
||||
|
||||
DMError ScreenSessionManagerProxy::MakeMirrorForRecord(ScreenId mainScreenId,
|
||||
std::vector<ScreenId> mirrorScreenIds, ScreenId& screenGroupId)
|
||||
{
|
||||
WLOGFW("SCB: ScreenSessionManagerProxy::MakeMirror: ENTER");
|
||||
sptr<IRemoteObject> remote = Remote();
|
||||
if (remote == nullptr) {
|
||||
WLOGFW("SCB: ScreenSessionManagerProxy::MakeMirror: create mirror fail: remote is null");
|
||||
return DMError::DM_ERROR_NULLPTR;
|
||||
}
|
||||
|
||||
MessageParcel data;
|
||||
MessageParcel reply;
|
||||
MessageOption option;
|
||||
if (!data.WriteInterfaceToken(GetDescriptor())) {
|
||||
WLOGFE("SCB: ScreenSessionManagerProxy::MakeMirror: create mirror fail: WriteInterfaceToken failed");
|
||||
return DMError::DM_ERROR_WRITE_INTERFACE_TOKEN_FAILED;
|
||||
}
|
||||
bool res = data.WriteUint64(static_cast<uint64_t>(mainScreenId)) &&
|
||||
data.WriteUInt64Vector(mirrorScreenIds);
|
||||
if (!res) {
|
||||
WLOGFE("SCB: ScreenSessionManagerProxy::MakeMirror: create mirror fail: data write failed");
|
||||
return DMError::DM_ERROR_IPC_FAILED;
|
||||
}
|
||||
if (remote->SendRequest(static_cast<uint32_t>(DisplayManagerMessage::TRANS_ID_SCREEN_MAKE_MIRROR_FOR_RECORD),
|
||||
data, reply, option) != ERR_NONE) {
|
||||
WLOGFW("SCB: ScreenSessionManagerProxy::MakeMirror: create mirror fail: SendRequest failed");
|
||||
return DMError::DM_ERROR_IPC_FAILED;
|
||||
}
|
||||
DMError ret = static_cast<DMError>(reply.ReadInt32());
|
||||
screenGroupId = static_cast<ScreenId>(reply.ReadUint64());
|
||||
return ret;
|
||||
}
|
||||
|
||||
DMError ScreenSessionManagerProxy::MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenIds,
|
||||
DMRect mainScreenRegion, ScreenId& screenGroupId)
|
||||
{
|
||||
|
@ -287,6 +287,19 @@ int32_t ScreenSessionManagerStub::OnRemoteRequest(uint32_t code, MessageParcel&
|
||||
static_cast<void>(reply.WriteUint64(static_cast<uint64_t>(screenGroupId)));
|
||||
break;
|
||||
}
|
||||
case DisplayManagerMessage::TRANS_ID_SCREEN_MAKE_MIRROR_FOR_RECORD: {
|
||||
ScreenId mainScreenId = static_cast<ScreenId>(data.ReadUint64());
|
||||
std::vector<ScreenId> mirrorScreenId;
|
||||
if (!data.ReadUInt64Vector(&mirrorScreenId)) {
|
||||
WLOGE("fail to receive mirror screen in stub. screen:%{public}" PRIu64"", mainScreenId);
|
||||
break;
|
||||
}
|
||||
ScreenId screenGroupId = INVALID_SCREEN_ID;
|
||||
DMError ret = MakeMirrorForRecord(mainScreenId, mirrorScreenId, screenGroupId);
|
||||
static_cast<void>(reply.WriteInt32(static_cast<int32_t>(ret)));
|
||||
static_cast<void>(reply.WriteUint64(static_cast<uint64_t>(screenGroupId)));
|
||||
break;
|
||||
}
|
||||
case DisplayManagerMessage::TRANS_ID_SCREEN_MAKE_MIRROR_WITH_REGION: {
|
||||
ScreenId mainScreenId = static_cast<ScreenId>(data.ReadUint64());
|
||||
std::vector<ScreenId> mirrorScreenId;
|
||||
|
Loading…
x
Reference in New Issue
Block a user