[AT-SPI] Implement Component in ApplicationAccessible 56/275656/9
authorArtur Świgoń <a.swigon@samsung.com>
Fri, 27 May 2022 18:34:17 +0000 (20:34 +0200)
committerArtur Świgoń <a.swigon@samsung.com>
Thu, 7 Jul 2022 15:44:47 +0000 (17:44 +0200)
When ApplicationAccessible is embedded in another process (i.e. it is a
widget), then it needs to have the Component interface for its subtree
to be considered during navigation (e.g. moving the highlight frame
between the parent process and the embedded process).

Change-Id: Id7eaae3c76061ca16448f115d99206b142cc429b

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

index 1db8cc4..47b4767 100644 (file)
@@ -39,6 +39,7 @@
 class ApplicationAccessible : public virtual Dali::Accessibility::Accessible,
                               public virtual Dali::Accessibility::Application,
                               public virtual Dali::Accessibility::Collection,
+                              public virtual Dali::Accessibility::Component,
                               public virtual Dali::Accessibility::Socket
 {
 public:
@@ -157,6 +158,8 @@ public:
     return {"", "root"};
   }
 
+  // Application
+
   std::string GetToolkitName() const override
   {
     return mToolkitName;
@@ -167,6 +170,8 @@ public:
     return std::to_string(Dali::ADAPTOR_MAJOR_VERSION) + "." + std::to_string(Dali::ADAPTOR_MINOR_VERSION);
   }
 
+  // Socket
+
   Dali::Accessibility::Address Embed(Dali::Accessibility::Address plug) override
   {
     mIsEmbedded = true;
@@ -183,6 +188,71 @@ public:
       mParent.SetAddress({});
     }
   }
+
+  // Component
+
+  Dali::Rect<> GetExtents(Dali::Accessibility::CoordinateType type) const override
+  {
+    using limits = std::numeric_limits<float>;
+
+    float minX = limits::max();
+    float minY = limits::max();
+    float maxX = limits::min();
+    float maxY = limits::min();
+
+    for(Dali::Accessibility::Accessible* child : mChildren)
+    {
+      auto* component = Dali::Accessibility::Component::DownCast(child);
+      if(!component)
+      {
+        continue;
+      }
+
+      auto extents = component->GetExtents(type);
+
+      minX = std::min(minX, extents.x);
+      minY = std::min(minY, extents.y);
+      maxX = std::max(maxX, extents.x + extents.width);
+      maxY = std::max(maxY, extents.y + extents.height);
+    }
+
+    return {minX, minY, maxX - minX, maxY - minY};
+  }
+
+  Dali::Accessibility::ComponentLayer GetLayer() const override
+  {
+    return Dali::Accessibility::ComponentLayer::WINDOW;
+  }
+
+  std::int16_t GetMdiZOrder() const override
+  {
+    return 0;
+  }
+
+  bool GrabFocus() override
+  {
+    return false;
+  }
+
+  double GetAlpha() const override
+  {
+    return 0.0;
+  }
+
+  bool GrabHighlight() override
+  {
+    return false;
+  }
+
+  bool ClearHighlight() override
+  {
+    return false;
+  }
+
+  bool IsScrollable() const override
+  {
+    return false;
+  }
 };
 
 /**