From a9d56fc12792cd84a5d41568dc0bbf26157f4334 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Artur=20=C5=9Awigo=C5=84?= Date: Thu, 25 Nov 2021 14:38:45 +0100 Subject: [PATCH 1/1] [AT-SPI] Change the type of Control::Impl::mAccessibilityRelations This patch changes the relation's target type from `Accessibility::Address` to `Accessibility::Accessible*`. `AppendAccessibilityRelation()` does not allow to specify a remote object anyway, because the parameter types are `Actor`s. Moreover, the `Address` may be incomplete (specifically the DBus-dependent part) if the above API is called too early. With this change, the `Accessible::GetAddress()` call is postponed until the relations are queried over DBus. Change-Id: I881d7fb90eba79b6ba9752e913d113272485e29a --- .../devel-api/controls/accessible-impl.cpp | 19 +++++++++++---- dali-toolkit/devel-api/controls/control-devel.cpp | 28 ++++++++++++++++------ .../internal/controls/control/control-data-impl.h | 2 +- 3 files changed, 37 insertions(+), 12 deletions(-) diff --git a/dali-toolkit/devel-api/controls/accessible-impl.cpp b/dali-toolkit/devel-api/controls/accessible-impl.cpp index 1cf9a26..a962abf 100644 --- a/dali-toolkit/devel-api/controls/accessible-impl.cpp +++ b/dali-toolkit/devel-api/controls/accessible-impl.cpp @@ -536,12 +536,23 @@ std::vector AccessibleImpl::GetRelationSet() std::vector ret; - auto& relation = controlImpl.mAccessibilityRelations; - for(auto i = 0u; i < relation.size(); ++i) + auto& relations = controlImpl.mAccessibilityRelations; + for(auto i = 0u; i < relations.size(); ++i) { - if(relation[i].empty()) continue; + auto& relation = relations[i]; - ret.emplace_back(Accessibility::Relation{static_cast(i), relation[i]}); + if(relation.empty()) + { + continue; + } + + // Map every Accessible* to its Address + std::vector targets; + std::transform(relation.begin(), relation.end(), std::back_inserter(targets), [](auto* x) { + return x->GetAddress(); + }); + + ret.emplace_back(Accessibility::Relation{static_cast(i), std::move(targets)}); } return ret; diff --git a/dali-toolkit/devel-api/controls/control-devel.cpp b/dali-toolkit/devel-api/controls/control-devel.cpp index dc7a128..ccf624b 100644 --- a/dali-toolkit/devel-api/controls/control-devel.cpp +++ b/dali-toolkit/devel-api/controls/control-devel.cpp @@ -193,7 +193,7 @@ void AppendAccessibilityRelation(Dali::Actor control, Actor destination, Dali::A auto object = controlDataImpl->GetAccessibilityObject(destination); if(object) { - controlDataImpl->mAccessibilityRelations[index].push_back(object->GetAddress()); + controlDataImpl->mAccessibilityRelations[index].push_back(object); } } } @@ -215,15 +215,14 @@ void RemoveAccessibilityRelation(Dali::Actor control, Actor destination, Dali::A return; } - auto address = object->GetAddress(); - auto& targets = controlDataImpl->mAccessibilityRelations[index]; for(auto i = 0u; i < targets.size(); ++i) { - if(targets[i].ToString() == address.ToString()) + if(targets[i] == object) { - targets[i] = targets.back(); - targets.erase(targets.end() - 1); + std::swap(targets[i], targets.back()); + targets.pop_back(); + --i; } } } @@ -233,8 +232,23 @@ std::vector> GetAccessibilityRelations(Dali: { if(auto controlDataImpl = GetControlImplementation(control)) { - return controlDataImpl->mAccessibilityRelations; + auto& relations = controlDataImpl->mAccessibilityRelations; + + std::vector> result(relations.size()); + + // Map every Accessible* to its Address + for(std::size_t i = 0; i < relations.size(); ++i) + { + auto& relation = relations[i]; + + std::transform(relation.begin(), relation.end(), std::back_inserter(result[i]), [](auto* x) { + return x->GetAddress(); + }); + } + + return result; } + return {}; } diff --git a/dali-toolkit/internal/controls/control/control-data-impl.h b/dali-toolkit/internal/controls/control/control-data-impl.h index 55c49a6..5b2cee5 100644 --- a/dali-toolkit/internal/controls/control/control-data-impl.h +++ b/dali-toolkit/internal/controls/control/control-data-impl.h @@ -546,7 +546,7 @@ public: Dali::Accessibility::Role mAccessibilityRole = Dali::Accessibility::Role::UNKNOWN; - std::vector> mAccessibilityRelations; + std::vector> mAccessibilityRelations; std::function(Actor)> mAccessibilityConstructor; std::unique_ptr mAccessibilityObject; -- 2.7.4