diff --git a/interfaces/innerkits/wm/window.h b/interfaces/innerkits/wm/window.h index ff066415..e3f9e942 100644 --- a/interfaces/innerkits/wm/window.h +++ b/interfaces/innerkits/wm/window.h @@ -26,7 +26,6 @@ class NativeValue; class NativeEngine; namespace OHOS::MMI { - struct IInputEventConsumer; class PointerEvent; class KeyEvent; class AxisEvent; @@ -117,14 +116,10 @@ public: virtual uint32_t GetBackgroundColor() = 0; }; -class IInputEventListener : virtual public RefBase { -public: - virtual void OnKeyEvent(std::shared_ptr& keyEvent) = 0; - virtual void OnPointerInputEvent(std::shared_ptr& pointerEvent) = 0; -}; - class IInputEventConsumer { public: + IInputEventConsumer() = default; + virtual ~IInputEventConsumer() = default; virtual bool OnInputEvent(const std::shared_ptr& keyEvent) const = 0; virtual bool OnInputEvent(const std::shared_ptr& pointerEvent) const = 0; virtual bool OnInputEvent(const std::shared_ptr& axisEvent) const = 0; @@ -222,9 +217,7 @@ public: virtual WMError RequestFocus() const = 0; virtual WMError UpdateSurfaceNodeAfterCustomAnimation(bool isAdd) = 0; - // AddInputEventListener is for api 7 virtual void SetInputEventConsumer(const std::shared_ptr& inputEventConsumer) = 0; - virtual void AddInputEventListener(const std::shared_ptr& inputEventListener) = 0; virtual void ConsumeKeyEvent(std::shared_ptr& inputEvent) = 0; virtual void ConsumePointerEvent(std::shared_ptr& inputEvent) = 0; virtual void RequestFrame() = 0; @@ -240,8 +233,6 @@ public: virtual void UnregisterDragListener(const sptr& listener) = 0; virtual void RegisterDisplayMoveListener(sptr& listener) = 0; virtual void UnregisterDisplayMoveListener(sptr& listener) = 0; - virtual void RegisterInputEventListener(const sptr& listener) = 0; - virtual void UnregisterInputEventListener(const sptr& listener) = 0; virtual void RegisterWindowDestroyedListener(const NotifyNativeWinDestroyFunc& func) = 0; virtual void RegisterOccupiedAreaChangeListener(const sptr& listener) = 0; virtual void UnregisterOccupiedAreaChangeListener(const sptr& listener) = 0; diff --git a/wm/include/window_impl.h b/wm/include/window_impl.h index 6f19d664..e5b515a2 100644 --- a/wm/include/window_impl.h +++ b/wm/include/window_impl.h @@ -172,7 +172,6 @@ public: virtual void StartMove() override; virtual WMError RequestFocus() const override; - virtual void AddInputEventListener(const std::shared_ptr& inputEventListener) override; virtual void SetInputEventConsumer(const std::shared_ptr& inputEventConsumer) override; virtual void RegisterLifeCycleListener(const sptr& listener) override; @@ -185,8 +184,6 @@ public: virtual void UnregisterDragListener(const sptr& listener) override; virtual void RegisterDisplayMoveListener(sptr& listener) override; virtual void UnregisterDisplayMoveListener(sptr& listener) override; - virtual void RegisterInputEventListener(const sptr& listener) override; - virtual void UnregisterInputEventListener(const sptr& listener) override; virtual void RegisterWindowDestroyedListener(const NotifyNativeWinDestroyFunc& func) override; virtual void RegisterOccupiedAreaChangeListener(const sptr& listener) override; virtual void UnregisterOccupiedAreaChangeListener(const sptr& listener) override; @@ -212,15 +209,6 @@ public: void UpdateDisplayId(DisplayId from, DisplayId to); void UpdateOccupiedAreaChangeInfo(const sptr& info); void UpdateActiveStatus(bool isActive); - void NotifyOutsidePressed(); - void NotifySizeChange(Rect rect, WindowSizeChangeReason reason); - void NotifyKeyEvent(std::shared_ptr &keyEvent); - void NotifyPointEvent(std::shared_ptr& pointerEvent); - void NotifyAvoidAreaChange(const sptr& avoidArea, AvoidAreaType type); - void NotifyDisplayMoveChange(DisplayId from, DisplayId to); - void NotifyOccupiedAreaChange(const sptr& info); - void NotifyModeChange(WindowMode mode); - void NotifyDragEvent(const PointInfo& point, DragEvent event); void NotifyTouchOutside(); void NotifyScreenshot(); @@ -341,6 +329,12 @@ private: CALL_LIFECYCLE_LISTENER(ForegroundInvalidMode, lifecycleListeners); }); } + void NotifySizeChange(Rect rect, WindowSizeChangeReason reason); + void NotifyAvoidAreaChange(const sptr& avoidArea, AvoidAreaType type); + void NotifyDisplayMoveChange(DisplayId from, DisplayId to); + void NotifyOccupiedAreaChange(const sptr& info); + void NotifyModeChange(WindowMode mode); + void NotifyDragEvent(const PointInfo& point, DragEvent event); void DestroyFloatingWindow(); void DestroySubWindow(); void SetDefaultOption(); // for api7 @@ -404,7 +398,6 @@ private: std::vector> windowDragListeners_; std::vector> displayMoveListeners_; std::vector> occupiedAreaChangeListeners_; - std::vector> inputEventListeners_; std::shared_ptr inputEventConsumer_; sptr animationTranistionController_; NotifyNativeWinDestroyFunc notifyNativefunc_; diff --git a/wm/src/window_impl.cpp b/wm/src/window_impl.cpp index dc8d7477..5209966a 100755 --- a/wm/src/window_impl.cpp +++ b/wm/src/window_impl.cpp @@ -1486,11 +1486,6 @@ void WindowImpl::SetInputEventConsumer(const std::shared_ptr& inputEventListener) -{ - InputTransferStation::GetInstance().SetInputListener(GetWindowId(), inputEventListener); -} - void WindowImpl::RegisterLifeCycleListener(const sptr& listener) { if (listener == nullptr) { @@ -1620,30 +1615,6 @@ void WindowImpl::UnregisterDisplayMoveListener(sptr& liste displayMoveListeners_.erase(iter); } -void WindowImpl::RegisterInputEventListener(const sptr& listener) -{ - if (listener == nullptr) { - return; - } - std::lock_guard lock(mutex_); - if (std::find(inputEventListeners_.begin(), inputEventListeners_.end(), listener) != inputEventListeners_.end()) { - WLOGFE("Listener already registered"); - return; - } - inputEventListeners_.emplace_back(listener); -} - -void WindowImpl::UnregisterInputEventListener(const sptr& listener) -{ - std::lock_guard lock(mutex_); - auto iter = std::find(inputEventListeners_.begin(), inputEventListeners_.end(), listener); - if (iter == inputEventListeners_.end()) { - WLOGFE("could not find the listener"); - return; - } - inputEventListeners_.erase(iter); -} - void WindowImpl::RegisterWindowDestroyedListener(const NotifyNativeWinDestroyFunc& func) { WLOGFI("JS RegisterWindowDestroyedListener the listener"); @@ -1830,9 +1801,6 @@ void WindowImpl::HandleBackKeyPressedEvent(const std::shared_ptr& if (inputEventConsumer != nullptr) { WLOGFI("Transfer back key event to inputEventConsumer"); isConsumed = inputEventConsumer->OnInputEvent(keyEvent); - } else if (!inputEventListeners_.empty()) { - WLOGFI("inputEventListeners_ is not empty"); - return; } else if (uiContent_ != nullptr) { WLOGFI("Transfer back key event to uiContent"); isConsumed = uiContent_->ProcessBackPressed(); @@ -1864,7 +1832,6 @@ void WindowImpl::HandleBackKeyPressedEvent(const std::shared_ptr& void WindowImpl::ConsumeKeyEvent(std::shared_ptr& keyEvent) { - NotifyKeyEvent(keyEvent); int32_t keyCode = keyEvent->GetKeyCode(); int32_t keyAction = keyEvent->GetKeyAction(); WLOGFI("KeyCode: %{public}d, action: %{public}d", keyCode, keyAction); @@ -2223,7 +2190,6 @@ void WindowImpl::ConsumePointerEvent(std::shared_ptr& pointer WLOGFI("update pointer event for stretchable window"); UpdatePointerEventForStretchableWindow(pointerEvent); } - NotifyPointEvent(pointerEvent); std::shared_ptr inputEventConsumer; { std::lock_guard lock(mutex_); @@ -2449,38 +2415,6 @@ void WindowImpl::NotifySizeChange(Rect rect, WindowSizeChangeReason reason) }); } -void WindowImpl::NotifyKeyEvent(std::shared_ptr &keyEvent) -{ - std::vector> inputEventListeners; - { - std::lock_guard lock(mutex_); - inputEventListeners = inputEventListeners_; - } - PostListenerTask([this, inputEventListeners, keyEvent]() mutable { - for (auto& listener : inputEventListeners) { - if (listener != nullptr) { - listener->OnKeyEvent(keyEvent); - } - } - }); -} - -void WindowImpl::NotifyPointEvent(std::shared_ptr& pointerEvent) -{ - std::vector> inputEventListeners; - { - std::lock_guard lock(mutex_); - inputEventListeners = inputEventListeners_; - } - PostListenerTask([this, inputEventListeners, pointerEvent]() mutable { - for (auto& listener : inputEventListeners) { - if (listener != nullptr) { - listener->OnPointerInputEvent(pointerEvent); - } - } - }); -} - void WindowImpl::NotifyAvoidAreaChange(const sptr& avoidArea, AvoidAreaType type) { std::vector> avoidAreaChangeListeners; diff --git a/wmserver/include/inner_window.h b/wmserver/include/inner_window.h index 3fb48622..b712bab3 100644 --- a/wmserver/include/inner_window.h +++ b/wmserver/include/inner_window.h @@ -28,13 +28,10 @@ public: virtual void Destroy() = 0; }; -class PlaceholderWindowListener : public IWindowLifeCycle, public ITouchOutsideListener, public IInputEventListener { +class PlaceholderWindowListener : public IWindowLifeCycle, public ITouchOutsideListener { public: // touch outside listener virtual void OnTouchOutside() const; - // input event listener - virtual void OnKeyEvent(std::shared_ptr& keyEvent); - virtual void OnPointerInputEvent(std::shared_ptr& pointerEvent); // lifecycle listener virtual void AfterUnfocused(); // lifecycle do nothing @@ -44,6 +41,14 @@ public: virtual void AfterInactive() {}; }; +class PlaceholderInputEventConsumer : public IInputEventConsumer { +public: + ~PlaceholderInputEventConsumer() override = default; + virtual bool OnInputEvent(const std::shared_ptr& keyEvent) const override; + virtual bool OnInputEvent(const std::shared_ptr& pointerEvent) const override; + virtual bool OnInputEvent(const std::shared_ptr& axisEvent) const override; +}; + class PlaceHolderWindow : public IInnerWindow { WM_DECLARE_SINGLE_INSTANCE(PlaceHolderWindow); public: @@ -51,12 +56,14 @@ public: virtual void Destroy(); private: - void RegitsterWindowListener(); - void UnRegitsterWindowListener(); + void RegisterWindowListener(); + void UnRegisterWindowListener(); + void SetInputEventConsumer(); private: sptr window_; - sptr listener_; + sptr windowListener_; + std::shared_ptr inputEventConsumer_; }; class DividerWindow : public IInnerWindow { diff --git a/wmserver/src/inner_window.cpp b/wmserver/src/inner_window.cpp index 5033e6e6..22f1af12 100644 --- a/wmserver/src/inner_window.cpp +++ b/wmserver/src/inner_window.cpp @@ -34,24 +34,32 @@ void PlaceholderWindowListener::OnTouchOutside() const PlaceHolderWindow::GetInstance().Destroy(); } -void PlaceholderWindowListener::OnKeyEvent(std::shared_ptr& keyEvent) -{ - WLOGFD("place holder get key event"); - PlaceHolderWindow::GetInstance().Destroy(); -} - -void PlaceholderWindowListener::OnPointerInputEvent(std::shared_ptr& pointerEvent) -{ - WLOGFD("place holder get point event"); - PlaceHolderWindow::GetInstance().Destroy(); -} - void PlaceholderWindowListener::AfterUnfocused() { WLOGFD("place holder after unfocused"); PlaceHolderWindow::GetInstance().Destroy(); } +bool PlaceholderInputEventConsumer::OnInputEvent(const std::shared_ptr& keyEvent) const +{ + WLOGFD("place holder get key event"); + PlaceHolderWindow::GetInstance().Destroy(); + return true; +} + +bool PlaceholderInputEventConsumer::OnInputEvent(const std::shared_ptr& pointerEvent) const +{ + WLOGFD("place holder get point event"); + PlaceHolderWindow::GetInstance().Destroy(); + return true; +} + +bool PlaceholderInputEventConsumer::OnInputEvent(const std::shared_ptr& axisEvent) const +{ + // do nothing + return false; +} + void PlaceHolderWindow::Create(std::string name, DisplayId displyId, Rect rect, WindowMode mode) { WLOGFD("create inner display id: %{public}" PRIu64"", displyId); @@ -74,7 +82,8 @@ void PlaceHolderWindow::Create(std::string name, DisplayId displyId, Rect rect, return; } window_->AddWindowFlag(WindowFlag::WINDOW_FLAG_FORBID_SPLIT_MOVE); - RegitsterWindowListener(); + RegisterWindowListener(); + SetInputEventConsumer(); if (!OHOS::Rosen::SurfaceDraw::DrawImage(window_->GetSurfaceNode(), rect.width_, rect.height_, IMAGE_PLACE_HOLDER_PNG_PATH)) { WLOGE("draw surface failed"); @@ -84,29 +93,39 @@ void PlaceHolderWindow::Create(std::string name, DisplayId displyId, Rect rect, WLOGFD("create palce holder Window end"); } -void PlaceHolderWindow::RegitsterWindowListener() +void PlaceHolderWindow::RegisterWindowListener() { if (window_ == nullptr) { - WLOGFE("Window is nullptr, regitster window listener failed."); + WLOGFE("Window is nullptr, register window listener failed."); return; } - if (listener_ == nullptr) { - listener_ = new (std::nothrow) PlaceholderWindowListener(); + if (windowListener_ == nullptr) { + windowListener_ = new (std::nothrow) PlaceholderWindowListener(); } - window_->RegisterTouchOutsideListener(listener_); - window_->RegisterInputEventListener(listener_); - window_->RegisterLifeCycleListener(listener_); + window_->RegisterTouchOutsideListener(windowListener_); + window_->RegisterLifeCycleListener(windowListener_); } -void PlaceHolderWindow::UnRegitsterWindowListener() +void PlaceHolderWindow::UnRegisterWindowListener() { - if (window_ == nullptr || listener_ == nullptr) { - WLOGFE("Window or listener is nullptr, unregitster window listener failed."); + if (window_ == nullptr || windowListener_ == nullptr) { + WLOGFE("Window or listener is nullptr, unregister window listener failed."); return; } - window_->UnregisterTouchOutsideListener(listener_); - window_->UnregisterInputEventListener(listener_); - window_->UnregisterLifeCycleListener(listener_); + window_->UnregisterTouchOutsideListener(windowListener_); + window_->UnregisterLifeCycleListener(windowListener_); +} + +void PlaceHolderWindow::SetInputEventConsumer() +{ + if (window_ == nullptr) { + WLOGFE("Window is nullptr, set window input event consumer failed."); + return; + } + if (inputEventConsumer_ == nullptr) { + inputEventConsumer_ = std::make_shared(); + } + window_->SetInputEventConsumer(inputEventConsumer_); } void PlaceHolderWindow::Destroy() @@ -114,7 +133,8 @@ void PlaceHolderWindow::Destroy() WLOGFI("destroy place holder window begin."); if (window_ != nullptr) { WLOGFI("destroy place holder window not nullptr."); - UnRegitsterWindowListener(); + UnRegisterWindowListener(); + window_->SetInputEventConsumer(nullptr); window_->Destroy(); } window_ = nullptr;