mirror of
https://github.com/openharmony/windowmanager.git
synced 2026-07-19 17:08:11 -04:00
!358 fix window snapshot nullptr bug
Merge pull request !358 from Klaus_q/master_wq
This commit is contained in:
@@ -56,6 +56,7 @@ WM_DECLARE_SINGLE_INSTANCE(DisplayManagerAdapter);
|
||||
public:
|
||||
virtual DisplayId GetDefaultDisplayId();
|
||||
virtual sptr<DisplayInfo> GetDisplayInfoByScreenId(ScreenId screenId);
|
||||
virtual std::vector<DisplayId> GetAllDisplayIds();
|
||||
virtual std::shared_ptr<Media::PixelMap> GetDisplaySnapshot(DisplayId displayId);
|
||||
virtual bool WakeUpBegin(PowerStateChangeReason reason);
|
||||
virtual bool WakeUpEnd();
|
||||
|
||||
@@ -315,10 +315,7 @@ sptr<Display> DisplayManager::GetDefaultDisplay()
|
||||
|
||||
std::vector<DisplayId> DisplayManager::GetAllDisplayIds()
|
||||
{
|
||||
std::vector<DisplayId> res;
|
||||
res.push_back(GetDefaultDisplayId());
|
||||
// 获取所有displayIds
|
||||
return res;
|
||||
return SingletonContainer::Get<DisplayManagerAdapter>().GetAllDisplayIds();
|
||||
}
|
||||
|
||||
std::vector<const sptr<Display>> DisplayManager::GetAllDisplays()
|
||||
|
||||
@@ -326,6 +326,15 @@ sptr<ScreenInfo> ScreenManagerAdapter::GetScreenInfo(ScreenId screenId)
|
||||
return screenInfo;
|
||||
}
|
||||
|
||||
std::vector<DisplayId> DisplayManagerAdapter::GetAllDisplayIds()
|
||||
{
|
||||
if (!InitDMSProxy()) {
|
||||
WLOGFE("InitDMSProxyLocked failed!");
|
||||
return {};
|
||||
}
|
||||
return displayManagerServiceProxy_->GetAllDisplayIds();
|
||||
}
|
||||
|
||||
sptr<DisplayInfo> DisplayManagerAdapter::GetDisplayInfo(DisplayId displayId)
|
||||
{
|
||||
if (displayId == DISPLAY_ID_INVALD) {
|
||||
|
||||
@@ -41,6 +41,7 @@ public:
|
||||
std::shared_ptr<Media::PixelMap> GetScreenSnapshot(DisplayId displayId);
|
||||
sptr<AbstractDisplay> GetAbstractDisplay(DisplayId displayId) const;
|
||||
sptr<AbstractDisplay> GetAbstractDisplayByScreen(ScreenId screenId) const;
|
||||
std::vector<DisplayId> GetAllDisplayIds() const;
|
||||
void AddDisplayForExpandScreen(sptr<AbstractScreen> absScreen);
|
||||
|
||||
private:
|
||||
|
||||
@@ -49,6 +49,7 @@ public:
|
||||
std::vector<ScreenId> GetAllExpandOrMirrorScreenIds(std::vector<ScreenId>) const;
|
||||
sptr<AbstractScreenGroup> 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<AbstractScreenCallback> cb);
|
||||
@@ -95,6 +96,7 @@ private:
|
||||
std::map<ScreenId, sptr<AbstractScreen>> dmsScreenMap_;
|
||||
std::map<ScreenId, sptr<AbstractScreenGroup>> dmsScreenGroupMap_;
|
||||
sptr<AbstractScreenCallback> abstractScreenCallback_;
|
||||
ScreenId defaultScreenId = INVALID_SCREEN_ID;
|
||||
};
|
||||
} // namespace OHOS::Rosen
|
||||
#endif // FOUNDATION_DMSERVER_ABSTRACT_SCREEN_CONTROLLER_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<DisplayId> GetAllDisplayIds() = 0;
|
||||
virtual void NotifyDisplayEvent(DisplayEvent event) = 0;
|
||||
virtual sptr<ScreenInfo> GetScreenInfoById(ScreenId screenId) = 0;
|
||||
virtual sptr<ScreenGroupInfo> GetScreenGroupInfoById(ScreenId screenId) = 0;
|
||||
|
||||
@@ -59,6 +59,7 @@ public:
|
||||
bool SuspendEnd() override;
|
||||
bool SetScreenPowerForAll(DisplayPowerState state, PowerStateChangeReason reason) override;
|
||||
bool SetDisplayState(DisplayState state) override;
|
||||
std::vector<DisplayId> GetAllDisplayIds() override;
|
||||
DisplayState GetDisplayState(DisplayId displayId) override;
|
||||
void NotifyDisplayEvent(DisplayEvent event) override;
|
||||
ScreenId MakeMirror(ScreenId mainScreenId, std::vector<ScreenId> mirrorScreenId) override;
|
||||
|
||||
@@ -89,6 +89,8 @@ public:
|
||||
sptr<ScreenInfo> GetScreenInfoById(ScreenId screenId) override;
|
||||
sptr<ScreenGroupInfo> GetScreenGroupInfoById(ScreenId screenId) override;
|
||||
std::vector<sptr<ScreenInfo>> GetAllScreenInfos() override;
|
||||
|
||||
std::vector<DisplayId> GetAllDisplayIds() override;
|
||||
bool SetScreenActiveMode(ScreenId screenId, uint32_t modeId) override;
|
||||
|
||||
private:
|
||||
|
||||
@@ -99,6 +99,16 @@ sptr<AbstractDisplay> AbstractDisplayController::GetAbstractDisplayByScreen(Scre
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
std::vector<DisplayId> AbstractDisplayController::GetAllDisplayIds() const
|
||||
{
|
||||
std::lock_guard<std::recursive_mutex> lock(mutex_);
|
||||
std::vector<DisplayId> res;
|
||||
for (auto iter = abstractDisplayMap_.begin(); iter != abstractDisplayMap_.end(); ++iter) {
|
||||
res.push_back(iter->first);
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
std::shared_ptr<Media::PixelMap> AbstractDisplayController::GetScreenSnapshot(DisplayId displayId)
|
||||
{
|
||||
sptr<AbstractDisplay> abstractDisplay = GetAbstractDisplay(displayId);
|
||||
|
||||
@@ -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<std::recursive_mutex> lock(mutex_);
|
||||
|
||||
@@ -653,6 +653,24 @@ DisplayState DisplayManagerProxy::GetDisplayState(DisplayId displayId)
|
||||
return static_cast<DisplayState>(reply.ReadUint32());
|
||||
}
|
||||
|
||||
std::vector<DisplayId> DisplayManagerProxy::GetAllDisplayIds()
|
||||
{
|
||||
std::vector<DisplayId> 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;
|
||||
|
||||
@@ -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<AbstractDisplay> display = GetDisplayByScreen(dmsScreenId);
|
||||
if (display == nullptr) {
|
||||
WLOGFE("fail to get displayInfo by id: invalid display");
|
||||
return DISPLAY_ID_INVALD;
|
||||
}
|
||||
return display->GetId();
|
||||
}
|
||||
|
||||
sptr<DisplayInfo> DisplayManagerService::GetDisplayInfoById(DisplayId displayId)
|
||||
@@ -458,6 +463,11 @@ sptr<ScreenGroupInfo> DisplayManagerService::GetScreenGroupInfoById(ScreenId scr
|
||||
return screenGroup->ConvertToScreenGroupInfo();
|
||||
}
|
||||
|
||||
std::vector<DisplayId> DisplayManagerService::GetAllDisplayIds()
|
||||
{
|
||||
return abstractDisplayController_->GetAllDisplayIds();
|
||||
}
|
||||
|
||||
std::vector<sptr<ScreenInfo>> DisplayManagerService::GetAllScreenInfos()
|
||||
{
|
||||
std::vector<ScreenId> screenIds = abstractScreenController_->GetAllScreenIds();
|
||||
|
||||
@@ -41,23 +41,24 @@ const sptr<AbstractDisplay> DisplayManagerServiceInner::GetDisplayById(DisplayId
|
||||
{
|
||||
sptr<AbstractDisplay> 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<AbstractDisplay> DisplayManagerServiceInner::GetDefaultDisplay()
|
||||
{
|
||||
DisplayId defaultDisplayId = GetDefaultDisplayId();
|
||||
if (defaultDisplayId == DISPLAY_ID_INVALD) {
|
||||
WLOGFE("Fail to get default displayId");
|
||||
return nullptr;
|
||||
}
|
||||
return GetDisplayById(GetDefaultDisplayId());
|
||||
}
|
||||
|
||||
std::vector<DisplayId> DisplayManagerServiceInner::GetAllDisplayIds()
|
||||
{
|
||||
std::vector<DisplayId> res;
|
||||
res.push_back(GetDefaultDisplayId());
|
||||
return res;
|
||||
return DisplayManagerService::GetInstance().GetAllDisplayIds();
|
||||
}
|
||||
|
||||
std::vector<const sptr<AbstractDisplay>> DisplayManagerServiceInner::GetAllDisplays()
|
||||
|
||||
@@ -202,6 +202,11 @@ int32_t DisplayManagerStub::OnRemoteRequest(uint32_t code, MessageParcel &data,
|
||||
}
|
||||
break;
|
||||
}
|
||||
case TRANS_ID_GET_ALL_DISPLAYIDS: {
|
||||
std::vector<DisplayId> allDisplayIds = GetAllDisplayIds();
|
||||
reply.WriteUInt64Vector(allDisplayIds);
|
||||
break;
|
||||
}
|
||||
case TRANS_ID_SCREEN_MAKE_EXPAND: {
|
||||
std::vector<ScreenId> screenId;
|
||||
if (!data.ReadUInt64Vector(&screenId)) {
|
||||
|
||||
@@ -46,8 +46,8 @@ private:
|
||||
void OnSurfaceCapture(std::shared_ptr<Media::PixelMap> pixelmap) override
|
||||
{
|
||||
if (flag_ == false) {
|
||||
flag_ = true;
|
||||
pixelMap_ = pixelmap;
|
||||
flag_ = true;
|
||||
}
|
||||
}
|
||||
bool IsPixelMapOk()
|
||||
|
||||
Reference in New Issue
Block a user