Add window minimize/restore/maximize event for DALi 05/283705/22
authorChihun Jeong <chihun.jeong@samsung.com>
Wed, 2 Nov 2022 04:40:13 +0000 (13:40 +0900)
committerChihun Jeong <chihun.jeong@samsung.com>
Mon, 21 Nov 2022 06:31:02 +0000 (15:31 +0900)
Change-Id: Idbc956f8b3950ea24ecb1c279afacf6fdde53e91

dali/devel-api/adaptor-framework/accessibility-bridge.h
dali/devel-api/adaptor-framework/accessibility.h
dali/internal/accessibility/bridge/bridge-impl.cpp
dali/internal/accessibility/bridge/dummy/dummy-atspi.h
dali/internal/window-system/common/window-base.cpp
dali/internal/window-system/common/window-base.h
dali/internal/window-system/common/window-impl.cpp
dali/internal/window-system/common/window-impl.h
dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.cpp

index 3456863..798aead 100644 (file)
@@ -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;
index 77c7257..a3a8df4 100644 (file)
@@ -344,6 +344,16 @@ enum class WindowEvent
 };\r
 \r
 /**\r
+ * @brief Restored window state\r
+ * @see Accessibility::Accessible::Emit\r
+ */\r
+enum class WindowRestoreType\r
+{\r
+  RESTORE_FROM_ICONIFY,  // The Window is Deiconified.\r
+  RESTORE_FROM_MAXIMIZE  // The Window is Unmaximized.\r
+};\r
+\r
+/**\r
  * @brief Enumeration used to acquire bounded text from accessible object having textual content.\r
  * @see Accessibility::Text::GetTextAtOffset\r
  * @note Currently only TextBoundary::Character is supported\r
index afd3a96..e274ad8 100644 (file)
@@ -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<unsigned int>(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
index 12ab7c6..12c817b 100644 (file)
@@ -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
   {
   }
index 155ca50..5682031 100644 (file)
@@ -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;
index d0115ed..f5fc81d 100644 (file)
@@ -64,6 +64,7 @@ public:
 
   // Window
   typedef Signal<void(bool)>                                IconifySignalType;
+  typedef Signal<void(bool)>                                MaximizeSignalType;
   typedef Signal<void(bool)>                                FocusSignalType;
   typedef Signal<void()>                                    OutputSignalType;
   typedef Signal<void()>                                    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;
index 519aeef..9581f2e 100644 (file)
@@ -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<Dali::KEY>& key, Dali::Vector<bool
 
 void Window::OnIconifyChanged(bool iconified)
 {
+  const bool isActuallyChanged = (iconified != mIconified);
+  auto bridge = Dali::Accessibility::Bridge::GetCurrentBridge();
+  Dali::Window handle(this);
+
   if(iconified)
   {
     mIconified = true;
 
     if(mVisible)
     {
-      Dali::Window handle(this);
       mVisibilityChangedSignal.Emit(handle, false);
-      Dali::Accessibility::Bridge::GetCurrentBridge()->WindowHidden(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;
 }
 
index d04e438..f9d7fc7 100644 (file)
@@ -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;
index 903dc20..814b2a6 100644 (file)
@@ -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<int>(ev->w);
-    int tempHeight = static_cast<int>(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<bool>(ev->states & ECORE_WL2_WINDOW_STATE_MAXIMIZED));
+
     ecore_wl2_window_commit(mEcoreWindow, EINA_FALSE);
   }
 }