From 983f9145571e3ad1a69caff5d4107f26540b8fb1 Mon Sep 17 00:00:00 2001 From: Chihun Jeong Date: Wed, 2 Nov 2022 13:40:13 +0900 Subject: [PATCH] Add window minimize/restore/maximize event for DALi Change-Id: Idbc956f8b3950ea24ecb1c279afacf6fdde53e91 --- .../adaptor-framework/accessibility-bridge.h | 22 ++++++ dali/devel-api/adaptor-framework/accessibility.h | 10 +++ dali/internal/accessibility/bridge/bridge-impl.cpp | 79 ++++++++++++++++++++++ .../accessibility/bridge/dummy/dummy-atspi.h | 12 ++++ dali/internal/window-system/common/window-base.cpp | 6 ++ dali/internal/window-system/common/window-base.h | 7 ++ dali/internal/window-system/common/window-impl.cpp | 62 +++++++++++++---- dali/internal/window-system/common/window-impl.h | 6 ++ .../ecore-wl2/window-base-ecore-wl2.cpp | 6 +- 9 files changed, 194 insertions(+), 16 deletions(-) diff --git a/dali/devel-api/adaptor-framework/accessibility-bridge.h b/dali/devel-api/adaptor-framework/accessibility-bridge.h index 3456863..798aead 100644 --- a/dali/devel-api/adaptor-framework/accessibility-bridge.h +++ b/dali/devel-api/adaptor-framework/accessibility-bridge.h @@ -188,6 +188,28 @@ struct DALI_ADAPTOR_API Bridge virtual void WindowUnfocused(Window window) = 0; /** + * @brief Notifies accessibility dbus that window has just been minimized. + * + * @param[in] window The window to be minimized + */ + virtual void WindowMinimized(Window window) = 0; + + /** + * @brief Notifies accessibility dbus that window has just been restored. + * + * @param[in] window The window to be restored + * @param[in] detail Restored window state + */ + virtual void WindowRestored(Window window, WindowRestoreType detail) = 0; + + /** + * @brief Notifies accessibility dbus that window has just been maximized. + * + * @param[in] window The window to be maximized + */ + virtual void WindowMaximized(Window window) = 0; + + /** * @brief Initializes accessibility bus. */ virtual void Initialize() = 0; diff --git a/dali/devel-api/adaptor-framework/accessibility.h b/dali/devel-api/adaptor-framework/accessibility.h index 77c7257..a3a8df4 100644 --- a/dali/devel-api/adaptor-framework/accessibility.h +++ b/dali/devel-api/adaptor-framework/accessibility.h @@ -344,6 +344,16 @@ enum class WindowEvent }; /** + * @brief Restored window state + * @see Accessibility::Accessible::Emit + */ +enum class WindowRestoreType +{ + RESTORE_FROM_ICONIFY, // The Window is Deiconified. + RESTORE_FROM_MAXIMIZE // The Window is Unmaximized. +}; + +/** * @brief Enumeration used to acquire bounded text from accessible object having textual content. * @see Accessibility::Text::GetTextAtOffset * @note Currently only TextBoundary::Character is supported diff --git a/dali/internal/accessibility/bridge/bridge-impl.cpp b/dali/internal/accessibility/bridge/bridge-impl.cpp index afd3a96..e274ad8 100644 --- a/dali/internal/accessibility/bridge/bridge-impl.cpp +++ b/dali/internal/accessibility/bridge/bridge-impl.cpp @@ -425,6 +425,52 @@ public: } /** + * @brief Sends a signal to dbus that the window is minimized. + * + * @param[in] window The window to be minimized + * @see BridgeObject::Emit() + */ + void EmitMinimize(Dali::Window window) + { + auto windowAccessible = mApplication.GetWindowAccessible(window); + if(windowAccessible) + { + windowAccessible->Emit(WindowEvent::MINIMIZE, 0); + } + } + + /** + * @brief Sends a signal to dbus that the window is restored. + * + * @param[in] window The window to be restored + * @param[in] detail Restored window state + * @see BridgeObject::Emit() + */ + void EmitRestore(Dali::Window window, Dali::Accessibility::WindowRestoreType detail) + { + auto windowAccessible = mApplication.GetWindowAccessible(window); + if(windowAccessible) + { + windowAccessible->Emit(WindowEvent::RESTORE, static_cast(detail)); + } + } + + /** + * @brief Sends a signal to dbus that the window is maximized. + * + * @param[in] window The window to be maximized + * @see BridgeObject::Emit() + */ + void EmitMaximize(Dali::Window window) + { + auto windowAccessible = mApplication.GetWindowAccessible(window); + if(windowAccessible) + { + windowAccessible->Emit(WindowEvent::MAXIMIZE, 0); + } + } + + /** * @copydoc Dali::Accessibility::Bridge::WindowShown() */ void WindowShown(Dali::Window window) override @@ -469,6 +515,39 @@ public: } /** + * @copydoc Dali::Accessibility::Bridge::WindowMinimized() + */ + void WindowMinimized(Dali::Window window) override + { + if(IsUp()) + { + EmitMinimize(window); + } + } + + /** + * @copydoc Dali::Accessibility::Bridge::WindowRestored() + */ + void WindowRestored(Dali::Window window, WindowRestoreType detail) override + { + if(IsUp()) + { + EmitRestore(window, detail); + } + } + + /** + * @copydoc Dali::Accessibility::Bridge::WindowMaximized() + */ + void WindowMaximized(Dali::Window window) override + { + if(IsUp()) + { + EmitMaximize(window); + } + } + + /** * @copydoc Dali::Accessibility::Bridge::SuppressScreenReader() */ void SuppressScreenReader(bool suppress) override diff --git a/dali/internal/accessibility/bridge/dummy/dummy-atspi.h b/dali/internal/accessibility/bridge/dummy/dummy-atspi.h index 12ab7c6..12c817b 100644 --- a/dali/internal/accessibility/bridge/dummy/dummy-atspi.h +++ b/dali/internal/accessibility/bridge/dummy/dummy-atspi.h @@ -93,6 +93,18 @@ struct DummyBridge : Dali::Accessibility::Bridge { } + void WindowMinimized(Window window) override + { + } + + void WindowRestored(Window window, WindowRestoreType detail) override + { + } + + void WindowMaximized(Window window) override + { + } + void Initialize() override { } diff --git a/dali/internal/window-system/common/window-base.cpp b/dali/internal/window-system/common/window-base.cpp index 155ca50..5682031 100644 --- a/dali/internal/window-system/common/window-base.cpp +++ b/dali/internal/window-system/common/window-base.cpp @@ -26,6 +26,7 @@ namespace Adaptor { WindowBase::WindowBase() : mIconifyChangedSignal(), + mMaximizeChangedSignal(), mFocusChangedSignal(), mOutputTransformedSignal(), mDeleteRequestSignal(), @@ -53,6 +54,11 @@ WindowBase::IconifySignalType& WindowBase::IconifyChangedSignal() return mIconifyChangedSignal; } +WindowBase::MaximizeSignalType& WindowBase::MaximizeChangedSignal() +{ + return mMaximizeChangedSignal; +} + WindowBase::FocusSignalType& WindowBase::FocusChangedSignal() { return mFocusChangedSignal; diff --git a/dali/internal/window-system/common/window-base.h b/dali/internal/window-system/common/window-base.h index d0115ed..f5fc81d 100644 --- a/dali/internal/window-system/common/window-base.h +++ b/dali/internal/window-system/common/window-base.h @@ -64,6 +64,7 @@ public: // Window typedef Signal IconifySignalType; + typedef Signal MaximizeSignalType; typedef Signal FocusSignalType; typedef Signal OutputSignalType; typedef Signal DeleteSignalType; @@ -463,6 +464,11 @@ public: IconifySignalType& IconifyChangedSignal(); /** + * @brief This signal is emitted when the window becomes maximized or unmaximized. + */ + MaximizeSignalType& MaximizeChangedSignal(); + + /** * @brief This signal is emitted when the window focus is changed. */ FocusSignalType& FocusChangedSignal(); @@ -551,6 +557,7 @@ protected: protected: IconifySignalType mIconifyChangedSignal; + MaximizeSignalType mMaximizeChangedSignal; FocusSignalType mFocusChangedSignal; OutputSignalType mOutputTransformedSignal; DeleteSignalType mDeleteRequestSignal; diff --git a/dali/internal/window-system/common/window-impl.cpp b/dali/internal/window-system/common/window-impl.cpp index 519aeef..9581f2e 100644 --- a/dali/internal/window-system/common/window-impl.cpp +++ b/dali/internal/window-system/common/window-impl.cpp @@ -58,7 +58,6 @@ namespace #if defined(DEBUG_ENABLED) Debug::Filter* gWindowLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_WINDOW"); #endif - } // unnamed namespace Window* Window::New(const PositionSize& positionSize, const std::string& name, const std::string& className, Dali::WindowType type, bool isTransparent) @@ -99,6 +98,7 @@ Window::Window() mIsTransparent(false), mIsFocusAcceptable(true), mIconified(false), + mMaximized(false), mOpaqueState(false), mWindowRotationAcknowledgement(false), mFocused(false), @@ -151,6 +151,7 @@ void Window::Initialize(Any surface, const PositionSize& positionSize, const std // Connect signals mWindowBase->IconifyChangedSignal().Connect(this, &Window::OnIconifyChanged); + mWindowBase->MaximizeChangedSignal().Connect(this, &Window::OnMaximizeChanged); mWindowBase->FocusChangedSignal().Connect(this, &Window::OnFocusChanged); mWindowBase->DeleteRequestSignal().Connect(this, &Window::OnDeleteRequest); mWindowBase->TransitionEffectEventSignal().Connect(this, &Window::OnTransitionEffectEvent); @@ -832,20 +833,28 @@ bool Window::UngrabKeyList(const Dali::Vector& key, Dali::VectorWindowHidden(handle); + bridge->WindowHidden(handle); WindowVisibilityObserver* observer(mAdaptor); observer->OnWindowHidden(); } + if(isActuallyChanged) + { + bridge->WindowMinimized(handle); + } + DALI_LOG_RELEASE_INFO("Window (%p), WinId (%d), Iconified: visible = %d\n", this, mNativeWindowId, mVisible); } else @@ -854,38 +863,63 @@ void Window::OnIconifyChanged(bool iconified) if(mVisible) { - Dali::Window handle(this); mVisibilityChangedSignal.Emit(handle, true); - Dali::Accessibility::Bridge::GetCurrentBridge()->WindowShown(handle); + bridge->WindowShown(handle); WindowVisibilityObserver* observer(mAdaptor); observer->OnWindowShown(); } + if(isActuallyChanged) + { + bridge->WindowRestored(handle, Dali::Accessibility::WindowRestoreType::RESTORE_FROM_ICONIFY); + } + DALI_LOG_RELEASE_INFO("Window (%p), WinId (%d), Deiconified: visible = %d\n", this, mNativeWindowId, mVisible); } mSurface->SetFullSwapNextFrame(); } -void Window::OnFocusChanged(bool focusIn) +void Window::OnMaximizeChanged(bool maximized) { - Dali::Window handle(this); - mFocusChangeSignal.Emit(handle, focusIn); + const bool isActuallyChanged = (maximized != mMaximized); - mSurface->SetFullSwapNextFrame(); - - if(auto bridge = Dali::Accessibility::Bridge::GetCurrentBridge()) + if(isActuallyChanged) { - if(focusIn) + auto bridge = Dali::Accessibility::Bridge::GetCurrentBridge(); + Dali::Window handle(this); + + if(maximized) { - bridge->WindowFocused(handle); + mMaximized = true; + bridge->WindowMaximized(handle); } else { - bridge->WindowUnfocused(handle); + mMaximized = false; + bridge->WindowRestored(handle, Dali::Accessibility::WindowRestoreType::RESTORE_FROM_MAXIMIZE); } } +} + +void Window::OnFocusChanged(bool focusIn) +{ + Dali::Window handle(this); + mFocusChangeSignal.Emit(handle, focusIn); + + mSurface->SetFullSwapNextFrame(); + auto bridge = Dali::Accessibility::Bridge::GetCurrentBridge(); + + if(focusIn) + { + bridge->WindowFocused(handle); + } + else + { + bridge->WindowUnfocused(handle); + } + mFocused = focusIn; } diff --git a/dali/internal/window-system/common/window-impl.h b/dali/internal/window-system/common/window-impl.h index d04e438..f9d7fc7 100644 --- a/dali/internal/window-system/common/window-impl.h +++ b/dali/internal/window-system/common/window-impl.h @@ -517,6 +517,11 @@ private: void OnIconifyChanged(bool iconified); /** + * Called when the window becomes maximized or unmaximized. + */ + void OnMaximizeChanged(bool maximized); + + /** * Called when the window focus is changed. */ void OnFocusChanged(bool focusIn); @@ -790,6 +795,7 @@ private: bool mIsTransparent : 1; bool mIsFocusAcceptable : 1; bool mIconified : 1; + bool mMaximized : 1; bool mOpaqueState : 1; bool mWindowRotationAcknowledgement : 1; bool mFocused : 1; diff --git a/dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.cpp b/dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.cpp index 903dc20..814b2a6 100644 --- a/dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.cpp +++ b/dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.cpp @@ -1014,8 +1014,8 @@ void WindowBaseEcoreWl2::OnConfiguration(void* data, int type, void* event) // Note: To comply with the wayland protocol, Dali should make an ack_configure // by calling ecore_wl2_window_commit - int tempWidth = static_cast(ev->w); - int tempHeight = static_cast(ev->h); + int tempWidth = ev->w; + int tempHeight = ev->h; // Initialize with previous size for skip resize when new size is 0. // When window is just moved or window is resized by client application, @@ -1051,6 +1051,8 @@ void WindowBaseEcoreWl2::OnConfiguration(void* data, int type, void* event) mUpdatePositionSizeSignal.Emit(newPositionSize); } + mMaximizeChangedSignal.Emit(static_cast(ev->states & ECORE_WL2_WINDOW_STATE_MAXIMIZED)); + ecore_wl2_window_commit(mEcoreWindow, EINA_FALSE); } } -- 2.7.4