[AT-SPI] Do not subtract extentOffset if it's a sub window of Widget 89/318389/4
authorYoungsun Suh <youngsun.suh@samsung.com>
Mon, 2 Dec 2024 09:12:03 +0000 (18:12 +0900)
committerSeoyeon Kim <seoyeon2.kim@samsung.com>
Mon, 20 Jan 2025 02:28:11 +0000 (11:28 +0900)
Change-Id: Ic377579fc9b45510b37e1612baf9b7925308f584

dali/internal/accessibility/bridge/bridge-accessible.cpp
dali/internal/accessibility/bridge/bridge-base.h

index b6f01de954a407d65ce3f431724dccc55f9a3a0c..d0033032349c2be330ec1be05668fcd71708f287 100644 (file)
@@ -25,6 +25,7 @@
 #include <iostream>
 
 // INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/window-devel.h>
 #include <dali/devel-api/atspi-interfaces/accessible.h>
 #include <dali/devel-api/atspi-interfaces/component.h>
 #include <dali/devel-api/atspi-interfaces/selection.h>
@@ -45,6 +46,17 @@ constexpr const char* VALUE_FORMAT_KEY      = "value_format";
 constexpr const char* VALUE_FORMAT_TEXT_VAL = "text";
 constexpr const char* FORCE_CHILD_SEARCH_ATTR{"forceChildSearch"};
 
+bool IsSubWindow(Accessible* accessible)
+{
+  auto baseHandle = BridgeBase::GetWindow(accessible->GetInternalActor()).GetBaseHandle();
+  if(baseHandle)
+  {
+    auto window = Dali::Window::DownCast(baseHandle);
+    return DALI_LIKELY(Dali::DevelWindow::GetParent(window));
+  }
+  return false;
+}
+
 bool SortVertically(Component* lhs, Component* rhs)
 {
   auto leftRect  = lhs->GetExtents(CoordinateType::WINDOW);
@@ -685,8 +697,12 @@ DBus::ValueOrError<Accessible*, uint8_t, Accessible*> BridgeAccessible::GetNavig
   auto        accessible = FindSelf();
   auto        cType      = static_cast<CoordinateType>(coordinateType);
 
-  x -= mData->mExtentsOffset.first;
-  y -= mData->mExtentsOffset.second;
+  const bool hasExtentsOffset = mData->mExtentsOffset.first != 0 || mData->mExtentsOffset.second != 0;
+  if(hasExtentsOffset && !IsSubWindow(accessible))
+  {
+    x -= mData->mExtentsOffset.first;
+    y -= mData->mExtentsOffset.second;
+  }
 
   LOG() << "GetNavigableAtPoint: " << x << ", " << y << " type: " << coordinateType;
   auto component = CalculateNavigableAccessibleAtPoint(accessible, {x, y}, cType, GET_NAVIGABLE_AT_POINT_MAX_RECURSION_DEPTH);
index 174c0fb3b42cb9684a27ecc544f2f84b05336b86..3a083240a3b090a208a7c1495eb7c88f419552ac 100644 (file)
@@ -638,6 +638,14 @@ public:
     mApplication.mToolkitName = std::string{toolkitName};
   }
 
+  /**
+   * @brief Gets the window to which this actor belongs (or an empty handle).
+   *
+   * @param actor The actor
+   * @return The window
+   */
+  static Dali::WeakHandle<Dali::Window> GetWindow(Dali::Actor actor);
+
 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::WeakHandle<Dali::Actor>>;
@@ -700,14 +708,6 @@ private:
    */
   void CompressDefaultLabels();
 
-  /**
-   * @brief Gets the window to which this actor belongs (or an empty handle).
-   *
-   * @param actor The actor
-   * @return The window
-   */
-  static Dali::WeakHandle<Dali::Window> GetWindow(Dali::Actor actor);
-
 protected:
   BridgeBase();
   virtual ~BridgeBase();