[dali_2.3.29] Merge branch 'devel/master' 95/313295/1
authorDavid Steele <david.steele@samsung.com>
Fri, 21 Jun 2024 11:55:47 +0000 (12:55 +0100)
committerDavid Steele <david.steele@samsung.com>
Fri, 21 Jun 2024 11:55:47 +0000 (12:55 +0100)
Change-Id: I174d6f2305170a7dda51eae689fdb953872160d5

27 files changed:
dali/devel-api/adaptor-framework/accessibility-bridge.h
dali/devel-api/adaptor-framework/accessibility.cpp
dali/devel-api/atspi-interfaces/accessible.h
dali/integration-api/adaptor-framework/scene-holder-impl.cpp
dali/integration-api/adaptor-framework/scene-holder-impl.h
dali/internal/accessibility/bridge/bridge-base.cpp
dali/internal/accessibility/bridge/bridge-base.h
dali/internal/accessibility/bridge/dummy/dummy-atspi.h
dali/internal/legacy/common/tizen-platform-abstraction.cpp
dali/internal/legacy/common/tizen-platform-abstraction.h
dali/internal/window-system/common/event-handler.cpp
dali/internal/window-system/common/event-handler.h
dali/internal/window-system/common/gl-window-impl.cpp
dali/internal/window-system/common/gl-window-impl.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/macos/window-base-mac.mm
dali/internal/window-system/tizen-wayland/ecore-wl/window-base-ecore-wl.cpp
dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.cpp
dali/internal/window-system/tizen-wayland/ecore-wl2/window-base-ecore-wl2.h
dali/internal/window-system/ubuntu-x11/window-base-ecore-x.cpp
dali/internal/window-system/windows/window-base-win.cpp
dali/internal/window-system/x11/window-base-x.cpp
dali/public-api/dali-adaptor-version.cpp
packaging/dali-adaptor.spec

index 6d30da6..3cac8f5 100644 (file)
@@ -99,7 +99,7 @@ struct DALI_ADAPTOR_API Bridge
    *
    * @param[in] object The accessible object
    */
-  virtual void RegisterDefaultLabel(Accessible* object) = 0;
+  virtual void RegisterDefaultLabel(std::shared_ptr<Accessible> object) = 0;
 
   /**
    * @brief Removes object from the stack of "default label" sourcing objects.
@@ -108,7 +108,7 @@ struct DALI_ADAPTOR_API Bridge
    *
    * @param[in] object The accessible object
    */
-  virtual void UnregisterDefaultLabel(Accessible* object) = 0;
+  virtual void UnregisterDefaultLabel(std::shared_ptr<Accessible> object) = 0;
 
   /**
    * @brief Gets the top-most object from the stack of "default label" sourcing objects.
@@ -126,7 +126,7 @@ struct DALI_ADAPTOR_API Bridge
    * Following strings are valid values for "default_label" attribute: "enabled", "disabled".
    * Any other value will be interpreted as "enabled".
    */
-  virtual Accessible* GetDefaultLabel(Accessible* root) const = 0;
+  virtual Accessible* GetDefaultLabel(Accessible* root) = 0;
 
   /**
    * @brief Sets name of current application which will be visible on accessibility bus.
@@ -302,14 +302,14 @@ struct DALI_ADAPTOR_API Bridge
    *
    * @param obj Accessible Object
    */
-  virtual void EmitScrollStarted(Accessible *obj) = 0;
+  virtual void EmitScrollStarted(Accessibleobj) = 0;
 
-    /**
+  /**
    * @brief Emits ScrollFinished event on at-spi bus.
    *
    * @param obj Accessible Object
    */
-  virtual void EmitScrollFinished(Accessible *obj) = 0;
+  virtual void EmitScrollFinished(Accessibleobj) = 0;
 
   /**
    * @brief Emits state-changed event on at-spi bus.
@@ -357,7 +357,7 @@ struct DALI_ADAPTOR_API Bridge
    * The actual number of events emitted during a given time interval may be smaller
    * than the number of calls to this method, but at least one is guaranteed.
    */
-  virtual void EmitPostRender(Accessible *obj) = 0;
+  virtual void EmitPostRender(Accessibleobj) = 0;
 
   /**
    * @brief Emits key event on at-spi bus.
index f69c96c..4b4fe25 100644 (file)
@@ -40,8 +40,8 @@
 #include <dali/devel-api/atspi-interfaces/hypertext.h>
 #include <dali/devel-api/atspi-interfaces/selection.h>
 #include <dali/devel-api/atspi-interfaces/socket.h>
-#include <dali/devel-api/atspi-interfaces/table.h>
 #include <dali/devel-api/atspi-interfaces/table-cell.h>
+#include <dali/devel-api/atspi-interfaces/table.h>
 #include <dali/devel-api/atspi-interfaces/text.h>
 #include <dali/devel-api/atspi-interfaces/value.h>
 #include <dali/internal/adaptor/common/adaptor-impl.h>
@@ -451,7 +451,7 @@ public:
       state[State::VISIBLE]   = true;
       state[State::ACTIVE]    = visible;
     }
-    else if (GetParent())
+    else if(GetParent())
     {
       auto parentState      = GetParent()->GetStates();
       state[State::SHOWING] = parentState[State::SHOWING];
@@ -495,22 +495,22 @@ public:
 
   void SetListenPostRender(bool enabled) override
   {
-    if (!mRoot)
+    if(!mRoot)
     {
       return;
     }
 
-    auto window                                 = Dali::DevelWindow::Get(Self());
+    auto                             window     = Dali::DevelWindow::Get(Self());
     Dali::Internal::Adaptor::Window& windowImpl = Dali::GetImplementation(window);
 
     if(!mRenderNotification)
     {
       mRenderNotification = std::unique_ptr<TriggerEventInterface>(
-                                           TriggerEventFactory::CreateTriggerEvent(MakeCallback(this, &AdaptorAccessible::OnPostRender),
-                                           TriggerEventInterface::KEEP_ALIVE_AFTER_TRIGGER));
+        TriggerEventFactory::CreateTriggerEvent(MakeCallback(this, &AdaptorAccessible::OnPostRender),
+                                                TriggerEventInterface::KEEP_ALIVE_AFTER_TRIGGER));
     }
 
-    if (enabled)
+    if(enabled)
     {
       windowImpl.SetRenderNotification(mRenderNotification.get());
     }
@@ -526,7 +526,7 @@ public:
   }
 }; // AdaptorAccessible
 
-using AdaptorAccessiblesType = std::unordered_map<const Dali::RefObject*, std::unique_ptr<AdaptorAccessible> >;
+using AdaptorAccessiblesType = std::unordered_map<const Dali::RefObject*, std::shared_ptr<AdaptorAccessible>>;
 
 // Save RefObject from an Actor in Accessible::Get()
 AdaptorAccessiblesType& GetAdaptorAccessibles()
@@ -535,7 +535,7 @@ AdaptorAccessiblesType& GetAdaptorAccessibles()
   return gAdaptorAccessibles;
 }
 
-std::function<Accessible*(Dali::Actor)> convertingFunctor = [](Dali::Actor) -> Accessible* {
+std::function<std::shared_ptr<Accessible>(Dali::Actor)> convertingFunctor = [](Dali::Actor) -> std::shared_ptr<Accessible> {
   return nullptr;
 };
 
@@ -550,12 +550,12 @@ void Accessible::SetObjectRegistry(ObjectRegistry registry)
   });
 }
 
-void Accessible::RegisterExternalAccessibleGetter(std::function<Accessible*(Dali::Actor)> functor)
+void Accessible::RegisterExternalAccessibleGetter(std::function<std::shared_ptr<Accessible>(Dali::Actor)> functor)
 {
   convertingFunctor = functor;
 }
 
-Accessible* Accessible::Get(Dali::Actor actor)
+std::shared_ptr<Accessible> Accessible::GetOwningPtr(Dali::Actor actor)
 {
   if(!actor)
   {
@@ -576,8 +576,14 @@ Accessible* Accessible::Get(Dali::Actor actor)
       }
       pair.first->second.reset(new AdaptorAccessible(actor, isRoot));
     }
-    accessible = pair.first->second.get();
+    accessible = pair.first->second;
   }
 
   return accessible;
 }
+
+Accessible* Accessible::Get(Dali::Actor actor)
+{
+  auto accessible = Accessible::GetOwningPtr(actor);
+  return accessible ? accessible.get() : nullptr;
+}
\ No newline at end of file
index f34f9e3..3590817 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_ADAPTOR_ATSPI_ACCESSIBLE_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -459,18 +459,27 @@ public:
    * @brief The method registers functor resposible for converting Actor into Accessible.
    * @param functor The returning Accessible handle from Actor object
    */
-  static void RegisterExternalAccessibleGetter(std::function<Accessible*(Dali::Actor)> functor);
+  static void RegisterExternalAccessibleGetter(std::function<std::shared_ptr<Accessible>(Dali::Actor)> functor);
 
   /**
    * @brief Acquires Accessible object from Actor object.
    *
    * @param[in] actor Actor object
    *
-   * @return The handle to Accessible object
+   * @return The raw pointer to Accessible object
    */
   static Accessible* Get(Dali::Actor actor);
 
   /**
+   * @brief Acquires Accessible object from Actor object.
+   *
+   * @param[in] actor Actor object
+   *
+   * @return The owning pointer to Accessible object
+   */
+  static std::shared_ptr<Accessible> GetOwningPtr(Dali::Actor actor);
+
+  /**
    * @brief Obtains the DBus interface name for the specified AT-SPI interface.
    *
    * @param interface AT-SPI interface identifier (e.g. AtspiInterface::ACCESSIBLE)
index 011b87f..d5e1cf1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -49,6 +49,8 @@ namespace
 #if defined(DEBUG_ENABLED)
 Debug::Filter* gSceneHolderLogFilter = Debug::Filter::New(Debug::NoLogging, false, "LOG_SCENE_HOLDER");
 #endif
+
+const uint32_t MAX_PRESSED_POINT_COUNT = 2;
 } // unnamed namespace
 
 uint32_t SceneHolder::mSceneHolderCounter = 0;
@@ -93,7 +95,11 @@ SceneHolder::SceneHolder()
   mAdaptor(nullptr),
   mDpi(),
   mAdaptorStarted(false),
-  mVisible(true)
+  mVisible(true),
+  mHandledMultiTouch(false),
+  mPreviousTouchEvent(),
+  mPreviousHoverEvent(),
+  mPreviousType(Integration::TouchEventCombiner::DISPATCH_NONE)
 {
 }
 
@@ -316,13 +322,12 @@ void SceneHolder::FeedTouchPoint(Dali::Integration::Point& point, int timeStamp)
   {
     timeStamp = TimeService::GetMilliSeconds();
   }
-
   Vector2 convertedPosition = RecalculatePosition(point.GetScreenPosition());
   point.SetScreenPosition(convertedPosition);
 
   Integration::TouchEvent                            touchEvent;
   Integration::HoverEvent                            hoverEvent;
-  Integration::TouchEventCombiner::EventDispatchType type = mCombiner.GetNextTouchEvent(point, timeStamp, touchEvent, hoverEvent);
+  Integration::TouchEventCombiner::EventDispatchType type = mCombiner.GetNextTouchEvent(point, timeStamp, touchEvent, hoverEvent, mHandledMultiTouch);
   if(type != Integration::TouchEventCombiner::DISPATCH_NONE)
   {
     DALI_LOG_INFO(gSceneHolderLogFilter, Debug::Verbose, "%d: Device %d: Button state %d (%.2f, %.2f)\n", timeStamp, point.GetDeviceId(), point.GetState(), point.GetScreenPosition().x, point.GetScreenPosition().y);
@@ -331,22 +336,78 @@ void SceneHolder::FeedTouchPoint(Dali::Integration::Point& point, int timeStamp)
     // Keep the handle alive until the core events are processed.
     Dali::BaseHandle sceneHolder(this);
 
-    // First the touch and/or hover event & related gesture events are queued
+    uint32_t pointCount = touchEvent.GetPointCount();
+    if(pointCount > MAX_PRESSED_POINT_COUNT)
+    {
+      mPreviousTouchEvent = touchEvent;
+      mPreviousHoverEvent = hoverEvent;
+      if(mPreviousType == Integration::TouchEventCombiner::DISPATCH_NONE)
+      {
+        mPreviousType = type;
+      }
+      else if(mPreviousType != type)
+      {
+        mPreviousType = Integration::TouchEventCombiner::DISPATCH_BOTH;
+      }
+      mHandledMultiTouch = true;
+    }
+
     if(type == Integration::TouchEventCombiner::DISPATCH_TOUCH || type == Integration::TouchEventCombiner::DISPATCH_BOTH)
     {
       mLastTouchEvent = Dali::Integration::NewTouchEvent(timeStamp, point);
-      mScene.QueueEvent(touchEvent);
     }
 
     if(type == Integration::TouchEventCombiner::DISPATCH_HOVER || type == Integration::TouchEventCombiner::DISPATCH_BOTH)
     {
       mLastHoverEvent = Dali::Integration::NewHoverEvent(timeStamp, point);
-      mScene.QueueEvent(hoverEvent);
     }
 
     // Next the events are processed with a single call into Core
+    if(pointCount <= MAX_PRESSED_POINT_COUNT || (point.GetState() != PointState::MOTION))
+    {
+      mHandledMultiTouch = false;
+      mPreviousType      = Integration::TouchEventCombiner::DISPATCH_NONE;
+
+      // First the touch and/or hover event & related gesture events are queued
+      if(type == Integration::TouchEventCombiner::DISPATCH_TOUCH || type == Integration::TouchEventCombiner::DISPATCH_BOTH)
+      {
+        mScene.QueueEvent(touchEvent);
+      }
+
+      if(type == Integration::TouchEventCombiner::DISPATCH_HOVER || type == Integration::TouchEventCombiner::DISPATCH_BOTH)
+      {
+        mScene.QueueEvent(hoverEvent);
+      }
+      mAdaptor->ProcessCoreEvents();
+    }
+  }
+}
+
+void SceneHolder::FeedMouseFrameEvent()
+{
+  if(DALI_UNLIKELY(!mAdaptorStarted))
+  {
+    DALI_LOG_ERROR("Adaptor is stopped, or not be started yet. Ignore this feed.\n");
+    return;
+  }
+
+  if(mPreviousType == Integration::TouchEventCombiner::DISPATCH_TOUCH || mPreviousType == Integration::TouchEventCombiner::DISPATCH_BOTH)
+  {
+    mScene.QueueEvent(mPreviousTouchEvent);
+  }
+
+  if(mPreviousType == Integration::TouchEventCombiner::DISPATCH_HOVER || mPreviousType == Integration::TouchEventCombiner::DISPATCH_BOTH)
+  {
+    mScene.QueueEvent(mPreviousHoverEvent);
+  }
+
+  if(mPreviousType != Integration::TouchEventCombiner::DISPATCH_NONE)
+  {
     mAdaptor->ProcessCoreEvents();
   }
+
+  mHandledMultiTouch = false;
+  mPreviousType      = Integration::TouchEventCombiner::DISPATCH_NONE;
 }
 
 const Dali::TouchEvent& SceneHolder::GetLastTouchEvent() const
@@ -489,6 +550,8 @@ void SceneHolder::Reset()
   mScene.QueueEvent(event);
 
   // Next the events are processed with a single call into Core
+  mHandledMultiTouch = false;
+  mPreviousType      = Integration::TouchEventCombiner::DISPATCH_NONE;
   mAdaptor->ProcessCoreEvents();
 }
 
index 144bc13..0d984ec 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTEGRATION_INTERNAL_SCENEHOLDER_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -24,6 +24,7 @@
 #include <dali/integration-api/events/key-event-integ.h>
 #include <dali/integration-api/events/point.h>
 #include <dali/integration-api/events/touch-event-combiner.h>
+#include <dali/integration-api/events/touch-event-integ.h>
 #include <dali/integration-api/scene.h>
 #include <dali/public-api/common/intrusive-ptr.h>
 #include <dali/public-api/events/hover-event.h>
@@ -182,6 +183,11 @@ public:
   void FeedTouchPoint(Dali::Integration::Point& point, int timeStamp);
 
   /**
+   * @copydoc Dali::Integration::SceneHolder::FeedMouseFrameEvent
+   */
+  void FeedMouseFrameEvent();
+
+  /**
    * @brief Get the Last Touch Event
    *
    * @return Dali::TouchEvent
@@ -412,8 +418,12 @@ protected:
 
   Uint16Pair mDpi; ///< The DPI for this SceneHolder.
 
-  bool mAdaptorStarted; ///< Whether the adaptor has started or not
-  bool mVisible : 1;    ///< Whether the scene is visible or not
+  bool                                               mAdaptorStarted; ///< Whether the adaptor has started or not
+  bool                                               mVisible : 1;    ///< Whether the scene is visible or not
+  bool                                               mHandledMultiTouch : 1;
+  Integration::TouchEvent                            mPreviousTouchEvent;
+  Integration::HoverEvent                            mPreviousHoverEvent;
+  Integration::TouchEventCombiner::EventDispatchType mPreviousType;
 };
 
 } // namespace Adaptor
index 30e6cf4..ba4e154 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -88,7 +88,7 @@ bool BridgeBase::TickCoalescableMessages()
       if(functor)
       {
         functor();
-        functor = {};
+        functor   = {};
         countdown = countdownBase;
       }
       else
@@ -234,24 +234,25 @@ void BridgeBase::CompressDefaultLabels()
 {
   // Remove entries for objects which no longer exist
   mDefaultLabels.remove_if([](const DefaultLabelType& label) {
-    return !label.first.GetBaseHandle(); // Check window's weak handle
-    // TODO: Once Accessible becomes a handle type, check its weak handle here as well
+    // Check 1) window's weak handle; 2) accessible's ref object
+    return !label.first.GetBaseHandle() || label.second.expired();
   });
 }
 
-void BridgeBase::RegisterDefaultLabel(Accessible* object)
+void BridgeBase::RegisterDefaultLabel(std::shared_ptr<Accessible> object)
 {
   CompressDefaultLabels();
 
-  Dali::WeakHandle<Dali::Window> window = GetWindow(object);
+  Dali::WeakHandle<Dali::Window> window = GetWindow(object.get());
   if(!window.GetBaseHandle()) // true also if `object` is null
   {
     DALI_LOG_ERROR("Cannot register default label: object does not belong to any window");
     return;
   }
 
-  auto it = std::find_if(mDefaultLabels.begin(), mDefaultLabels.end(), [object](const DefaultLabelType& label) {
-    return object == label.second;
+  auto it = std::find_if(mDefaultLabels.begin(), mDefaultLabels.end(), [&object](const DefaultLabelType& label) {
+    auto labelPtr = label.second.lock();
+    return labelPtr && object == labelPtr;
   });
 
   if(it == mDefaultLabels.end())
@@ -270,17 +271,20 @@ void BridgeBase::RegisterDefaultLabel(Accessible* object)
   }
 }
 
-void BridgeBase::UnregisterDefaultLabel(Accessible* object)
+void BridgeBase::UnregisterDefaultLabel(std::shared_ptr<Accessible> object)
 {
   CompressDefaultLabels();
 
-  mDefaultLabels.remove_if([object](const DefaultLabelType& label) {
-    return object == label.second;
+  mDefaultLabels.remove_if([&object](const DefaultLabelType& label) {
+    auto labelPtr = label.second.lock();
+    return labelPtr && object == labelPtr;
   });
 }
 
-Accessible* BridgeBase::GetDefaultLabel(Accessible* root) const
+Accessible* BridgeBase::GetDefaultLabel(Accessible* root)
 {
+  CompressDefaultLabels();
+
   Dali::WeakHandle<Dali::Window> window = GetWindow(root);
   if(!window.GetBaseHandle())
   {
@@ -291,7 +295,16 @@ Accessible* BridgeBase::GetDefaultLabel(Accessible* root) const
     return window == label.first;
   });
 
-  return (it == mDefaultLabels.rend()) ? root : it->second;
+  Accessible* rawPtr = root;
+  if(it != mDefaultLabels.rend())
+  {
+    if(auto labelPtr = it->second.lock())
+    {
+      rawPtr = labelPtr.get();
+    }
+  }
+
+  return rawPtr;
 }
 
 std::string BridgeBase::StripPrefix(const std::string& path)
index 6c72399..2cfcab0 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_ACCESSIBILITY_BRIDGE_BASE_H
 
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -283,12 +283,12 @@ public:
  */
 enum class CoalescableMessages
 {
-  BOUNDS_CHANGED, ///< Bounds changed
-  SET_OFFSET, ///< Set offset
-  POST_RENDER, ///< Post render
-  STATE_CHANGED_BEGIN = 500, ///< State changed (begin of reserved range)
-  STATE_CHANGED_END   = STATE_CHANGED_BEGIN + 99, ///< State changed (end of reserved range)
-  PROPERTY_CHANGED_BEGIN, ///< Property changed (begin of reserved range)
+  BOUNDS_CHANGED,                                     ///< Bounds changed
+  SET_OFFSET,                                         ///< Set offset
+  POST_RENDER,                                        ///< Post render
+  STATE_CHANGED_BEGIN = 500,                          ///< State changed (begin of reserved range)
+  STATE_CHANGED_END   = STATE_CHANGED_BEGIN + 99,     ///< State changed (end of reserved range)
+  PROPERTY_CHANGED_BEGIN,                             ///< Property changed (begin of reserved range)
   PROPERTY_CHANGED_END = PROPERTY_CHANGED_BEGIN + 99, ///< Property changed (end of reserved range)
 };
 
@@ -364,17 +364,17 @@ public:
   /**
    * @copydoc Dali::Accessibility::Bridge::RegisterDefaultLabel()
    */
-  void RegisterDefaultLabel(Dali::Accessibility::Accessible* object) override;
+  void RegisterDefaultLabel(std::shared_ptr<Dali::Accessibility::Accessible> object) override;
 
   /**
    * @copydoc Dali::Accessibility::Bridge::UnregisterDefaultLabel()
    */
-  void UnregisterDefaultLabel(Dali::Accessibility::Accessible* object) override;
+  void UnregisterDefaultLabel(std::shared_ptr<Dali::Accessibility::Accessible> object) override;
 
   /**
    * @copydoc Dali::Accessibility::Bridge::GetDefaultLabel()
    */
-  Dali::Accessibility::Accessible* GetDefaultLabel(Dali::Accessibility::Accessible* root) const override;
+  Dali::Accessibility::Accessible* GetDefaultLabel(Dali::Accessibility::Accessible* root) override;
 
   /**
    * @copydoc Dali::Accessibility::Bridge::GetApplication()
@@ -618,7 +618,7 @@ public:
 
 protected:
   // We use a weak handle in order not to keep a window alive forever if someone forgets to UnregisterDefaultLabel()
-  using DefaultLabelType  = std::pair<Dali::WeakHandle<Dali::Window>, Dali::Accessibility::Accessible*>;
+  using DefaultLabelType  = std::pair<Dali::WeakHandle<Dali::Window>, std::weak_ptr<Dali::Accessibility::Accessible>>;
   using DefaultLabelsType = std::list<DefaultLabelType>;
 
   mutable ApplicationAccessible mApplication;
index a5ed289..7f1166f 100644 (file)
@@ -18,8 +18,8 @@
  *
  */
 
-#include <dali/devel-api/adaptor-framework/accessibility.h>
 #include <dali/devel-api/adaptor-framework/accessibility-bridge.h>
+#include <dali/devel-api/adaptor-framework/accessibility.h>
 
 namespace Dali::Accessibility
 {
@@ -46,15 +46,15 @@ struct DummyBridge : Dali::Accessibility::Bridge
   {
   }
 
-  void RegisterDefaultLabel(Accessibility::Accessible* object) override
+  void RegisterDefaultLabel(std::shared_ptr<Accessibility::Accessible> object) override
   {
   }
 
-  void UnregisterDefaultLabel(Accessibility::Accessible* object) override
+  void UnregisterDefaultLabel(std::shared_ptr<Accessibility::Accessible> object) override
   {
   }
 
-  Dali::Accessibility::Accessible* GetDefaultLabel(Dali::Accessibility::Accessible* root) const override
+  Dali::Accessibility::Accessible* GetDefaultLabel(Dali::Accessibility::Accessible* root) override
   {
     return nullptr;
   }
@@ -170,7 +170,7 @@ struct DummyBridge : Dali::Accessibility::Bridge
   {
   }
 
-  void EmitPostRender(Accessibility::Accessible *obj) override
+  void EmitPostRender(Accessibility::Accessibleobj) override
   {
   }
 
index e783f8f..2fed2c2 100644 (file)
@@ -72,13 +72,18 @@ uint32_t TizenPlatformAbstraction::TimerCallback::sNextTimerId = 0;
 TizenPlatformAbstraction::TizenPlatformAbstraction()
 : mDataStoragePath(""),
   mTimerPairsWaiting(),
-  mTimerPairsSpent()
-
+  mTimerPairsSpent(),
+  mCleanupIdleCallback(nullptr)
 {
 }
 
 TizenPlatformAbstraction::~TizenPlatformAbstraction()
 {
+  if(mCleanupIdleCallback && Dali::Adaptor::IsAvailable())
+  {
+    Dali::Adaptor::Get().RemoveIdle(mCleanupIdleCallback);
+    mCleanupIdleCallback = nullptr;
+  }
 }
 
 ImageDimensions TizenPlatformAbstraction::GetClosestImageSize(const std::string& filename,
@@ -202,20 +207,30 @@ uint32_t TizenPlatformAbstraction::StartTimer(uint32_t milliseconds, CallbackBas
 
 void TizenPlatformAbstraction::CancelTimer(uint32_t timerId)
 {
-  auto iter = std::remove_if(
-    mTimerPairsWaiting.begin(), mTimerPairsWaiting.end(), [&timerId](std::unique_ptr<TimerCallback>& timerCallbackPtr) {
-      if(timerCallbackPtr->mIdNumber == timerId)
-      {
-        timerCallbackPtr->mTimer.Stop();
-        return true;
-      }
-      else
-      {
-        return false;
-      }
-    });
-
-  mTimerPairsWaiting.erase(iter, mTimerPairsWaiting.end());
+  std::vector<std::unique_ptr<TimerCallback> >::iterator timerIter = std::find_if(mTimerPairsWaiting.begin(), mTimerPairsWaiting.end(), [&timerId](std::unique_ptr<TimerCallback>& timerCallbackPtr) {
+    if(timerCallbackPtr->mIdNumber == timerId)
+    {
+      timerCallbackPtr->mTimer.Stop();
+      return true;
+    }
+    else
+    {
+      return false;
+    }
+  });
+
+  if(timerIter == std::end(mTimerPairsWaiting))
+  {
+    DALI_LOG_DEBUG_INFO("TimerId %u Cancelled duplicated.\n", timerId);
+    return;
+  }
+
+  // Move the canceled item to the spent list.
+  std::move(timerIter, timerIter + 1, std::back_inserter(mTimerPairsSpent));
+
+  mTimerPairsWaiting.erase(timerIter, timerIter + 1);
+
+  RequestCleanupTimers();
 }
 
 void TizenPlatformAbstraction::RunTimerFunction(TimerCallback& timerPtr)
@@ -226,26 +241,40 @@ void TizenPlatformAbstraction::RunTimerFunction(TimerCallback& timerPtr)
 
   if(timerIter == std::end(mTimerPairsWaiting))
   {
-    DALI_ASSERT_DEBUG(false);
+    // It might be cancel during callback execute.
+    DALI_LOG_DEBUG_INFO("Timer might be cancelled during execute.\n");
+    return;
   }
 
-  // ...and move it
+  // Move the executed item to the spent list.
   std::move(timerIter, timerIter + 1, std::back_inserter(mTimerPairsSpent));
 
   mTimerPairsWaiting.erase(timerIter, timerIter + 1);
 
-  if(DALI_UNLIKELY(!Dali::Adaptor::IsAvailable() || !Dali::Adaptor::Get().AddIdle(MakeCallback(this, &TizenPlatformAbstraction::CleanupTimers), false)))
-  {
-    DALI_LOG_ERROR("Fail to add idle callback for timer function. Call it synchronously.\n");
-    CleanupTimers();
-  }
+  RequestCleanupTimers();
 }
 
 void TizenPlatformAbstraction::CleanupTimers()
 {
+  // Idler callback called. Remove it.
+  mCleanupIdleCallback = nullptr;
+
   mTimerPairsSpent.clear();
 }
 
+void TizenPlatformAbstraction::RequestCleanupTimers()
+{
+  if(!mCleanupIdleCallback)
+  {
+    mCleanupIdleCallback = MakeCallback(this, &TizenPlatformAbstraction::CleanupTimers);
+    if(DALI_UNLIKELY(!Dali::Adaptor::IsAvailable() || !Dali::Adaptor::Get().AddIdle(mCleanupIdleCallback, false)))
+    {
+      DALI_LOG_ERROR("Fail to add idle callback for timer function. Call it synchronously.\n");
+      CleanupTimers();
+    }
+  }
+}
+
 TizenPlatformAbstraction* CreatePlatformAbstraction()
 {
   return new TizenPlatformAbstraction();
index 995ca78..9cc7652 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_TIZEN_PLATFORM_ABSTRACTION_H
 
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -120,6 +120,11 @@ private:
    */
   void RunTimerFunction(TimerCallback& timerPtr);
 
+  /**
+   * @brief Requests cleanup of timers into idler.
+   */
+  void RequestCleanupTimers();
+
   TizenPlatformAbstraction(const TizenPlatformAbstraction&);            ///< Undefined
   TizenPlatformAbstraction& operator=(const TizenPlatformAbstraction&); ///< Undefined
 
@@ -127,6 +132,8 @@ private:
 
   std::vector<std::unique_ptr<TimerCallback> > mTimerPairsWaiting;
   std::vector<std::unique_ptr<TimerCallback> > mTimerPairsSpent;
+
+  Dali::CallbackBase* mCleanupIdleCallback;
 };
 
 /**
index 66ee64a..4d29e74 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -61,6 +61,7 @@ EventHandler::EventHandler(WindowBase* windowBase, DamageObserver& damageObserve
     windowBase->FocusChangedSignal().Connect(this, &EventHandler::OnFocusChanged);
     windowBase->RotationSignal().Connect(this, &EventHandler::OnRotation);
     windowBase->TouchEventSignal().Connect(this, &EventHandler::OnTouchEvent);
+    windowBase->MouseFrameEventSignal().Connect(this, &EventHandler::OnMouseFrameEvent);
     windowBase->WheelEventSignal().Connect(this, &EventHandler::OnWheelEvent);
     windowBase->KeyEventSignal().Connect(this, &EventHandler::OnKeyEvent);
     windowBase->SelectionDataSendSignal().Connect(this, &EventHandler::OnSelectionDataSend);
@@ -106,6 +107,14 @@ void EventHandler::OnTouchEvent(Integration::Point& point, uint32_t timeStamp)
   }
 }
 
+void EventHandler::OnMouseFrameEvent()
+{
+  for(ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter)
+  {
+    (*iter)->OnMouseFrameEvent();
+  }
+}
+
 void EventHandler::OnWheelEvent(Integration::WheelEvent& wheelEvent)
 {
   for(ObserverContainer::iterator iter = mObservers.begin(), endIter = mObservers.end(); iter != endIter; ++iter)
index 98c868a..70685f8 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_EVENT_HANDLER_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -69,6 +69,11 @@ public:
     virtual void OnTouchPoint(Dali::Integration::Point& point, int timeStamp) = 0;
 
     /**
+     * @brief Deriving classes should override this to be notified when we receive a mouse frame event.
+     */
+    virtual void OnMouseFrameEvent() = 0;
+
+    /**
      * Deriving classes should override this to be notified when we receive a wheel event.
      * @param[in] wheelEvent The wheel event
      */
@@ -157,6 +162,11 @@ private:
   void OnTouchEvent(Integration::Point& point, uint32_t timeStamp);
 
   /**
+   * Called when a mouse frame event is received.
+   */
+  void OnMouseFrameEvent();
+
+  /**
    * Called when a mouse wheel is received.
    */
   void OnWheelEvent(Integration::WheelEvent& wheelEvent);
index 4e993e0..3f5ce84 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -502,6 +502,10 @@ void GlWindow::OnTouchPoint(Dali::Integration::Point& point, int timeStamp)
   mTouchedSignal.Emit(touchEvent);
 }
 
+void GlWindow::OnMouseFrameEvent()
+{
+}
+
 void GlWindow::OnWheelEvent(Dali::Integration::WheelEvent& wheelEvent)
 {
   // TODO:
index 7df776c..46de8bb 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_WINDOWSYSTEM_COMMON_GL_WINDOW_IMPL_H
 
 /*
- * Copyright (c) 2022 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -312,6 +312,11 @@ private:
   void OnTouchPoint(Dali::Integration::Point& point, int timeStamp) override;
 
   /**
+   * @copydoc Dali::Internal::Adaptor::EventHandler::Observer::OnMouseFrameEvent
+   */
+  void OnMouseFrameEvent() override;
+
+  /**
    * @copydoc Dali::Internal::Adaptor::EventHandler::Observer::OnWheelEvent
    */
   void OnWheelEvent(Dali::Integration::WheelEvent& wheelEvent) override;
index a2ff543..a067d9b 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -33,6 +33,7 @@ WindowBase::WindowBase()
   mWindowDamagedSignal(),
   mRotationSignal(),
   mTouchEventSignal(),
+  mMouseFrameEventSignal(),
   mWheelEventSignal(),
   mKeyEventSignal(),
   mSelectionDataSendSignal(),
@@ -95,6 +96,11 @@ WindowBase::TouchEventSignalType& WindowBase::TouchEventSignal()
   return mTouchEventSignal;
 }
 
+WindowBase::MouseFrameEventSignalType& WindowBase::MouseFrameEventSignal()
+{
+  return mMouseFrameEventSignal;
+}
+
 WindowBase::WheelEventSignalType& WindowBase::WheelEventSignal()
 {
   return mWheelEventSignal;
index 7774da3..c46ff17 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_WINDOWSYSTEM_COMMON_WINDOW_BASE_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -85,6 +85,7 @@ public:
 
   // Input events
   typedef Signal<void(Integration::Point&, uint32_t)> TouchEventSignalType;
+  typedef Signal<void()>                              MouseFrameEventSignalType;
   typedef Signal<void(Integration::WheelEvent&)>      WheelEventSignalType;
   typedef Signal<void(Integration::KeyEvent&)>        KeyEventSignalType;
 
@@ -553,7 +554,7 @@ public:
    */
   virtual void SetFrontBufferRendering(bool enable) = 0;
 
-    /**
+  /**
    * @brief Enables or disables front buffer rendering.
    * @return Returns whether front buffer rendering has been enabled or not.
    */
@@ -608,6 +609,11 @@ public:
   TouchEventSignalType& TouchEventSignal();
 
   /**
+   * @brief This signal is emitted when a mouse frame event is received.
+   */
+  MouseFrameEventSignalType& MouseFrameEventSignal();
+
+  /**
    * @brief This signal is emitted when a mouse wheel is received.
    */
   WheelEventSignalType& WheelEventSignal();
@@ -708,6 +714,7 @@ protected:
   DamageSignalType                        mWindowDamagedSignal;
   RotationSignalType                      mRotationSignal;
   TouchEventSignalType                    mTouchEventSignal;
+  MouseFrameEventSignalType               mMouseFrameEventSignal;
   WheelEventSignalType                    mWheelEventSignal;
   KeyEventSignalType                      mKeyEventSignal;
   SelectionSignalType                     mSelectionDataSendSignal;
index 8ea3b47..69e365f 100644 (file)
@@ -1122,6 +1122,11 @@ void Window::OnTouchPoint(Dali::Integration::Point& point, int timeStamp)
   FeedTouchPoint(point, timeStamp);
 }
 
+void Window::OnMouseFrameEvent()
+{
+  FeedMouseFrameEvent();
+}
+
 void Window::OnWheelEvent(Dali::Integration::WheelEvent& wheelEvent)
 {
   FeedWheelEvent(wheelEvent);
index 857bd4d..b0298a3 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_WINDOWSYSTEM_COMMON_WINDOW_IMPL_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -823,6 +823,11 @@ private: // Dali::Internal::Adaptor::EventHandler::Observer
   void OnTouchPoint(Dali::Integration::Point& point, int timeStamp) override;
 
   /**
+   * @copydoc Dali::Internal::Adaptor::EventHandler::Observer::OnMouseFrameEvent
+   */
+  void OnMouseFrameEvent() override;
+
+  /**
    * @copydoc Dali::Internal::Adaptor::EventHandler::Observer::OnWheelEvent
    */
   void OnWheelEvent(Dali::Integration::WheelEvent& wheelEvent) override;
@@ -1024,8 +1029,8 @@ private:
   bool mOpaqueState : 1;
   bool mWindowRotationAcknowledgement : 1;
   bool mFocused : 1;
-  bool mIsWindowRotating : 1;      ///< The window rotating flag.
-  bool mIsEnabledUserGeometry : 1; ///< The user geometry enable flag.
+  bool mIsWindowRotating : 1;            ///< The window rotating flag.
+  bool mIsEnabledUserGeometry : 1;       ///< The user geometry enable flag.
   bool mIsEmittedWindowCreatedEvent : 1; ///< The Window Created Event emit flag for accessibility.
   bool mIsFrontBufferRendering : 1;      ///< The Front Buffer Rendering state.
 };
index 674ef63..1a1f24c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -231,6 +231,8 @@ void WindowBaseCocoa::Impl::OnMouse(NSEvent *event, PointState::Type state)
 
     // timestamp is given in seconds, the signal expects it in milliseconds
     mThis->mTouchEventSignal.Emit(point, event.timestamp * 1000);
+
+    mThis->mMouseFrameEventSignal.Emit();
   }
 }
 
index b394260..a134bdc 100644 (file)
@@ -844,6 +844,8 @@ void WindowBaseEcoreWl::OnMouseButtonDown(void* data, int type, void* event)
     point.SetDeviceSubclass(deviceSubclass);
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
@@ -870,6 +872,8 @@ void WindowBaseEcoreWl::OnMouseButtonUp(void* data, int type, void* event)
     point.SetDeviceSubclass(deviceSubclass);
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
@@ -896,6 +900,8 @@ void WindowBaseEcoreWl::OnMouseButtonMove(void* data, int type, void* event)
     point.SetDeviceSubclass(deviceSubclass);
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
@@ -924,6 +930,8 @@ void WindowBaseEcoreWl::OnMouseButtonCancel(void* data, int type, void* event)
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
 
     DALI_LOG_INFO(gWindowBaseLogFilter, Debug::General, "WindowBaseEcoreWl::OnMouseButtonCancel\n");
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
index 7ebaa1d..cfa6b9d 100644 (file)
@@ -462,6 +462,19 @@ static Eina_Bool EcoreEventMouseButtonMove(void* data, int type, void* event)
 /**
  * Called when a touch motion is received.
  */
+static Eina_Bool EcoreEventMouseFrame(void* data, int type, void* event)
+{
+  WindowBaseEcoreWl2* windowBase = static_cast<WindowBaseEcoreWl2*>(data);
+  if(windowBase)
+  {
+    windowBase->OnMouseFrame(data, type, event);
+  }
+  return ECORE_CALLBACK_PASS_ON;
+}
+
+/**
+ * Called when a touch motion is received.
+ */
 static Eina_Bool EcoreEventMouseButtonRelativeMove(void* data, int type, void* event)
 {
   WindowBaseEcoreWl2* windowBase = static_cast<WindowBaseEcoreWl2*>(data);
@@ -1019,6 +1032,9 @@ void WindowBaseEcoreWl2::Initialize(PositionSize positionSize, Any surface, bool
 
   // Register pointer lock/unlock event
   mEcoreEventHandler.PushBack(ecore_event_handler_add(ECORE_WL2_EVENT_POINTER_CONSTRAINTS, EcoreEventPointerConstraints, this));
+
+  // Register mouse frame events
+  mEcoreEventHandler.PushBack(ecore_event_handler_add(ECORE_EVENT_MOUSE_FRAME, EcoreEventMouseFrame, this));
 #endif
 
   // Register Mouse wheel events
@@ -1313,6 +1329,10 @@ void WindowBaseEcoreWl2::OnMouseButtonDown(void* data, int type, void* event)
     point.SetMouseButton(static_cast<MouseButton::Type>(touchEvent->buttons));
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
+
+#ifndef OVER_TIZEN_VERSION_8
+    mMouseFrameEventSignal.Emit();
+#endif
   }
 }
 
@@ -1342,6 +1362,10 @@ void WindowBaseEcoreWl2::OnMouseButtonUp(void* data, int type, void* event)
     point.SetMouseButton(static_cast<MouseButton::Type>(touchEvent->buttons));
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
+
+#ifndef OVER_TIZEN_VERSION_8
+    mMouseFrameEventSignal.Emit();
+#endif
   }
 }
 
@@ -1370,10 +1394,25 @@ void WindowBaseEcoreWl2::OnMouseButtonMove(void* data, int type, void* event)
     point.SetDeviceSubclass(deviceSubclass);
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
+
+#ifndef OVER_TIZEN_VERSION_8
+    mMouseFrameEventSignal.Emit();
+#endif
   }
 }
 
 #ifdef OVER_TIZEN_VERSION_8
+void WindowBaseEcoreWl2::OnMouseFrame(void* data, int type, void* event)
+{
+  Ecore_Event_Mouse_Frame* MouseFrameEvent = static_cast<Ecore_Event_Mouse_Frame*>(event);
+
+  if(MouseFrameEvent->window == static_cast<unsigned int>(ecore_wl2_window_id_get(mEcoreWindow)) && Dali::Adaptor::IsAvailable())
+  {
+    DALI_TRACE_SCOPE(gTraceFilter, "DALI_ON_MOUSE_FRAME");
+    mMouseFrameEventSignal.Emit();
+  }
+}
+
 void WindowBaseEcoreWl2::OnMouseButtonRelativeMove(void* data, int type, void* event)
 {
   Ecore_Event_Mouse_Relative_Move* relativeMoveEvent = static_cast<Ecore_Event_Mouse_Relative_Move*>(event);
@@ -1421,6 +1460,10 @@ void WindowBaseEcoreWl2::OnMouseButtonCancel(void* data, int type, void* event)
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
 
+#ifndef OVER_TIZEN_VERSION_8
+    mMouseFrameEventSignal.Emit();
+#endif
+
     DALI_LOG_INFO(gWindowBaseLogFilter, Debug::General, "WindowBaseEcoreWl2::OnMouseButtonCancel\n");
   }
 }
index 4ec38e0..1f0bbba 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_INTERNAL_WINDOWSYSTEM_TIZENWAYLAND_WINDOW_BASE_ECORE_WL2_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -106,6 +106,11 @@ public:
   void OnMouseButtonMove(void* data, int type, void* event);
 
   /**
+   * @brief Called when a mouse frame is received.
+   */
+  void OnMouseFrame(void* data, int type, void* event);
+
+  /**
    * @brief Called when a touch motion is received.
    */
   void OnMouseButtonRelativeMove(void* data, int type, void* event);
index fdcfa56..c030877 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -475,6 +475,8 @@ void WindowBaseEcoreX::OnMouseButtonDown(void* data, int type, void* event)
     }
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
@@ -497,6 +499,8 @@ void WindowBaseEcoreX::OnMouseButtonUp(void* data, int type, void* event)
     }
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
@@ -515,6 +519,8 @@ void WindowBaseEcoreX::OnMouseButtonMove(void* data, int type, void* event)
     point.SetAngle(Degree(static_cast<float>(touchEvent->multi.angle)));
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
index 28f67a1..19e9cea 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -132,6 +132,8 @@ void WindowBaseWin::OnMouseButtonDown(int type, TWinEventInfo* event)
     point.SetAngle(Degree(touchEvent.multi.angle));
 
     mTouchEventSignal.Emit(point, touchEvent.timestamp);
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
@@ -156,6 +158,8 @@ void WindowBaseWin::OnMouseButtonUp(int type, TWinEventInfo* event)
     point.SetAngle(Degree(touchEvent.multi.angle));
 
     mTouchEventSignal.Emit(point, touchEvent.timestamp);
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
@@ -180,6 +184,8 @@ void WindowBaseWin::OnMouseButtonMove(int type, TWinEventInfo* event)
     point.SetAngle(Degree(touchEvent.multi.angle));
 
     mTouchEventSignal.Emit(point, touchEvent.timestamp);
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
index da239ee..e5fdce2 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -480,6 +480,8 @@ void WindowBaseX::OnMouseButtonDown(void* data, WindowSystemBase::Event type, Wi
     }
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
@@ -503,6 +505,8 @@ void WindowBaseX::OnMouseButtonUp(void* data, WindowSystemBase::Event type, Wind
     }
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
@@ -521,6 +525,8 @@ void WindowBaseX::OnMouseButtonMove(void* data, WindowSystemBase::Event type, Wi
     point.SetAngle(Degree(static_cast<float>(touchEvent->multi.angle)));
 
     mTouchEventSignal.Emit(point, touchEvent->timestamp);
+
+    mMouseFrameEventSignal.Emit();
   }
 }
 
index cfd8b47..21967cf 100644 (file)
@@ -27,7 +27,7 @@ namespace Dali
 {
 const unsigned int ADAPTOR_MAJOR_VERSION = 2;
 const unsigned int ADAPTOR_MINOR_VERSION = 3;
-const unsigned int ADAPTOR_MICRO_VERSION = 28;
+const unsigned int ADAPTOR_MICRO_VERSION = 29;
 const char* const  ADAPTOR_BUILD_DATE    = __DATE__ " " __TIME__;
 
 #ifdef DEBUG_ENABLED
index 567e0b8..7dab3d6 100644 (file)
@@ -17,7 +17,7 @@
 
 Name:       dali2-adaptor
 Summary:    The DALi Tizen Adaptor
-Version:    2.3.28
+Version:    2.3.29
 Release:    1
 Group:      System/Libraries
 License:    Apache-2.0 and BSD-3-Clause and MIT