mirror of
https://github.com/openharmony/windowmanager.git
synced 2026-07-20 01:13:32 -04:00
支持自由窗口自定义大小和比例限制
: Signed-off-by: l00574490 <liuqi149@huawei.com> Change-Id: I175e1b6990ec68c18ea6dd0e7b08966216ac8011
This commit is contained in:
@@ -31,14 +31,14 @@ public:
|
||||
~DisplayManagerConfig() = default;
|
||||
|
||||
static bool LoadConfigXml(const std::string& configFilePath);
|
||||
static const std::map<std::string, std::vector<int>>& GetNumbersConfig();
|
||||
static const std::map<std::string, std::vector<int>>& GetIntNumbersConfig();
|
||||
static void DumpConfig();
|
||||
|
||||
private:
|
||||
static std::map<std::string, std::vector<int>> numbersConfig_;
|
||||
static std::map<std::string, std::vector<int>> intNumbersConfig_;
|
||||
|
||||
static bool IsValidNode(const xmlNode& currNode);
|
||||
static void ReadNumbersConfigInfo(const xmlNodePtr& currNode);
|
||||
static void ReadIntNumbersConfigInfo(const xmlNodePtr& currNode);
|
||||
|
||||
static std::vector<std::string> Split(std::string str, std::string pattern);
|
||||
static inline bool IsNumber(std::string str);
|
||||
|
||||
@@ -22,7 +22,7 @@ namespace {
|
||||
constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "DisplayManagerConfig"};
|
||||
}
|
||||
|
||||
std::map<std::string, std::vector<int>> DisplayManagerConfig::numbersConfig_;
|
||||
std::map<std::string, std::vector<int>> DisplayManagerConfig::intNumbersConfig_;
|
||||
|
||||
std::vector<std::string> DisplayManagerConfig::Split(std::string str, std::string pattern)
|
||||
{
|
||||
@@ -76,7 +76,7 @@ bool DisplayManagerConfig::LoadConfigXml(const std::string& configFilePath)
|
||||
|
||||
auto nodeName = curNodePtr->name;
|
||||
if (!xmlStrcmp(nodeName, reinterpret_cast<const xmlChar*>("dpi"))) {
|
||||
ReadNumbersConfigInfo(curNodePtr);
|
||||
ReadIntNumbersConfigInfo(curNodePtr);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -92,7 +92,7 @@ bool DisplayManagerConfig::IsValidNode(const xmlNode& currNode)
|
||||
return true;
|
||||
}
|
||||
|
||||
void DisplayManagerConfig::ReadNumbersConfigInfo(const xmlNodePtr& currNode)
|
||||
void DisplayManagerConfig::ReadIntNumbersConfigInfo(const xmlNodePtr& currNode)
|
||||
{
|
||||
xmlChar* context = xmlNodeGetContent(currNode);
|
||||
if (context == nullptr) {
|
||||
@@ -113,18 +113,18 @@ void DisplayManagerConfig::ReadNumbersConfigInfo(const xmlNodePtr& currNode)
|
||||
}
|
||||
|
||||
std::string nodeName = reinterpret_cast<const char *>(currNode->name);
|
||||
numbersConfig_[nodeName] = numbersVec;
|
||||
intNumbersConfig_[nodeName] = numbersVec;
|
||||
xmlFree(context);
|
||||
}
|
||||
|
||||
const std::map<std::string, std::vector<int>>& DisplayManagerConfig::GetNumbersConfig()
|
||||
const std::map<std::string, std::vector<int>>& DisplayManagerConfig::GetIntNumbersConfig()
|
||||
{
|
||||
return numbersConfig_;
|
||||
return intNumbersConfig_;
|
||||
}
|
||||
|
||||
void DisplayManagerConfig::DumpConfig()
|
||||
{
|
||||
for (auto& numbers : numbersConfig_) {
|
||||
for (auto& numbers : intNumbersConfig_) {
|
||||
WLOGFI("[DmConfig] Numbers: %{public}s %{public}zu", numbers.first.c_str(), numbers.second.size());
|
||||
for (auto& num : numbers.second) {
|
||||
WLOGFI("[DmConfig] Num: %{public}d", num);
|
||||
|
||||
@@ -80,7 +80,7 @@ bool DisplayManagerService::Init()
|
||||
|
||||
void DisplayManagerService::ConfigureDisplayManagerService()
|
||||
{
|
||||
auto numbersConfig = DisplayManagerConfig::GetNumbersConfig();
|
||||
auto numbersConfig = DisplayManagerConfig::GetIntNumbersConfig();
|
||||
if (numbersConfig.count("dpi") != 0) {
|
||||
uint32_t densityDpi = static_cast<uint32_t>(numbersConfig["dpi"][0]);
|
||||
if (densityDpi == 0) {
|
||||
|
||||
@@ -171,43 +171,6 @@ public:
|
||||
return dstRect;
|
||||
}
|
||||
|
||||
static Rect GetFixedWindowRectByLimitPosition(const Rect& oriDstRect, const Rect& lastRect,
|
||||
float virtualPixelRatio, const Rect& displayLimitRect)
|
||||
{
|
||||
Rect dstRect = oriDstRect;
|
||||
uint32_t windowTitleBarH = static_cast<uint32_t>(WINDOW_TITLE_BAR_HEIGHT * virtualPixelRatio);
|
||||
// minimum (x + width)
|
||||
if (dstRect.posX_ < (displayLimitRect.posX_ + static_cast<int32_t>(windowTitleBarH - oriDstRect.width_))) {
|
||||
if (oriDstRect.width_ != lastRect.width_) {
|
||||
dstRect.width_ = static_cast<uint32_t>(displayLimitRect.posX_ - oriDstRect.posX_) + windowTitleBarH;
|
||||
}
|
||||
}
|
||||
// maximum position x
|
||||
if (dstRect.posX_ > (displayLimitRect.posX_ +
|
||||
static_cast<int32_t>(displayLimitRect.width_ - windowTitleBarH))) {
|
||||
dstRect.posX_ = displayLimitRect.posX_ + static_cast<int32_t>(displayLimitRect.width_ - windowTitleBarH);
|
||||
if (oriDstRect.width_ != lastRect.width_) {
|
||||
dstRect.width_ = lastRect.width_;
|
||||
}
|
||||
}
|
||||
// minimum position y
|
||||
if (oriDstRect.posY_ < displayLimitRect.posY_) {
|
||||
dstRect.posY_ = displayLimitRect.posY_;
|
||||
if (oriDstRect.height_ != lastRect.height_) {
|
||||
dstRect.height_ = lastRect.height_;
|
||||
}
|
||||
}
|
||||
// maximum position y
|
||||
if (dstRect.posY_ > (displayLimitRect.posY_ +
|
||||
static_cast<int32_t>(displayLimitRect.height_ - windowTitleBarH))) {
|
||||
dstRect.posY_ = displayLimitRect.posY_ + static_cast<int32_t>(displayLimitRect.height_ - windowTitleBarH);
|
||||
if (oriDstRect.height_ != lastRect.height_) {
|
||||
dstRect.height_ = lastRect.height_;
|
||||
}
|
||||
}
|
||||
return dstRect;
|
||||
}
|
||||
|
||||
static bool IsPointInTargetRect(int32_t pointPosX, int32_t pointPosY, const Rect& targetRect)
|
||||
{
|
||||
if ((pointPosX > targetRect.posX_) &&
|
||||
@@ -265,6 +228,17 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline bool IsFloatingNumber(std::string str)
|
||||
{
|
||||
for (int32_t i = 0; i < static_cast<int32_t>(str.size()); i++) {
|
||||
if ((str.at(i) < '0' || str.at(i) > '9') &&
|
||||
(str.at(i) != '.' || std::count(str.begin(), str.end(), '.') > 1)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static std::vector<std::string> Split(std::string str, std::string pattern)
|
||||
{
|
||||
int32_t position;
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
#include "class_var_definition.h"
|
||||
#include "dm_common.h"
|
||||
#include "wm_common.h"
|
||||
#include "wm_common_inner.h"
|
||||
|
||||
namespace OHOS {
|
||||
namespace Rosen {
|
||||
@@ -67,6 +68,7 @@ public:
|
||||
void SetWindowSizeChangeReason(WindowSizeChangeReason reason);
|
||||
void SetTokenState(bool hasToken);
|
||||
void SetModeSupportInfo(uint32_t modeSupportInfo);
|
||||
void SetDragType(DragType dragType);
|
||||
WindowSizeChangeReason GetWindowSizeChangeReason() const;
|
||||
|
||||
const std::string& GetWindowName() const;
|
||||
@@ -98,6 +100,7 @@ public:
|
||||
const PointInfo& GetHitOffset() const;
|
||||
uint32_t GetAnimationFlag() const;
|
||||
uint32_t GetModeSupportInfo() const;
|
||||
DragType GetDragType() const;
|
||||
|
||||
virtual bool Marshalling(Parcel& parcel) const override;
|
||||
static WindowProperty* Unmarshalling(Parcel& parcel);
|
||||
@@ -137,6 +140,7 @@ private:
|
||||
{ WindowType::WINDOW_TYPE_NAVIGATION_BAR, SystemBarProperty() },
|
||||
};
|
||||
bool isDecorEnable_ { false };
|
||||
DragType dragType_ = DragType::DRAG_UNDEFINED;
|
||||
DEFINE_VAR_DEFAULT_FUNC_GET_SET(Orientation, RequestedOrientation, requestedOrientation, Orientation::UNSPECIFIED);
|
||||
};
|
||||
}
|
||||
|
||||
@@ -85,12 +85,31 @@ struct ModeChangeHotZonesConfig {
|
||||
uint32_t secondaryRange_;
|
||||
};
|
||||
|
||||
struct FloatingWindowLimitsConfig {
|
||||
bool isFloatingWindowLimitsConfigured_;
|
||||
uint32_t maxWidth_;
|
||||
uint32_t maxHeight_;
|
||||
uint32_t minWidth_;
|
||||
uint32_t minHeight_;
|
||||
float maxRatio_;
|
||||
float minRatio_;
|
||||
FloatingWindowLimitsConfig() : isFloatingWindowLimitsConfigured_(false), maxWidth_(0), maxHeight_(0), minWidth_(0),
|
||||
minHeight_(0), maxRatio_(0.0f), minRatio_(0.0f) {}
|
||||
};
|
||||
|
||||
struct ModeChangeHotZones {
|
||||
Rect fullscreen_;
|
||||
Rect primary_;
|
||||
Rect secondary_;
|
||||
};
|
||||
|
||||
enum class DragType : uint32_t {
|
||||
DRAG_UNDEFINED,
|
||||
DRAG_WIDTH,
|
||||
DRAG_HEIGHT,
|
||||
DRAG_CORNER,
|
||||
};
|
||||
|
||||
namespace {
|
||||
constexpr float DEFAULT_SPLIT_RATIO = 0.5;
|
||||
constexpr float DEFAULT_ASPECT_RATIO = 0.66;
|
||||
|
||||
@@ -165,6 +165,11 @@ void WindowProperty::SetWindowSizeChangeReason(WindowSizeChangeReason reason)
|
||||
windowSizeChangeReason_ = reason;
|
||||
}
|
||||
|
||||
void WindowProperty::SetDragType(DragType dragType)
|
||||
{
|
||||
dragType_ = dragType;
|
||||
}
|
||||
|
||||
WindowSizeChangeReason WindowProperty::GetWindowSizeChangeReason() const
|
||||
{
|
||||
return windowSizeChangeReason_;
|
||||
@@ -335,6 +340,11 @@ bool WindowProperty::GetTokenState() const
|
||||
return tokenState_;
|
||||
}
|
||||
|
||||
DragType WindowProperty::GetDragType() const
|
||||
{
|
||||
return dragType_;
|
||||
}
|
||||
|
||||
bool WindowProperty::MapMarshalling(Parcel& parcel) const
|
||||
{
|
||||
auto size = sysBarPropMap_.size();
|
||||
@@ -384,7 +394,7 @@ bool WindowProperty::Marshalling(Parcel& parcel) const
|
||||
parcel.WriteUint32(static_cast<uint32_t>(windowSizeChangeReason_)) && parcel.WriteBool(tokenState_) &&
|
||||
parcel.WriteUint32(callingWindow_) && parcel.WriteUint32(static_cast<uint32_t>(requestedOrientation_)) &&
|
||||
parcel.WriteBool(turnScreenOn_) && parcel.WriteBool(keepScreenOn_) &&
|
||||
parcel.WriteUint32(modeSupportInfo_);
|
||||
parcel.WriteUint32(modeSupportInfo_) && parcel.WriteUint32(static_cast<uint32_t>(dragType_));
|
||||
}
|
||||
|
||||
WindowProperty* WindowProperty::Unmarshalling(Parcel& parcel)
|
||||
@@ -426,6 +436,7 @@ WindowProperty* WindowProperty::Unmarshalling(Parcel& parcel)
|
||||
property->SetTurnScreenOn(parcel.ReadBool());
|
||||
property->SetKeepScreenOn(parcel.ReadBool());
|
||||
property->SetModeSupportInfo(parcel.ReadUint32());
|
||||
property->SetDragType(static_cast<DragType>(parcel.ReadUint32()));
|
||||
return property;
|
||||
}
|
||||
|
||||
@@ -461,6 +472,7 @@ void WindowProperty::CopyFrom(const sptr<WindowProperty>& property)
|
||||
turnScreenOn_ = property->turnScreenOn_;
|
||||
keepScreenOn_ = property->keepScreenOn_;
|
||||
modeSupportInfo_ = property->modeSupportInfo_;
|
||||
dragType_ = property->dragType_;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -276,6 +276,7 @@ private:
|
||||
void HandleModeChangeHotZones(int32_t posX, int32_t posY);
|
||||
WMError NotifyWindowTransition(TransitionReason reason);
|
||||
void UpdatePointerEventForStretchableWindow(std::shared_ptr<MMI::PointerEvent>& pointerEvent);
|
||||
void UpdateDragType();
|
||||
|
||||
// colorspace, gamut
|
||||
using ColorSpaceConvertMap = struct {
|
||||
@@ -321,6 +322,7 @@ private:
|
||||
Rect startPointRect_ = { 0, 0, 0, 0 };
|
||||
Rect startRectExceptFrame_ = { 0, 0, 0, 0 };
|
||||
Rect startRectExceptCorner_ = { 0, 0, 0, 0 };
|
||||
DragType dragType_ = DragType::DRAG_UNDEFINED;
|
||||
Rect originRect_ = {0, 0, 0, 0};
|
||||
bool isAppDecorEnbale_ = true;
|
||||
SystemConfig windowSystemConfig_ ;
|
||||
|
||||
@@ -1059,6 +1059,7 @@ WMError WindowImpl::Drag(const Rect& rect)
|
||||
Rect requestRect = rect;
|
||||
property_->SetRequestRect(requestRect);
|
||||
property_->SetWindowSizeChangeReason(WindowSizeChangeReason::DRAG);
|
||||
property_->SetDragType(dragType_);
|
||||
return UpdateProperty(PropertyChangeAction::ACTION_UPDATE_RECT);
|
||||
}
|
||||
|
||||
@@ -1636,6 +1637,23 @@ void WindowImpl::EndMoveOrDragWindow(int32_t posX, int32_t posY, int32_t pointId
|
||||
pointEventStarted_ = false;
|
||||
}
|
||||
|
||||
void WindowImpl::UpdateDragType()
|
||||
{
|
||||
if (!startDragFlag_) {
|
||||
dragType_ = DragType::DRAG_UNDEFINED;
|
||||
return;
|
||||
}
|
||||
if (startPointPosX_ > startRectExceptCorner_.posX_ &&
|
||||
(startPointPosX_ < startRectExceptCorner_.posX_ + static_cast<int32_t>(startRectExceptCorner_.width_))) {
|
||||
dragType_ = DragType::DRAG_HEIGHT;
|
||||
} else if (startPointPosY_ > startRectExceptCorner_.posY_ &&
|
||||
(startPointPosY_ < startRectExceptCorner_.posY_ + static_cast<int32_t>(startRectExceptCorner_.height_))) {
|
||||
dragType_ = DragType::DRAG_WIDTH;
|
||||
} else {
|
||||
dragType_ = DragType::DRAG_CORNER;
|
||||
}
|
||||
}
|
||||
|
||||
void WindowImpl::ReadyToMoveOrDragWindow(int32_t globalX, int32_t globalY, int32_t pointId, const Rect& rect)
|
||||
{
|
||||
if (pointEventStarted_) {
|
||||
@@ -1683,6 +1701,9 @@ void WindowImpl::ReadyToMoveOrDragWindow(int32_t globalX, int32_t globalY, int32
|
||||
startDragFlag_ = true;
|
||||
SingletonContainer::Get<WindowAdapter>().ProcessPointDown(property_->GetWindowId(), true);
|
||||
}
|
||||
|
||||
UpdateDragType();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,8 @@ public:
|
||||
std::vector<sptr<Window>> activeWindows_;
|
||||
static vector<Rect> fullScreenExpecteds_;
|
||||
static inline float virtualPixelRatio_ = 0.0;
|
||||
private:
|
||||
static constexpr uint32_t WAIT_SYANC_US = 100000;
|
||||
};
|
||||
|
||||
vector<Rect> WindowLayoutTest::fullScreenExpecteds_;
|
||||
@@ -371,31 +373,34 @@ HWTEST_F(WindowLayoutTest, LayoutTile01, Function | MediumTest | Level3)
|
||||
utils::InitTileWindowRects(window);
|
||||
ASSERT_TRUE(utils::RectEqualTo(window, expect));
|
||||
WindowManager::GetInstance().SetWindowLayoutMode(WindowLayoutMode::TILE);
|
||||
usleep(WAIT_SYANC_US);
|
||||
ASSERT_TRUE(utils::RectEqualTo(window, utils::singleTileRect_));
|
||||
info.name = "test1";
|
||||
const sptr<Window>& test1 = utils::CreateTestWindow(info);
|
||||
activeWindows_.push_back(test1);
|
||||
ASSERT_EQ(WMError::WM_OK, test1->Show());
|
||||
usleep(WAIT_SYANC_US);
|
||||
ASSERT_TRUE(utils::RectEqualTo(window, utils::doubleTileRects_[0]));
|
||||
ASSERT_TRUE(utils::RectEqualTo(test1, utils::doubleTileRects_[1]));
|
||||
info.name = "test2";
|
||||
const sptr<Window>& test2 = utils::CreateTestWindow(info);
|
||||
activeWindows_.push_back(test2);
|
||||
ASSERT_EQ(WMError::WM_OK, test2->Show());
|
||||
usleep(WAIT_SYANC_US);
|
||||
if (utils::isVerticalDisplay_) {
|
||||
ASSERT_TRUE(utils::RectEqualTo(test1, utils::doubleTileRects_[0]));
|
||||
ASSERT_TRUE(utils::RectEqualTo(test2, utils::doubleTileRects_[1]));
|
||||
WindowManager::GetInstance().SetWindowLayoutMode(WindowLayoutMode::CASCADE);
|
||||
return;
|
||||
} else {
|
||||
ASSERT_TRUE(utils::RectEqualTo(window, utils::tripleTileRects_[0]));
|
||||
ASSERT_TRUE(utils::RectEqualTo(test1, utils::tripleTileRects_[1]));
|
||||
ASSERT_TRUE(utils::RectEqualTo(test2, utils::tripleTileRects_[2])); // 2 is second rect idx
|
||||
}
|
||||
ASSERT_TRUE(utils::RectEqualTo(window, utils::tripleTileRects_[0]));
|
||||
ASSERT_TRUE(utils::RectEqualTo(test1, utils::tripleTileRects_[1]));
|
||||
ASSERT_TRUE(utils::RectEqualTo(test2, utils::tripleTileRects_[2])); // 2 is second rect idx
|
||||
info.name = "test3";
|
||||
const sptr<Window>& test3 = utils::CreateTestWindow(info);
|
||||
activeWindows_.push_back(test3);
|
||||
ASSERT_EQ(WMError::WM_OK, test3->Show());
|
||||
usleep(WAIT_SYANC_US);
|
||||
ASSERT_TRUE(utils::RectEqualTo(test1, utils::tripleTileRects_[0]));
|
||||
ASSERT_TRUE(utils::RectEqualTo(test2, utils::tripleTileRects_[1]));
|
||||
ASSERT_TRUE(utils::RectEqualTo(test3, utils::tripleTileRects_[2])); // 2 is second rect idx
|
||||
@@ -423,17 +428,20 @@ HWTEST_F(WindowLayoutTest, LayoutTileNegative01, Function | MediumTest | Level3)
|
||||
ASSERT_EQ(WMError::WM_OK, window->Show());
|
||||
utils::InitTileWindowRects(window);
|
||||
WindowManager::GetInstance().SetWindowLayoutMode(WindowLayoutMode::TILE);
|
||||
usleep(WAIT_SYANC_US);
|
||||
ASSERT_TRUE(utils::RectEqualTo(window, utils::singleTileRect_));
|
||||
info.name = "test1";
|
||||
const sptr<Window>& test1 = utils::CreateTestWindow(info);
|
||||
activeWindows_.push_back(test1);
|
||||
ASSERT_EQ(WMError::WM_OK, test1->Show());
|
||||
usleep(WAIT_SYANC_US);
|
||||
ASSERT_TRUE(utils::RectEqualTo(window, utils::doubleTileRects_[0]));
|
||||
ASSERT_TRUE(utils::RectEqualTo(test1, utils::doubleTileRects_[1]));
|
||||
info.name = "test2";
|
||||
const sptr<Window>& test2 = utils::CreateTestWindow(info);
|
||||
activeWindows_.push_back(test2);
|
||||
ASSERT_EQ(WMError::WM_OK, test2->Show());
|
||||
usleep(WAIT_SYANC_US);
|
||||
if (utils::isVerticalDisplay_) {
|
||||
ASSERT_TRUE(utils::RectEqualTo(test1, utils::doubleTileRects_[0]));
|
||||
ASSERT_TRUE(utils::RectEqualTo(test2, utils::doubleTileRects_[1]));
|
||||
@@ -448,6 +456,7 @@ HWTEST_F(WindowLayoutTest, LayoutTileNegative01, Function | MediumTest | Level3)
|
||||
const sptr<Window>& test3 = utils::CreateTestWindow(info);
|
||||
activeWindows_.push_back(test3);
|
||||
ASSERT_EQ(WMError::WM_OK, test3->Show());
|
||||
usleep(WAIT_SYANC_US);
|
||||
ASSERT_TRUE(utils::RectEqualTo(test1, utils::tripleTileRects_[0]));
|
||||
ASSERT_TRUE(utils::RectEqualTo(test2, utils::tripleTileRects_[1]));
|
||||
ASSERT_TRUE(utils::RectEqualTo(test3, utils::tripleTileRects_[2])); // 2 is second rect idx
|
||||
@@ -474,6 +483,7 @@ HWTEST_F(WindowLayoutTest, LayoutNegative01, Function | MediumTest | Level3)
|
||||
activeWindows_.push_back(window);
|
||||
Rect expect = utils::GetDefaultFloatingRect(window);
|
||||
ASSERT_EQ(WMError::WM_OK, window->Show());
|
||||
usleep(WAIT_SYANC_US);
|
||||
ASSERT_TRUE(utils::RectEqualTo(window, expect));
|
||||
}
|
||||
|
||||
@@ -499,8 +509,10 @@ HWTEST_F(WindowLayoutTest, LayoutNegative02, Function | MediumTest | Level3)
|
||||
activeWindows_.push_back(window);
|
||||
Rect expect = utils::GetDefaultFloatingRect(window);
|
||||
ASSERT_EQ(WMError::WM_OK, window->Show());
|
||||
usleep(WAIT_SYANC_US);
|
||||
ASSERT_TRUE(utils::RectEqualTo(window, expect));
|
||||
window->Resize(negativeW, negativeH);
|
||||
usleep(WAIT_SYANC_US);
|
||||
Rect expect2 = {expect.posX_, expect.posY_, negativeW, negativeH};
|
||||
expect2 = utils::CalcLimitedRect(expect2, virtualPixelRatio_);
|
||||
ASSERT_TRUE(utils::RectEqualTo(window, expect2));
|
||||
|
||||
@@ -59,27 +59,23 @@ public:
|
||||
void ProcessDisplayCreate(DisplayId displayId, const std::map<DisplayId, Rect>& displayRectMap);
|
||||
void ProcessDisplayDestroy(DisplayId displayId, const std::map<DisplayId, Rect>& displayRectMap);
|
||||
void ProcessDisplaySizeChangeOrRotation(DisplayId displayId, const std::map<DisplayId, Rect>& displayRectMap);
|
||||
void SetFloatingWindowLimitsConfig(const FloatingWindowLimitsConfig& floatingWindowLimitsConfig);
|
||||
|
||||
protected:
|
||||
void UpdateFloatingLayoutRect(Rect& limitRect, Rect& winRect);
|
||||
void UpdateLimitRect(const sptr<WindowNode>& node, Rect& limitRect);
|
||||
virtual void LayoutWindowNode(const sptr<WindowNode>& node);
|
||||
AvoidPosType GetAvoidPosType(const Rect& rect, DisplayId displayId) const;
|
||||
void CalcAndSetNodeHotZone(Rect layoutOutRect, const sptr<WindowNode>& node) const;
|
||||
void LimitFloatingWindowSize(const sptr<WindowNode>& node, const Rect& displayRect, Rect& winRect) const;
|
||||
void LimitMainFloatingWindowPositionWithDrag(const sptr<WindowNode>& node, Rect& winRect) const;
|
||||
void LimitMainFloatingWindowPosition(const sptr<WindowNode>& node, Rect& winRect) const;
|
||||
void CalcAndSetNodeHotZone(const Rect& winRect, const sptr<WindowNode>& node) const;
|
||||
void ComputeDecoratedRequestRect(const sptr<WindowNode>& node) const;
|
||||
bool IsVerticalDisplay(DisplayId displayId) const;
|
||||
bool IsFullScreenRecentWindowExist(const std::vector<sptr<WindowNode>>& nodeVec) const;
|
||||
void LayoutWindowNodesByRootType(const std::vector<sptr<WindowNode>>& nodeVec);
|
||||
void UpdateSurfaceBounds(const sptr<WindowNode>& node, const Rect& winRect);
|
||||
void UpdateRectInDisplayGroupForAllNodes(DisplayId displayId,
|
||||
const Rect& oriDisplayRect,
|
||||
const Rect& newDisplayRect);
|
||||
const Rect& oriDisplayRect, const Rect& newDisplayRect);
|
||||
void UpdateRectInDisplayGroup(const sptr<WindowNode>& node,
|
||||
const Rect& oriDisplayRect,
|
||||
const Rect& newDisplayRect);
|
||||
const Rect& oriDisplayRect, const Rect& newDisplayRect);
|
||||
void LimitWindowToBottomRightCorner(const sptr<WindowNode>& node);
|
||||
void UpdateDisplayGroupRect();
|
||||
void UpdateDisplayGroupLimitRect_();
|
||||
@@ -87,6 +83,19 @@ protected:
|
||||
void PostProcessWhenDisplayChange();
|
||||
void UpdateDisplayRectAndDisplayGroupInfo(const std::map<DisplayId, Rect>& displayRectMap);
|
||||
DockWindowShowState GetDockWindowShowState(DisplayId displayId, Rect& dockWinRect) const;
|
||||
void LimitFloatingWindowSize(const sptr<WindowNode>& node, const Rect& displayRect, Rect& winRect) const;
|
||||
void LimitMainFloatingWindowPosition(const sptr<WindowNode>& node, Rect& winRect) const;
|
||||
|
||||
void UpdateFloatingWindowSizeByCustomizedLimits(const sptr<WindowNode>& node,
|
||||
const Rect& displayRect, Rect& winRect) const;
|
||||
void UpdateFloatingWindowSizeBySystemLimits(const sptr<WindowNode>& node,
|
||||
const Rect& displayRect, Rect& winRect) const;
|
||||
void LimitWindowPositionWhenInitRectOrMove(const sptr<WindowNode>& node, Rect& winRect) const;
|
||||
void LimitWindowPositionWhenDrag(const sptr<WindowNode>& node, Rect& winRect) const;
|
||||
void FixWindowSizeByRatioIfDragBeyondLimitRegion(const sptr<WindowNode>& node, Rect& winRect,
|
||||
const FloatingWindowLimitsConfig& limitConfig);
|
||||
FloatingWindowLimitsConfig GetCustomizedLimitsConfig(const Rect& displayRect, float virtualPixelRatio);
|
||||
FloatingWindowLimitsConfig GetSystemLimitsConfig(const Rect& displayRect, float virtualPixelRatio);
|
||||
|
||||
const std::set<WindowType> avoidTypes_ {
|
||||
WindowType::WINDOW_TYPE_STATUS_BAR,
|
||||
@@ -98,6 +107,7 @@ protected:
|
||||
Rect displayGroupRect_;
|
||||
Rect displayGroupLimitRect_;
|
||||
bool isMultiDisplay_ = false;
|
||||
FloatingWindowLimitsConfig floatingWindowLimitsConfig_;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,16 +33,19 @@ public:
|
||||
|
||||
static bool LoadConfigXml(const std::string& configFilePath);
|
||||
static const std::map<std::string, bool>& GetEnableConfig();
|
||||
static const std::map<std::string, std::vector<int>>& GetNumbersConfig();
|
||||
static const std::map<std::string, std::vector<int>>& GetIntNumbersConfig();
|
||||
static const std::map<std::string, std::vector<float>>& GetFloatNumbersConfig();
|
||||
static void DumpConfig();
|
||||
|
||||
private:
|
||||
static std::map<std::string, bool> enableConfig_;
|
||||
static std::map<std::string, std::vector<int>> numbersConfig_;
|
||||
static std::map<std::string, std::vector<int>> intNumbersConfig_;
|
||||
static std::map<std::string, std::vector<float>> floatNumbersConfig_;
|
||||
|
||||
static bool IsValidNode(const xmlNode& currNode);
|
||||
static void ReadEnableConfigInfo(const xmlNodePtr& currNode);
|
||||
static void ReadNumbersConfigInfo(const xmlNodePtr& currNode);
|
||||
static void ReadIntNumbersConfigInfo(const xmlNodePtr& currNode);
|
||||
static void ReadFloatNumbersConfigInfo(const xmlNodePtr& currNode);
|
||||
};
|
||||
} // namespace Rosen
|
||||
} // namespace OHOS
|
||||
|
||||
@@ -69,6 +69,8 @@ public:
|
||||
void SetRequestedOrientation(Orientation orientation);
|
||||
void SetShowingDisplays(const std::vector<DisplayId>& displayIdVec);
|
||||
void SetModeSupportInfo(uint32_t modeSupportInfo);
|
||||
void SetDragType(DragType dragType);
|
||||
|
||||
const sptr<IWindow>& GetWindowToken() const;
|
||||
uint32_t GetWindowId() const;
|
||||
uint32_t GetParentId() const;
|
||||
@@ -95,6 +97,7 @@ public:
|
||||
Orientation GetRequestedOrientation() const;
|
||||
std::vector<DisplayId> GetShowingDisplays() const;
|
||||
uint32_t GetModeSupportInfo() const;
|
||||
DragType GetDragType() const;
|
||||
void ResetWindowSizeChangeReason();
|
||||
|
||||
sptr<WindowNode> parent_;
|
||||
|
||||
@@ -85,6 +85,7 @@ public:
|
||||
uint32_t GetWindowIdByObject(const sptr<IRemoteObject>& remoteObject);
|
||||
sptr<WindowNode> GetWindowForDumpAceHelpInfo() const;
|
||||
void DestroyLeakStartingWindow();
|
||||
void SetFloatingWindowLimitsConfig(const FloatingWindowLimitsConfig& floatingWindowLimitsConfig);
|
||||
private:
|
||||
void OnRemoteDied(const sptr<IRemoteObject>& remoteObject);
|
||||
WMError DestroyWindowInner(sptr<WindowNode>& node);
|
||||
@@ -98,7 +99,7 @@ private:
|
||||
void NotifyKeyboardSizeChangeInfo(const sptr<WindowNode>& node,
|
||||
const sptr<WindowNodeContainer>& container, Rect rect);
|
||||
ScreenId GetScreenGroupId(DisplayId displayId, bool& isRecordedDisplay);
|
||||
void ProcessExpandDisplayCreate(DisplayId displayId, ScreenId screenGroupId);
|
||||
void ProcessExpandDisplayCreate(DisplayId displayId, ScreenId displayGroupId);
|
||||
std::map<DisplayId, sptr<DisplayInfo>> GetAllDisplayInfos(const std::vector<DisplayId>& displayIdVec);
|
||||
std::map<DisplayId, Rect> GetAllDisplayRects(const std::vector<DisplayId>& displayIdVec);
|
||||
void MoveNotShowingWindowToDefaultDisplay(DisplayId displayId);
|
||||
@@ -117,6 +118,7 @@ private:
|
||||
this, std::placeholders::_1));
|
||||
Callback callback_;
|
||||
int maxAppWindowNumber_ = 100;
|
||||
FloatingWindowLimitsConfig floatingWindowLimitsConfig_;
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -723,6 +723,7 @@ WMError WindowController::UpdateProperty(sptr<WindowProperty>& property, Propert
|
||||
switch (action) {
|
||||
case PropertyChangeAction::ACTION_UPDATE_RECT: {
|
||||
node->SetDecoStatus(property->GetDecoStatus());
|
||||
node->SetDragType(property->GetDragType());
|
||||
return ResizeRect(windowId, property->GetRequestRect(), property->GetWindowSizeChangeReason());
|
||||
}
|
||||
case PropertyChangeAction::ACTION_UPDATE_MODE: {
|
||||
|
||||
@@ -415,9 +415,9 @@ void WindowLayoutPolicy::ComputeDecoratedRequestRect(const sptr<WindowNode>& nod
|
||||
property->SetDecoStatus(true);
|
||||
}
|
||||
|
||||
void WindowLayoutPolicy::CalcAndSetNodeHotZone(Rect layoutOutRect, const sptr<WindowNode>& node) const
|
||||
void WindowLayoutPolicy::CalcAndSetNodeHotZone(const Rect& winRect, const sptr<WindowNode>& node) const
|
||||
{
|
||||
Rect rect = layoutOutRect;
|
||||
Rect rect = winRect;
|
||||
float virtualPixelRatio = GetVirtualPixelRatio(node->GetDisplayId());
|
||||
uint32_t hotZone = static_cast<uint32_t>(HOTZONE * virtualPixelRatio);
|
||||
|
||||
@@ -440,33 +440,361 @@ void WindowLayoutPolicy::CalcAndSetNodeHotZone(Rect layoutOutRect, const sptr<Wi
|
||||
node->SetHotZoneRect(rect);
|
||||
}
|
||||
|
||||
void WindowLayoutPolicy::FixWindowSizeByRatioIfDragBeyondLimitRegion(const sptr<WindowNode>& node, Rect& winRect,
|
||||
const FloatingWindowLimitsConfig& limitConfig)
|
||||
{
|
||||
if (limitConfig.maxWidth_ == limitConfig.minWidth_ &&
|
||||
limitConfig.maxHeight_ == limitConfig.minHeight_) {
|
||||
WLOGFI("window rect can not be changed");
|
||||
return;
|
||||
}
|
||||
float curRatio = static_cast<float>(winRect.width_) / static_cast<float>(winRect.height_);
|
||||
if (limitConfig.minRatio_ <= curRatio && curRatio <= limitConfig.maxRatio_) {
|
||||
WLOGFI("window ratio is satisfied with limit ratio, curRatio: %{public}f", curRatio);
|
||||
return;
|
||||
}
|
||||
|
||||
float virtualPixelRatio = GetVirtualPixelRatio(node->GetDisplayId());
|
||||
uint32_t windowTitleBarH = static_cast<uint32_t>(WINDOW_TITLE_BAR_HEIGHT * virtualPixelRatio);
|
||||
Rect limitRect = isMultiDisplay_ ? displayGroupLimitRect_ : limitRectMap_[node->GetDisplayId()];
|
||||
int32_t limitMinPosX = limitRect.posX_ + static_cast<int32_t>(windowTitleBarH);
|
||||
int32_t limitMaxPosX = limitRect.posX_ + static_cast<int32_t>(limitRect.width_ - windowTitleBarH);
|
||||
int32_t limitMinPosY = limitRect.posY_;
|
||||
int32_t limitMaxPosY = limitRect.posY_ + static_cast<int32_t>(limitRect.height_ - windowTitleBarH);
|
||||
|
||||
Rect dockWinRect;
|
||||
DockWindowShowState dockShownState = GetDockWindowShowState(node->GetDisplayId(), dockWinRect);
|
||||
if (dockShownState == DockWindowShowState::SHOWN_IN_BOTTOM) {
|
||||
WLOGFD("dock window show in bottom");
|
||||
limitMaxPosY = dockWinRect.posY_ - static_cast<int32_t>(windowTitleBarH);
|
||||
} else if (dockShownState == DockWindowShowState::SHOWN_IN_LEFT) {
|
||||
WLOGFD("dock window show in left");
|
||||
limitMinPosX = dockWinRect.posX_ + static_cast<int32_t>(dockWinRect.width_ + windowTitleBarH);
|
||||
} else if (dockShownState == DockWindowShowState::SHOWN_IN_RIGHT) {
|
||||
WLOGFD("dock window show in right");
|
||||
limitMaxPosX = dockWinRect.posX_ - static_cast<int32_t>(windowTitleBarH);
|
||||
}
|
||||
|
||||
float newRatio = curRatio < limitConfig.minRatio_ ? limitConfig.minRatio_ : limitConfig.maxRatio_;
|
||||
if ((winRect.posX_ + static_cast<int32_t>(winRect.width_) == limitMinPosX) || (winRect.posX_ == limitMaxPosX)) {
|
||||
// height can not be changed
|
||||
if (limitConfig.maxHeight_ == limitConfig.minHeight_) {
|
||||
return;
|
||||
}
|
||||
winRect.height_ = static_cast<uint32_t>(static_cast<float>(winRect.width_) / newRatio);
|
||||
}
|
||||
|
||||
if ((winRect.posY_ == limitMinPosY) || (winRect.posX_ == limitMaxPosY)) {
|
||||
// width can not be changed
|
||||
if (limitConfig.maxWidth_ == limitConfig.minWidth_) {
|
||||
return;
|
||||
}
|
||||
winRect.width_ = static_cast<uint32_t>(static_cast<float>(winRect.height_) * newRatio);
|
||||
}
|
||||
WLOGFI("After limit by ratio if beyond limit region, winRect: %{public}d %{public}d %{public}u %{public}u",
|
||||
winRect.posX_, winRect.posY_, winRect.width_, winRect.height_);
|
||||
}
|
||||
|
||||
FloatingWindowLimitsConfig WindowLayoutPolicy::GetSystemLimitsConfig(const Rect& displayRect, float virtualPixelRatio)
|
||||
{
|
||||
FloatingWindowLimitsConfig limitConfig;
|
||||
limitConfig.maxWidth_ = static_cast<uint32_t>(MAX_FLOATING_SIZE * virtualPixelRatio);
|
||||
limitConfig.maxHeight_ = static_cast<uint32_t>(MAX_FLOATING_SIZE * virtualPixelRatio);
|
||||
limitConfig.minWidth_ = static_cast<uint32_t>(MIN_VERTICAL_FLOATING_WIDTH * virtualPixelRatio);
|
||||
limitConfig.minHeight_ = static_cast<uint32_t>(MIN_VERTICAL_FLOATING_HEIGHT * virtualPixelRatio);
|
||||
if (displayRect.width_ > displayRect.height_) {
|
||||
std::swap(limitConfig.minWidth_, limitConfig.minHeight_);
|
||||
}
|
||||
WLOGFI("maxWidth: %{public}u, maxHeight: %{public}u, minWidth: %{public}u, minHeight: %{public}u "
|
||||
"maxRatio: %{public}f, minRatio: %{public}f", limitConfig.maxWidth_, limitConfig.maxHeight_,
|
||||
limitConfig.minWidth_, limitConfig.minHeight_, limitConfig.maxRatio_, limitConfig.minRatio_);
|
||||
return limitConfig;
|
||||
}
|
||||
|
||||
FloatingWindowLimitsConfig WindowLayoutPolicy::GetCustomizedLimitsConfig(const Rect& displayRect,
|
||||
float virtualPixelRatio)
|
||||
{
|
||||
const auto& systemLimits = GetSystemLimitsConfig(displayRect, virtualPixelRatio);
|
||||
FloatingWindowLimitsConfig newLimitConfig = systemLimits;
|
||||
// configured limits of floating window
|
||||
uint32_t configuredMaxWidth = static_cast<uint32_t>(floatingWindowLimitsConfig_.maxWidth_ * virtualPixelRatio);
|
||||
uint32_t configuredMaxHeight = static_cast<uint32_t>(floatingWindowLimitsConfig_.maxHeight_ * virtualPixelRatio);
|
||||
uint32_t configuredMinWidth = static_cast<uint32_t>(floatingWindowLimitsConfig_.minWidth_ * virtualPixelRatio);
|
||||
uint32_t configuredMinHeight = static_cast<uint32_t>(floatingWindowLimitsConfig_.minHeight_ * virtualPixelRatio);
|
||||
float configuerdMaxRatio = floatingWindowLimitsConfig_.maxRatio_;
|
||||
float configuerdMinRatio = floatingWindowLimitsConfig_.minRatio_;
|
||||
|
||||
// calculate new limit size
|
||||
if (systemLimits.minWidth_ <= configuredMaxWidth && configuredMaxWidth <= systemLimits.maxWidth_) {
|
||||
newLimitConfig.maxWidth_ = configuredMaxWidth;
|
||||
}
|
||||
if (systemLimits.minHeight_ <= configuredMaxHeight && configuredMaxHeight <= systemLimits.maxHeight_) {
|
||||
newLimitConfig.maxHeight_ = configuredMaxHeight;
|
||||
}
|
||||
if (systemLimits.minWidth_ <= configuredMinWidth && configuredMinWidth <= newLimitConfig.maxWidth_) {
|
||||
newLimitConfig.minWidth_ = configuredMinWidth;
|
||||
}
|
||||
if (systemLimits.minHeight_ <= configuredMinHeight && configuredMinHeight <= newLimitConfig.maxHeight_) {
|
||||
newLimitConfig.minHeight_ = configuredMinHeight;
|
||||
}
|
||||
|
||||
// calculate new limit ratio
|
||||
newLimitConfig.maxRatio_ = static_cast<float>(newLimitConfig.maxWidth_) /
|
||||
static_cast<float>(newLimitConfig.minHeight_);
|
||||
newLimitConfig.minRatio_ = static_cast<float>(newLimitConfig.minWidth_) /
|
||||
static_cast<float>(newLimitConfig.maxHeight_);
|
||||
if (newLimitConfig.minRatio_ <= configuerdMaxRatio && configuerdMaxRatio <= newLimitConfig.maxRatio_) {
|
||||
newLimitConfig.maxRatio_ = configuerdMaxRatio;
|
||||
}
|
||||
if (newLimitConfig.minRatio_ <= configuerdMinRatio && configuerdMinRatio <= newLimitConfig.maxRatio_) {
|
||||
newLimitConfig.minRatio_ = configuerdMinRatio;
|
||||
}
|
||||
|
||||
// recalculate limit size by new ratio
|
||||
uint32_t newMaxWidth = static_cast<uint32_t>(static_cast<float>(newLimitConfig.maxHeight_) *
|
||||
newLimitConfig.maxRatio_);
|
||||
newLimitConfig.maxWidth_ = std::min(newMaxWidth, newLimitConfig.maxWidth_);
|
||||
uint32_t newMinWidth = static_cast<uint32_t>(static_cast<float>(newLimitConfig.minHeight_) *
|
||||
newLimitConfig.minRatio_);
|
||||
newLimitConfig.minWidth_ = std::max(newMinWidth, newLimitConfig.minWidth_);
|
||||
uint32_t newMaxHeight = static_cast<uint32_t>(static_cast<float>(newLimitConfig.maxWidth_) /
|
||||
newLimitConfig.minRatio_);
|
||||
newLimitConfig.maxHeight_ = std::min(newMaxHeight, newLimitConfig.maxHeight_);
|
||||
uint32_t newMinHeight = static_cast<uint32_t>(static_cast<float>(newLimitConfig.minWidth_) /
|
||||
newLimitConfig.maxRatio_);
|
||||
newLimitConfig.minHeight_ = std::max(newMinHeight, newLimitConfig.minHeight_);
|
||||
|
||||
WLOGFI("maxWidth: %{public}u, maxHeight: %{public}u, minWidth: %{public}u, minHeight: %{public}u, "
|
||||
"maxRatio: %{public}f, minRatio: %{public}f", newLimitConfig.maxWidth_, newLimitConfig.maxHeight_,
|
||||
newLimitConfig.minWidth_, newLimitConfig.minHeight_, newLimitConfig.maxRatio_, newLimitConfig.minRatio_);
|
||||
return newLimitConfig;
|
||||
}
|
||||
|
||||
void WindowLayoutPolicy::UpdateFloatingWindowSizeByCustomizedLimits(const sptr<WindowNode>& node,
|
||||
const Rect& displayRect, Rect& winRect) const
|
||||
{
|
||||
// get new limit config with the settings of system and app
|
||||
const auto& customizedLimits = const_cast<WindowLayoutPolicy*>(this)->
|
||||
GetCustomizedLimitsConfig(displayRect, GetVirtualPixelRatio(node->GetDisplayId()));
|
||||
|
||||
// limit minimum and maximum size of floating (not system type) window
|
||||
winRect.width_ = std::max(customizedLimits.minWidth_, winRect.width_);
|
||||
winRect.height_ = std::max(customizedLimits.minHeight_, winRect.height_);
|
||||
winRect.width_ = std::min(customizedLimits.maxWidth_, winRect.width_);
|
||||
winRect.height_ = std::min(customizedLimits.maxHeight_, winRect.height_);
|
||||
WLOGFD("After limit by size, winRect: %{public}d %{public}d %{public}u %{public}u",
|
||||
winRect.posX_, winRect.posY_, winRect.width_, winRect.height_);
|
||||
|
||||
// width and height can not be changed
|
||||
if (customizedLimits.maxWidth_ == customizedLimits.minWidth_ &&
|
||||
customizedLimits.maxHeight_ == customizedLimits.minHeight_) {
|
||||
winRect.width_ = customizedLimits.maxWidth_;
|
||||
winRect.height_ = customizedLimits.maxHeight_;
|
||||
WLOGFD("window rect can not be changed");
|
||||
return;
|
||||
}
|
||||
|
||||
float curRatio = static_cast<float>(winRect.width_) / static_cast<float>(winRect.height_);
|
||||
if ((customizedLimits.minWidth_ <= winRect.width_ && winRect.width_ <= customizedLimits.maxWidth_) &&
|
||||
(customizedLimits.minHeight_ <= winRect.height_ && winRect.height_ <= customizedLimits.maxHeight_) &&
|
||||
(customizedLimits.minRatio_ <= curRatio && curRatio <= customizedLimits.maxRatio_)) {
|
||||
WLOGFD("window size and ratio is satisfied with limit ratio, curSize: [%{public}d, %{public}d], "
|
||||
"curRatio: %{public}f", winRect.width_, winRect.height_, curRatio);
|
||||
return;
|
||||
}
|
||||
|
||||
float newRatio = curRatio < customizedLimits.minRatio_ ? customizedLimits.minRatio_ : customizedLimits.maxRatio_;
|
||||
if (customizedLimits.maxWidth_ == customizedLimits.minWidth_) {
|
||||
winRect.height_ = static_cast<uint32_t>(static_cast<float>(winRect.width_) / newRatio);
|
||||
return;
|
||||
}
|
||||
if (customizedLimits.maxHeight_ == customizedLimits.minHeight_) {
|
||||
winRect.width_ = static_cast<uint32_t>(static_cast<float>(winRect.height_) * newRatio);
|
||||
return;
|
||||
}
|
||||
|
||||
auto dragType = node->GetDragType();
|
||||
if (dragType == DragType::DRAG_HEIGHT) {
|
||||
// if drag height, use height to fix size.
|
||||
winRect.width_ = static_cast<uint32_t>(static_cast<float>(winRect.height_) * newRatio);
|
||||
} else {
|
||||
// if drag width or corner, use width to fix size.
|
||||
winRect.height_ = static_cast<uint32_t>(static_cast<float>(winRect.width_) / newRatio);
|
||||
}
|
||||
WLOGFI("After limit by customize config, winRect: %{public}d %{public}d %{public}u %{public}u",
|
||||
winRect.posX_, winRect.posY_, winRect.width_, winRect.height_);
|
||||
}
|
||||
|
||||
void WindowLayoutPolicy::UpdateFloatingWindowSizeBySystemLimits(const sptr<WindowNode>& node,
|
||||
const Rect& displayRect, Rect& winRect) const
|
||||
{
|
||||
const auto& systemLimits = const_cast<WindowLayoutPolicy*>(this)->
|
||||
GetSystemLimitsConfig(displayRect, GetVirtualPixelRatio(node->GetDisplayId()));
|
||||
|
||||
// limit minimum size of floating (not system type) window
|
||||
if (!WindowHelper::IsSystemWindow(node->GetWindowType())) {
|
||||
winRect.width_ = std::max(systemLimits.minWidth_, winRect.width_);
|
||||
winRect.height_ = std::max(systemLimits.minHeight_, winRect.height_);
|
||||
}
|
||||
// limit maximum size of all floating window
|
||||
winRect.width_ = std::min(systemLimits.maxWidth_, winRect.width_);
|
||||
winRect.height_ = std::min(systemLimits.maxHeight_, winRect.height_);
|
||||
WLOGFI("After limit by system config, winRect: %{public}d %{public}d %{public}u %{public}u",
|
||||
winRect.posX_, winRect.posY_, winRect.width_, winRect.height_);
|
||||
}
|
||||
|
||||
void WindowLayoutPolicy::LimitFloatingWindowSize(const sptr<WindowNode>& node,
|
||||
const Rect& displayRect,
|
||||
Rect& winRect) const
|
||||
{
|
||||
float virtualPixelRatio = GetVirtualPixelRatio(node->GetDisplayId());
|
||||
uint32_t minVerticalFloatingW = static_cast<uint32_t>(MIN_VERTICAL_FLOATING_WIDTH * virtualPixelRatio);
|
||||
uint32_t minVerticalFloatingH = static_cast<uint32_t>(MIN_VERTICAL_FLOATING_HEIGHT * virtualPixelRatio);
|
||||
|
||||
WindowType windowType = node->GetWindowType();
|
||||
WindowMode windowMode = node->GetWindowMode();
|
||||
bool isVertical = (displayRect.height_ > displayRect.width_) ? true : false;
|
||||
|
||||
if (windowMode == WindowMode::WINDOW_MODE_FLOATING) {
|
||||
// limit minimum size of floating (not system type) window
|
||||
if (!WindowHelper::IsSystemWindow(windowType)) {
|
||||
if (isVertical) {
|
||||
winRect.width_ = std::max(minVerticalFloatingW, winRect.width_);
|
||||
winRect.height_ = std::max(minVerticalFloatingH, winRect.height_);
|
||||
} else {
|
||||
winRect.width_ = std::max(minVerticalFloatingH, winRect.width_);
|
||||
winRect.height_ = std::max(minVerticalFloatingW, winRect.height_);
|
||||
}
|
||||
}
|
||||
// limit maximum size of all floating window
|
||||
winRect.width_ = std::min(static_cast<uint32_t>(MAX_FLOATING_SIZE * virtualPixelRatio), winRect.width_);
|
||||
winRect.height_ = std::min(static_cast<uint32_t>(MAX_FLOATING_SIZE * virtualPixelRatio), winRect.height_);
|
||||
if (node->GetWindowMode() != WindowMode::WINDOW_MODE_FLOATING) {
|
||||
return;
|
||||
}
|
||||
Rect oriWinRect = winRect;
|
||||
if (floatingWindowLimitsConfig_.isFloatingWindowLimitsConfigured_ &&
|
||||
(WindowHelper::IsMainFloatingWindow(node->GetWindowType(), node->GetWindowMode()))) {
|
||||
UpdateFloatingWindowSizeByCustomizedLimits(node, displayRect, winRect);
|
||||
} else {
|
||||
UpdateFloatingWindowSizeBySystemLimits(node, displayRect, winRect);
|
||||
}
|
||||
|
||||
// fix size in case of moving window when dragging
|
||||
const auto& lastWinRect = node->GetWindowRect();
|
||||
if (node->GetWindowSizeChangeReason() == WindowSizeChangeReason::DRAG) {
|
||||
if (oriWinRect.posX_ != lastWinRect.posX_) {
|
||||
winRect.posX_ = oriWinRect.posX_ + static_cast<int32_t>(oriWinRect.width_) -
|
||||
static_cast<int32_t>(winRect.width_);
|
||||
}
|
||||
if (oriWinRect.posY_ != lastWinRect.posY_) {
|
||||
winRect.posY_ = oriWinRect.posY_ + static_cast<int32_t>(oriWinRect.height_) -
|
||||
static_cast<int32_t>(winRect.height_);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WindowLayoutPolicy::LimitMainFloatingWindowPosition(const sptr<WindowNode>& node, Rect& winRect) const
|
||||
{
|
||||
if (!WindowHelper::IsMainFloatingWindow(node->GetWindowType(), node->GetWindowMode())) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto reason = node->GetWindowSizeChangeReason();
|
||||
// if drag or move window, limit size and position
|
||||
if (reason == WindowSizeChangeReason::DRAG) {
|
||||
LimitWindowPositionWhenDrag(node, winRect);
|
||||
if (floatingWindowLimitsConfig_.isFloatingWindowLimitsConfigured_ &&
|
||||
(WindowHelper::IsMainFloatingWindow(node->GetWindowType(), node->GetWindowMode()))) {
|
||||
const auto& limitConfig = const_cast<WindowLayoutPolicy*>(this)-> GetCustomizedLimitsConfig(
|
||||
displayGroupInfo_->GetDisplayRect(node->GetDisplayId()), GetVirtualPixelRatio(node->GetDisplayId()));
|
||||
const_cast<WindowLayoutPolicy*>(this)->
|
||||
FixWindowSizeByRatioIfDragBeyondLimitRegion(node, winRect, limitConfig);
|
||||
}
|
||||
} else {
|
||||
// Limit window position, such as init window rect when show
|
||||
LimitWindowPositionWhenInitRectOrMove(node, winRect);
|
||||
}
|
||||
}
|
||||
|
||||
void WindowLayoutPolicy::LimitWindowPositionWhenDrag(const sptr<WindowNode>& node,
|
||||
Rect& winRect) const
|
||||
{
|
||||
float virtualPixelRatio = GetVirtualPixelRatio(node->GetDisplayId());
|
||||
uint32_t windowTitleBarH = static_cast<uint32_t>(WINDOW_TITLE_BAR_HEIGHT * virtualPixelRatio);
|
||||
const Rect& lastRect = node->GetWindowRect();
|
||||
Rect oriWinRect = winRect;
|
||||
|
||||
Rect limitRect = isMultiDisplay_ ? displayGroupLimitRect_ : limitRectMap_[node->GetDisplayId()];
|
||||
int32_t limitMinPosX = limitRect.posX_ + static_cast<int32_t>(windowTitleBarH);
|
||||
int32_t limitMaxPosX = limitRect.posX_ + static_cast<int32_t>(limitRect.width_ - windowTitleBarH);
|
||||
int32_t limitMinPosY = limitRect.posY_;
|
||||
int32_t limitMaxPosY = limitRect.posY_ + static_cast<int32_t>(limitRect.height_ - windowTitleBarH);
|
||||
|
||||
Rect dockWinRect;
|
||||
DockWindowShowState dockShownState = GetDockWindowShowState(node->GetDisplayId(), dockWinRect);
|
||||
if (dockShownState == DockWindowShowState::SHOWN_IN_BOTTOM) {
|
||||
WLOGFD("dock window show in bottom");
|
||||
limitMaxPosY = dockWinRect.posY_ - static_cast<int32_t>(windowTitleBarH);
|
||||
} else if (dockShownState == DockWindowShowState::SHOWN_IN_LEFT) {
|
||||
WLOGFD("dock window show in left");
|
||||
limitMinPosX = dockWinRect.posX_ + static_cast<int32_t>(dockWinRect.width_ + windowTitleBarH);
|
||||
} else if (dockShownState == DockWindowShowState::SHOWN_IN_RIGHT) {
|
||||
WLOGFD("dock window show in right");
|
||||
limitMaxPosX = dockWinRect.posX_ - static_cast<int32_t>(windowTitleBarH);
|
||||
}
|
||||
|
||||
// limitMinPosX is minimum (x + width)
|
||||
if (oriWinRect.posX_ + static_cast<int32_t>(oriWinRect.width_) < limitMinPosX) {
|
||||
if (oriWinRect.width_ != lastRect.width_) {
|
||||
winRect.width_ = static_cast<uint32_t>(limitMinPosX - oriWinRect.posX_);
|
||||
}
|
||||
}
|
||||
// maximum position x
|
||||
if (oriWinRect.posX_ > limitMaxPosX) {
|
||||
winRect.posX_ = limitMaxPosX;
|
||||
if (oriWinRect.width_ != lastRect.width_) {
|
||||
winRect.width_ = oriWinRect.posX_ + static_cast<int32_t>(oriWinRect.width_) - winRect.posX_;
|
||||
}
|
||||
}
|
||||
// minimum position y
|
||||
if (oriWinRect.posY_ < limitMinPosY) {
|
||||
winRect.posY_ = limitMinPosY;
|
||||
if (oriWinRect.height_ != lastRect.height_) {
|
||||
winRect.height_ = oriWinRect.posY_ + static_cast<int32_t>(oriWinRect.height_) - winRect.posY_;
|
||||
}
|
||||
}
|
||||
// maximum position y
|
||||
if (winRect.posY_ > limitMaxPosY) {
|
||||
winRect.posY_ = limitMaxPosY;
|
||||
if (oriWinRect.height_ != lastRect.height_) {
|
||||
winRect.height_ = oriWinRect.posY_ + static_cast<int32_t>(oriWinRect.height_) - winRect.posY_;
|
||||
}
|
||||
}
|
||||
WLOGFI("After limit by position, winRect: %{public}d %{public}d %{public}u %{public}u",
|
||||
winRect.posX_, winRect.posY_, winRect.width_, winRect.height_);
|
||||
}
|
||||
|
||||
void WindowLayoutPolicy::LimitWindowPositionWhenInitRectOrMove(const sptr<WindowNode>& node, Rect& winRect) const
|
||||
{
|
||||
float virtualPixelRatio = GetVirtualPixelRatio(node->GetDisplayId());
|
||||
uint32_t windowTitleBarH = static_cast<uint32_t>(WINDOW_TITLE_BAR_HEIGHT * virtualPixelRatio);
|
||||
|
||||
Rect limitRect;
|
||||
// if is corss-display window, the limit rect should be full limitRect
|
||||
if (node->isShowingOnMultiDisplays_) {
|
||||
limitRect = displayGroupLimitRect_;
|
||||
} else {
|
||||
limitRect = limitRectMap_[node->GetDisplayId()];
|
||||
}
|
||||
|
||||
// limit position of the main floating window(window which support dragging)
|
||||
if (WindowHelper::IsMainFloatingWindow(node->GetWindowType(), node->GetWindowMode())) {
|
||||
Rect dockWinRect;
|
||||
DockWindowShowState dockShownState = GetDockWindowShowState(node->GetDisplayId(), dockWinRect);
|
||||
winRect.posY_ = std::max(limitRect.posY_, winRect.posY_);
|
||||
winRect.posY_ = std::min(limitRect.posY_ + static_cast<int32_t>(limitRect.height_ - windowTitleBarH),
|
||||
winRect.posY_);
|
||||
if (dockShownState == DockWindowShowState::SHOWN_IN_BOTTOM) {
|
||||
WLOGFD("dock window show in bottom");
|
||||
winRect.posY_ = std::min(dockWinRect.posY_ + static_cast<int32_t>(dockWinRect.height_ - windowTitleBarH),
|
||||
winRect.posY_);
|
||||
}
|
||||
winRect.posX_ = std::max(limitRect.posX_ + static_cast<int32_t>(windowTitleBarH - winRect.width_),
|
||||
winRect.posX_);
|
||||
if (dockShownState == DockWindowShowState::SHOWN_IN_LEFT) {
|
||||
WLOGFD("dock window show in left");
|
||||
winRect.posX_ = std::max(static_cast<int32_t>(dockWinRect.width_ + windowTitleBarH - winRect.width_),
|
||||
winRect.posX_);
|
||||
}
|
||||
winRect.posX_ = std::min(limitRect.posX_ + static_cast<int32_t>(limitRect.width_ - windowTitleBarH),
|
||||
winRect.posX_);
|
||||
if (dockShownState == DockWindowShowState::SHOWN_IN_RIGHT) {
|
||||
WLOGFD("dock window show in right");
|
||||
winRect.posX_ = std::min(dockWinRect.posX_ - static_cast<int32_t>(windowTitleBarH),
|
||||
winRect.posX_);
|
||||
}
|
||||
}
|
||||
WLOGFI("After limit by position if init or move, winRect: %{public}d %{public}d %{public}u %{public}u",
|
||||
winRect.posX_, winRect.posY_, winRect.width_, winRect.height_);
|
||||
}
|
||||
|
||||
DockWindowShowState WindowLayoutPolicy::GetDockWindowShowState(DisplayId displayId, Rect& dockWinRect) const
|
||||
@@ -501,84 +829,6 @@ DockWindowShowState WindowLayoutPolicy::GetDockWindowShowState(DisplayId display
|
||||
return DockWindowShowState::NOT_SHOWN;
|
||||
}
|
||||
|
||||
void WindowLayoutPolicy::LimitMainFloatingWindowPositionWithDrag(const sptr<WindowNode>& node, Rect& winRect) const
|
||||
{
|
||||
if (WindowHelper::IsMainFloatingWindow(node->GetWindowType(), node->GetWindowMode())) {
|
||||
float virtualPixelRatio = GetVirtualPixelRatio(node->GetDisplayId());
|
||||
uint32_t windowTitleBarH = static_cast<uint32_t>(WINDOW_TITLE_BAR_HEIGHT * virtualPixelRatio);
|
||||
const Rect lastRect = node->GetWindowRect();
|
||||
// fix rect in case of moving window when dragging
|
||||
winRect = WindowHelper::GetFixedWindowRectByLimitSize(winRect, lastRect,
|
||||
IsVerticalDisplay(node->GetDisplayId()), virtualPixelRatio);
|
||||
|
||||
// if is mutiDisplay, the limit rect should be full limitRect when move or drag
|
||||
Rect limitRect;
|
||||
if (isMultiDisplay_) {
|
||||
limitRect = displayGroupLimitRect_;
|
||||
} else {
|
||||
limitRect = limitRectMap_[node->GetDisplayId()];
|
||||
}
|
||||
winRect = WindowHelper::GetFixedWindowRectByLimitPosition(winRect, lastRect,
|
||||
virtualPixelRatio, limitRect);
|
||||
Rect dockWinRect;
|
||||
DockWindowShowState dockShownState = GetDockWindowShowState(node->GetDisplayId(), dockWinRect);
|
||||
if (dockShownState == DockWindowShowState::SHOWN_IN_BOTTOM) {
|
||||
WLOGFI("dock window show in bottom");
|
||||
winRect.posY_ = std::min(dockWinRect.posY_ - static_cast<int32_t>(windowTitleBarH), winRect.posY_);
|
||||
} else if (dockShownState == DockWindowShowState::SHOWN_IN_LEFT) {
|
||||
WLOGFI("dock window show in left");
|
||||
winRect.posX_ = std::max(static_cast<int32_t>(dockWinRect.width_ + windowTitleBarH - winRect.width_),
|
||||
winRect.posX_);
|
||||
} else if (dockShownState == DockWindowShowState::SHOWN_IN_RIGHT) {
|
||||
WLOGFI("dock window show in right");
|
||||
winRect.posX_ = std::min(dockWinRect.posX_ - static_cast<int32_t>(windowTitleBarH),
|
||||
winRect.posX_);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void WindowLayoutPolicy::LimitMainFloatingWindowPosition(const sptr<WindowNode>& node, Rect& winRect) const
|
||||
{
|
||||
float virtualPixelRatio = GetVirtualPixelRatio(node->GetDisplayId());
|
||||
uint32_t windowTitleBarH = static_cast<uint32_t>(WINDOW_TITLE_BAR_HEIGHT * virtualPixelRatio);
|
||||
|
||||
Rect limitRect;
|
||||
// if is corss-display window, the limit rect should be full limitRect
|
||||
if (node->isShowingOnMultiDisplays_) {
|
||||
limitRect = displayGroupLimitRect_;
|
||||
} else {
|
||||
limitRect = limitRectMap_[node->GetDisplayId()];
|
||||
}
|
||||
|
||||
// limit position of the main floating window(window which support dragging)
|
||||
if (WindowHelper::IsMainFloatingWindow(node->GetWindowType(), node->GetWindowMode())) {
|
||||
Rect dockWinRect;
|
||||
DockWindowShowState dockShownState = GetDockWindowShowState(node->GetDisplayId(), dockWinRect);
|
||||
winRect.posY_ = std::max(limitRect.posY_, winRect.posY_);
|
||||
winRect.posY_ = std::min(limitRect.posY_ + static_cast<int32_t>(limitRect.height_ - windowTitleBarH),
|
||||
winRect.posY_);
|
||||
if (dockShownState == DockWindowShowState::SHOWN_IN_BOTTOM) {
|
||||
WLOGFI("dock window show in bottom");
|
||||
winRect.posY_ = std::min(dockWinRect.posY_ + static_cast<int32_t>(dockWinRect.height_ - windowTitleBarH),
|
||||
winRect.posY_);
|
||||
}
|
||||
winRect.posX_ = std::max(limitRect.posX_ + static_cast<int32_t>(windowTitleBarH - winRect.width_),
|
||||
winRect.posX_);
|
||||
if (dockShownState == DockWindowShowState::SHOWN_IN_LEFT) {
|
||||
WLOGFI("dock window show in left");
|
||||
winRect.posX_ = std::max(static_cast<int32_t>(dockWinRect.width_ + windowTitleBarH - winRect.width_),
|
||||
winRect.posX_);
|
||||
}
|
||||
winRect.posX_ = std::min(limitRect.posX_ + static_cast<int32_t>(limitRect.width_ - windowTitleBarH),
|
||||
winRect.posX_);
|
||||
if (dockShownState == DockWindowShowState::SHOWN_IN_RIGHT) {
|
||||
WLOGFI("dock window show in right");
|
||||
winRect.posX_ = std::min(dockWinRect.posX_ - static_cast<int32_t>(windowTitleBarH),
|
||||
winRect.posX_);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AvoidPosType WindowLayoutPolicy::GetAvoidPosType(const Rect& rect, DisplayId displayId) const
|
||||
{
|
||||
const auto& displayRectMap = displayGroupInfo_->GetAllDisplayRects();
|
||||
@@ -676,5 +926,10 @@ Rect WindowLayoutPolicy::GetDisplayGroupRect() const
|
||||
{
|
||||
return displayGroupRect_;
|
||||
}
|
||||
|
||||
void WindowLayoutPolicy::SetFloatingWindowLimitsConfig(const FloatingWindowLimitsConfig& floatingWindowLimitsConfig)
|
||||
{
|
||||
floatingWindowLimitsConfig_ = floatingWindowLimitsConfig;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -247,20 +247,12 @@ void WindowLayoutPolicyCascade::ApplyWindowRectConstraints(const sptr<WindowNode
|
||||
{
|
||||
WLOGFI("Before apply constraints winRect:[%{public}d, %{public}d, %{public}u, %{public}u]",
|
||||
winRect.posX_, winRect.posY_, winRect.width_, winRect.height_);
|
||||
auto reason = node->GetWindowSizeChangeReason();
|
||||
|
||||
if (node->GetWindowType() == WindowType::WINDOW_TYPE_DOCK_SLICE) { // if divider, limit position
|
||||
LimitMoveBounds(winRect, node->GetDisplayId());
|
||||
}
|
||||
|
||||
// if drag or move window, limit size and position
|
||||
if (reason == WindowSizeChangeReason::DRAG || reason == WindowSizeChangeReason::MOVE) {
|
||||
LimitMainFloatingWindowPositionWithDrag(node, winRect);
|
||||
} else {
|
||||
// Limit window to the maximum window size if size change is other reason, such as init window rect when show
|
||||
LimitFloatingWindowSize(node, displayGroupInfo_->GetDisplayRect(node->GetDisplayId()), winRect);
|
||||
LimitMainFloatingWindowPosition(node, winRect);
|
||||
}
|
||||
LimitFloatingWindowSize(node, displayGroupInfo_->GetDisplayRect(node->GetDisplayId()), winRect);
|
||||
LimitMainFloatingWindowPosition(node, winRect);
|
||||
|
||||
WLOGFI("After apply constraints winRect:[%{public}d, %{public}d, %{public}u, %{public}u]",
|
||||
winRect.posX_, winRect.posY_, winRect.width_, winRect.height_);
|
||||
|
||||
@@ -24,7 +24,8 @@ namespace {
|
||||
}
|
||||
|
||||
std::map<std::string, bool> WindowManagerConfig::enableConfig_;
|
||||
std::map<std::string, std::vector<int>> WindowManagerConfig::numbersConfig_;
|
||||
std::map<std::string, std::vector<int>> WindowManagerConfig::intNumbersConfig_;
|
||||
std::map<std::string, std::vector<float>> WindowManagerConfig::floatNumbersConfig_;
|
||||
|
||||
bool WindowManagerConfig::LoadConfigXml(const std::string& configFilePath)
|
||||
{
|
||||
@@ -57,8 +58,14 @@ bool WindowManagerConfig::LoadConfigXml(const std::string& configFilePath)
|
||||
continue;
|
||||
}
|
||||
if (!xmlStrcmp(nodeName, reinterpret_cast<const xmlChar*>("maxAppWindowNumber")) ||
|
||||
!xmlStrcmp(nodeName, reinterpret_cast<const xmlChar*>("modeChangeHotZones"))) {
|
||||
ReadNumbersConfigInfo(curNodePtr);
|
||||
!xmlStrcmp(nodeName, reinterpret_cast<const xmlChar*>("modeChangeHotZones")) ||
|
||||
!xmlStrcmp(nodeName, reinterpret_cast<const xmlChar*>("floatingWindowLimitSize"))) {
|
||||
ReadIntNumbersConfigInfo(curNodePtr);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!xmlStrcmp(nodeName, reinterpret_cast<const xmlChar*>("floatingWindowLimitRatio"))) {
|
||||
ReadFloatNumbersConfigInfo(curNodePtr);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -91,7 +98,7 @@ void WindowManagerConfig::ReadEnableConfigInfo(const xmlNodePtr& currNode)
|
||||
xmlFree(enable);
|
||||
}
|
||||
|
||||
void WindowManagerConfig::ReadNumbersConfigInfo(const xmlNodePtr& currNode)
|
||||
void WindowManagerConfig::ReadIntNumbersConfigInfo(const xmlNodePtr& currNode)
|
||||
{
|
||||
xmlChar* context = xmlNodeGetContent(currNode);
|
||||
if (context == nullptr) {
|
||||
@@ -104,15 +111,41 @@ void WindowManagerConfig::ReadNumbersConfigInfo(const xmlNodePtr& currNode)
|
||||
auto numbers = WindowHelper::Split(numbersStr, " ");
|
||||
for (auto& num : numbers) {
|
||||
if (!WindowHelper::IsNumber(num)) {
|
||||
WLOGFE("[WmConfig] read number error: nodeName:(%{public}s)", currNode->name);
|
||||
WLOGFE("[WmConfig] read int number error: nodeName:(%{public}s)", currNode->name);
|
||||
xmlFree(context);
|
||||
return;
|
||||
}
|
||||
|
||||
numbersVec.emplace_back(std::stoi(num));
|
||||
}
|
||||
|
||||
std::string nodeName = reinterpret_cast<const char *>(currNode->name);
|
||||
numbersConfig_[nodeName] = numbersVec;
|
||||
intNumbersConfig_[nodeName] = numbersVec;
|
||||
xmlFree(context);
|
||||
}
|
||||
|
||||
void WindowManagerConfig::ReadFloatNumbersConfigInfo(const xmlNodePtr& currNode)
|
||||
{
|
||||
xmlChar* context = xmlNodeGetContent(currNode);
|
||||
if (context == nullptr) {
|
||||
WLOGFE("[WmConfig] read xml node error: nodeName:(%{public}s)", currNode->name);
|
||||
return;
|
||||
}
|
||||
|
||||
std::vector<float> numbersVec;
|
||||
std::string numbersStr = reinterpret_cast<const char*>(context);
|
||||
auto numbers = WindowHelper::Split(numbersStr, " ");
|
||||
for (auto& num : numbers) {
|
||||
if (!WindowHelper::IsFloatingNumber(num)) {
|
||||
WLOGFE("[WmConfig] read float number error: nodeName:(%{public}s)", currNode->name);
|
||||
xmlFree(context);
|
||||
return;
|
||||
}
|
||||
numbersVec.emplace_back(std::stof(num));
|
||||
}
|
||||
|
||||
std::string nodeName = reinterpret_cast<const char *>(currNode->name);
|
||||
floatNumbersConfig_[nodeName] = numbersVec;
|
||||
xmlFree(context);
|
||||
}
|
||||
|
||||
@@ -121,9 +154,14 @@ const std::map<std::string, bool>& WindowManagerConfig::GetEnableConfig()
|
||||
return enableConfig_;
|
||||
}
|
||||
|
||||
const std::map<std::string, std::vector<int>>& WindowManagerConfig::GetNumbersConfig()
|
||||
const std::map<std::string, std::vector<int>>& WindowManagerConfig::GetIntNumbersConfig()
|
||||
{
|
||||
return numbersConfig_;
|
||||
return intNumbersConfig_;
|
||||
}
|
||||
|
||||
const std::map<std::string, std::vector<float>>& WindowManagerConfig::GetFloatNumbersConfig()
|
||||
{
|
||||
return floatNumbersConfig_;
|
||||
}
|
||||
|
||||
void WindowManagerConfig::DumpConfig()
|
||||
@@ -132,12 +170,19 @@ void WindowManagerConfig::DumpConfig()
|
||||
WLOGFI("[WmConfig] Enable: %{public}s %{public}u", enable.first.c_str(), enable.second);
|
||||
}
|
||||
|
||||
for (auto& numbers : numbersConfig_) {
|
||||
WLOGFI("[WmConfig] Numbers: %{public}s %{public}zu", numbers.first.c_str(), numbers.second.size());
|
||||
for (auto& numbers : intNumbersConfig_) {
|
||||
WLOGFI("[WmConfig] Int numbers: %{public}s %{public}zu", numbers.first.c_str(), numbers.second.size());
|
||||
for (auto& num : numbers.second) {
|
||||
WLOGFI("[WmConfig] Num: %{public}d", num);
|
||||
}
|
||||
}
|
||||
|
||||
for (auto& numbers : floatNumbersConfig_) {
|
||||
WLOGFI("[WmConfig] Float numbers: %{public}s %{public}zu", numbers.first.c_str(), numbers.second.size());
|
||||
for (auto& num : numbers.second) {
|
||||
WLOGFI("[WmConfig] Num: %{public}f", num);
|
||||
}
|
||||
}
|
||||
}
|
||||
} // namespace Rosen
|
||||
} // namespace OHOS
|
||||
|
||||
@@ -195,7 +195,8 @@ int WindowManagerService::Dump(int fd, const std::vector<std::u16string>& args)
|
||||
void WindowManagerService::ConfigureWindowManagerService()
|
||||
{
|
||||
const auto& enableConfig = WindowManagerConfig::GetEnableConfig();
|
||||
const auto& numbersConfig = WindowManagerConfig::GetNumbersConfig();
|
||||
const auto& intNumbersConfig = WindowManagerConfig::GetIntNumbersConfig();
|
||||
const auto& floatNumbersConfig = WindowManagerConfig::GetFloatNumbersConfig();
|
||||
|
||||
if (enableConfig.count("decor") != 0) {
|
||||
systemConfig_.isSystemDecorEnable_ = enableConfig.at("decor");
|
||||
@@ -209,15 +210,15 @@ void WindowManagerService::ConfigureWindowManagerService()
|
||||
systemConfig_.isStretchable_ = enableConfig.at("stretchable");
|
||||
}
|
||||
|
||||
if (numbersConfig.count("maxAppWindowNumber") != 0) {
|
||||
auto numbers = numbersConfig.at("maxAppWindowNumber");
|
||||
if (intNumbersConfig.count("maxAppWindowNumber") != 0) {
|
||||
auto numbers = intNumbersConfig.at("maxAppWindowNumber");
|
||||
if (numbers.size() == 1) {
|
||||
windowRoot_->SetMaxAppWindowNumber(numbers[0]);
|
||||
}
|
||||
}
|
||||
|
||||
if (numbersConfig.count("modeChangeHotZones") != 0) {
|
||||
auto numbers = numbersConfig.at("modeChangeHotZones");
|
||||
if (intNumbersConfig.count("modeChangeHotZones") != 0) {
|
||||
auto numbers = intNumbersConfig.at("modeChangeHotZones");
|
||||
if (numbers.size() == 3) { // 3 hot zones
|
||||
hotZonesConfig_.fullscreenRange_ = static_cast<uint32_t>(numbers[0]); // 0 fullscreen
|
||||
hotZonesConfig_.primaryRange_ = static_cast<uint32_t>(numbers[1]); // 1 primary
|
||||
@@ -225,6 +226,30 @@ void WindowManagerService::ConfigureWindowManagerService()
|
||||
hotZonesConfig_.isModeChangeHotZoneConfigured_ = true;
|
||||
}
|
||||
}
|
||||
|
||||
FloatingWindowLimitsConfig floatingWindowLimitsConfig;
|
||||
|
||||
if (intNumbersConfig.count("floatingWindowLimitSize") != 0) {
|
||||
auto numbers = intNumbersConfig.at("floatingWindowLimitSize");
|
||||
if (numbers.size() == 4) { // 4, limitSize
|
||||
floatingWindowLimitsConfig.maxWidth_ = static_cast<uint32_t>(numbers[0]); // 0 max width
|
||||
floatingWindowLimitsConfig.maxHeight_ = static_cast<uint32_t>(numbers[1]); // 1 max height
|
||||
floatingWindowLimitsConfig.minWidth_ = static_cast<uint32_t>(numbers[2]); // 2 min width
|
||||
floatingWindowLimitsConfig.minHeight_ = static_cast<uint32_t>(numbers[3]); // 3 min height
|
||||
floatingWindowLimitsConfig.isFloatingWindowLimitsConfigured_ = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (floatNumbersConfig.count("floatingWindowLimitRatio") != 0) {
|
||||
auto numbers = floatNumbersConfig.at("floatingWindowLimitRatio");
|
||||
if (numbers.size() == 2) { // 2, limitRatio
|
||||
floatingWindowLimitsConfig.maxRatio_ = static_cast<float>(numbers[0]); // 0 max ratio
|
||||
floatingWindowLimitsConfig.minRatio_ = static_cast<float>(numbers[1]); // 1 min ratio
|
||||
floatingWindowLimitsConfig.isFloatingWindowLimitsConfigured_ = true;
|
||||
}
|
||||
}
|
||||
|
||||
windowRoot_->SetFloatingWindowLimitsConfig(floatingWindowLimitsConfig);
|
||||
}
|
||||
|
||||
void WindowManagerService::OnStop()
|
||||
|
||||
@@ -188,6 +188,16 @@ void WindowNode::SetCallingUid(int32_t uid)
|
||||
callingUid_ = uid;
|
||||
}
|
||||
|
||||
void WindowNode::SetDragType(DragType dragType)
|
||||
{
|
||||
property_->SetDragType(dragType);
|
||||
}
|
||||
|
||||
DragType WindowNode::GetDragType() const
|
||||
{
|
||||
return property_->GetDragType();
|
||||
}
|
||||
|
||||
DisplayId WindowNode::GetDisplayId() const
|
||||
{
|
||||
return property_->GetDisplayId();
|
||||
|
||||
@@ -97,6 +97,11 @@ sptr<WindowNodeContainer> WindowRoot::CreateWindowNodeContainer(DisplayId displa
|
||||
windowNodeContainerMap_.insert(std::make_pair(displayGroupId, container));
|
||||
std::vector<DisplayId> displayVec = { displayId };
|
||||
displayIdMap_.insert(std::make_pair(displayGroupId, displayVec));
|
||||
if (container == nullptr) {
|
||||
WLOGFE("create container failed, displayId :%{public}" PRIu64 "", displayId);
|
||||
return nullptr;
|
||||
}
|
||||
container->GetLayoutPolicy()->SetFloatingWindowLimitsConfig(floatingWindowLimitsConfig_);
|
||||
return container;
|
||||
}
|
||||
|
||||
@@ -1157,5 +1162,10 @@ WMError WindowRoot::GetModeChangeHotZones(DisplayId displayId,
|
||||
container->GetModeChangeHotZones(displayId, hotZones, config);
|
||||
return WMError::WM_OK;
|
||||
}
|
||||
|
||||
void WindowRoot::SetFloatingWindowLimitsConfig(const FloatingWindowLimitsConfig& floatingWindowLimitsConfig)
|
||||
{
|
||||
floatingWindowLimitsConfig_ = floatingWindowLimitsConfig;
|
||||
}
|
||||
} // namespace Rosen
|
||||
} // namespace OHOS
|
||||
|
||||
Reference in New Issue
Block a user