diff --git a/interfaces/innerkits/wm/wm_common.h b/interfaces/innerkits/wm/wm_common.h index 7d28807b4ddd56e17563a73af6e25f07b4857898..7057ed371baa7ad91344f6c64c05142cf031af56 100644 --- a/interfaces/innerkits/wm/wm_common.h +++ b/interfaces/innerkits/wm/wm_common.h @@ -1162,10 +1162,10 @@ struct WindowLimits { * @brief An area of title buttons relative to the upper right corner of the window. */ struct TitleButtonRect { - int32_t posX_; - int32_t posY_; - uint32_t width_; - uint32_t height_; + int32_t posX_ = 0; + int32_t posY_ = 0; + uint32_t width_ = 0; + uint32_t height_ = 0; bool operator==(const TitleButtonRect& a) const { @@ -1177,6 +1177,14 @@ struct TitleButtonRect { return !this->operator==(a); } + void ResetRect() + { + posX_ = 0; + posY_ = 0; + width_ = 0; + height_ = 0; + } + bool IsUninitializedRect() const { return (posX_ == 0 && posY_ == 0 && width_ == 0 && height_ == 0); diff --git a/previewer/include/wm_common.h b/previewer/include/wm_common.h index 9bf543cd3ce23dc0bf14b9c9881c92eba31a90cd..42a6f43a591e0a7b1a3108d300e0f9d607a4bd25 100644 --- a/previewer/include/wm_common.h +++ b/previewer/include/wm_common.h @@ -770,10 +770,10 @@ struct WindowLimits { * @brief An area of title buttons relative to the upper right corner of the window. */ struct TitleButtonRect { - int32_t posX_; - int32_t posY_; - uint32_t width_; - uint32_t height_; + int32_t posX_ = 0; + int32_t posY_ = 0; + uint32_t width_ = 0; + uint32_t height_ = 0; bool operator==(const TitleButtonRect& a) const { @@ -785,6 +785,14 @@ struct TitleButtonRect { return !this->operator==(a); } + void ResetRect() + { + posX_ = 0; + posY_ = 0; + width_ = 0; + height_ = 0; + } + bool IsInsideOf(const TitleButtonRect& a) const { return (posX_ >= a.posX_ && posY_ >= a.posY_ && diff --git a/wm/src/window_session_impl.cpp b/wm/src/window_session_impl.cpp index 92cc54c1f798c631e5a38f573ef6016233569b9e..578fdea3b371983c1928e41fe5d905fba1299271 100644 --- a/wm/src/window_session_impl.cpp +++ b/wm/src/window_session_impl.cpp @@ -56,6 +56,7 @@ namespace Rosen { namespace { constexpr HiviewDFX::HiLogLabel LABEL = {LOG_CORE, HILOG_DOMAIN_WINDOW, "WindowSessionImpl"}; constexpr int32_t FORCE_SPLIT_MODE = 5; +constexpr int32_t API_VERSION_15 = 15; /** * DFX @@ -2294,7 +2295,9 @@ WMError WindowSessionImpl::GetTitleButtonArea(TitleButtonRect& titleButtonRect) res = uiContent->GetContainerModalButtonsRect(decorRect, titleButtonLeftRect); if (!res) { TLOGE(WmsLogTag::WMS_DECOR, "GetContainerModalButtonsRect failed"); - titleButtonRect.IsUninitializedRect(); + if (GetTargetAPIVersion() >= API_VERSION_15) { // 15: isolated version + titleButtonRect.ResetRect(); + } return WMError::WM_OK; } float vpr = 0.f; @@ -2352,12 +2355,17 @@ WMError WindowSessionImpl::RegisterWindowTitleButtonRectChangeListener( TLOGNE(WmsLogTag::WMS_DECOR, "%{public}s window is null", where); return; } + TitleButtonRect titleButtonRect; + if (window->GetTargetAPIVersion() >= API_VERSION_15 && // 15: isolated version + titleButtonLeftRect.IsUninitializedRect()) { + window->NotifyWindowTitleButtonRectChange(titleButtonRect); + return; + } float vpr = 0.f; auto err = window->GetVirtualPixelRatio(vpr); if (err != WMError::WM_OK) { return; } - TitleButtonRect titleButtonRect; titleButtonRect.posX_ = static_cast(decorRect.width_) - static_cast(titleButtonLeftRect.width_) - titleButtonLeftRect.posX_; titleButtonRect.posX_ = static_cast(titleButtonRect.posX_ / vpr); diff --git a/wm/test/unittest/window_session_impl_test2.cpp b/wm/test/unittest/window_session_impl_test2.cpp index 4938d574e900295a498cdbd18383ddb2d2f16ac3..ab99690e0e3be662031cbc186df2b599f23f5978 100644 --- a/wm/test/unittest/window_session_impl_test2.cpp +++ b/wm/test/unittest/window_session_impl_test2.cpp @@ -1060,6 +1060,32 @@ HWTEST_F(WindowSessionImplTest2, GetTitleButtonArea02, Function | SmallTest | Le window->Destroy(); } +/** + * @tc.name: GetTitleButtonArea03 + * @tc.desc: GetTitleButtonArea + * @tc.type: FUNC + */ +HWTEST_F(WindowSessionImplTest2, GetTitleButtonArea03, Function | SmallTest | Level2) +{ + auto window = GetTestWindowImpl("GetTitleButtonArea03"); + ASSERT_NE(window, nullptr); + TitleButtonRect titleButtonRect = { 1400, 0, 0, 0 }; + window->property_->SetPersistentId(1); + window->property_->SetDisplayId(0); + window->windowSystemConfig_.windowUIType_ = WindowUIType::PC_WINDOW; + auto uiContent = std::make_unique(); + EXPECT_CALL(*uiContent, GetContainerModalButtonsRect(testing::_, testing::_)).WillRepeatedly(Return(false)); + window->uiContent_ = std::move(uiContent); + window->SetTargetAPIVersion(14); + EXPECT_EQ(window->GetTitleButtonArea(titleButtonRect), WMError::WM_OK); + EXPECT_EQ(titleButtonRect.IsUninitializedRect(), false); + + window->SetTargetAPIVersion(15); + EXPECT_EQ(window->GetTitleButtonArea(titleButtonRect), WMError::WM_OK); + EXPECT_EQ(titleButtonRect.IsUninitializedRect(), true); + window->Destroy(); +} + /** * @tc.name: RegisterWindowTitleButtonRectChangeListener * @tc.desc: RegisterWindowTitleButtonRectChangeListener