diff --git a/interfaces/innerkits/wm/window.h b/interfaces/innerkits/wm/window.h index ceee30f8..9e18854e 100644 --- a/interfaces/innerkits/wm/window.h +++ b/interfaces/innerkits/wm/window.h @@ -44,6 +44,7 @@ class RSSurfaceNode; class IWindowChangeListener : virtual public RefBase { public: virtual void OnSizeChange(Rect rect, WindowSizeChangeReason reason) = 0; + virtual void OnModeChange(WindowMode mode) = 0; }; class IAvoidAreaChangedListener : virtual public RefBase { diff --git a/interfaces/kits/napi/window_runtime/window_napi/js_window_listener.cpp b/interfaces/kits/napi/window_runtime/window_napi/js_window_listener.cpp index 650bd200..12965115 100644 --- a/interfaces/kits/napi/window_runtime/window_napi/js_window_listener.cpp +++ b/interfaces/kits/napi/window_runtime/window_napi/js_window_listener.cpp @@ -105,6 +105,11 @@ void JsWindowListener::OnSizeChange(Rect rect, WindowSizeChangeReason reason) AsyncTask::Schedule(*engine_, std::make_unique(callback, std::move(execute), std::move(complete))); } +void JsWindowListener::OnModeChange(WindowMode mode) +{ + WLOGFI("JsWindowListener::OnModeChange is called"); +} + void JsWindowListener::OnSystemBarPropertyChange(DisplayId displayId, const SystemBarRegionTints& tints) { std::lock_guard lock(mtx_); diff --git a/interfaces/kits/napi/window_runtime/window_napi/js_window_listener.h b/interfaces/kits/napi/window_runtime/window_napi/js_window_listener.h index ddf517b4..4f32abdd 100644 --- a/interfaces/kits/napi/window_runtime/window_napi/js_window_listener.h +++ b/interfaces/kits/napi/window_runtime/window_napi/js_window_listener.h @@ -43,6 +43,7 @@ public: void RemoveCallback(NativeValue* jsListenerObject); void OnSystemBarPropertyChange(DisplayId displayId, const SystemBarRegionTints& tints) override; void OnSizeChange(Rect rect, WindowSizeChangeReason reason) override; + void OnModeChange(WindowMode mode) override; void OnAvoidAreaChanged(std::vector avoidAreas) override; private: diff --git a/wm/src/window_impl.cpp b/wm/src/window_impl.cpp index c815564e..6fb7504d 100644 --- a/wm/src/window_impl.cpp +++ b/wm/src/window_impl.cpp @@ -263,7 +263,12 @@ WMError WindowImpl::SetWindowMode(WindowMode mode) property_->SetWindowMode(mode); } else if (state_ == WindowState::STATE_SHOWN) { property_->SetWindowMode(mode); - return SingletonContainer::Get().SetWindowMode(property_->GetWindowId(), mode); + WMError ret = SingletonContainer::Get().SetWindowMode(property_->GetWindowId(), mode); + if (ret == WMError::WM_OK && windowChangeListener_ != nullptr) { + WLOGFE("notify window mode changed"); + windowChangeListener_->OnModeChange(mode); + } + return ret; } if (property_->GetWindowMode() != mode) { WLOGFE("set window mode filed! id: %{public}d", property_->GetWindowId()); @@ -723,6 +728,7 @@ void WindowImpl::RegisterLifeCycleListener(sptr& listener) void WindowImpl::RegisterWindowChangeListener(sptr& listener) { + WLOGFE("RegisterWindowChangeListener, windowId %{public}u", GetWindowId()); windowChangeListener_ = listener; } @@ -790,7 +796,11 @@ void WindowImpl::UpdateRect(const struct Rect& rect, WindowSizeChangeReason reas void WindowImpl::UpdateMode(WindowMode mode) { + WLOGI("UpdateMode %{public}d", mode); property_->SetWindowMode(mode); + if (windowChangeListener_ != nullptr) { + windowChangeListener_->OnModeChange(mode); + } } void WindowImpl::ConsumeKeyEvent(std::shared_ptr& keyEvent)