1 #ifndef ATSPI_BRIDGE_HPP
2 #define ATSPI_BRIDGE_HPP
4 #include <dali/public-api/actors/actor.h>
5 #include <dali/public-api/adaptor-framework/accessibility.h>
13 #include <unordered_map>
18 namespace Accessibility
27 using ObjectsMapType = std::unordered_map< unsigned int, Accessible* >;
29 struct DALI_IMPORT_API Bridge
37 enum class ForceUpResult
42 virtual ~Bridge() = default;
44 virtual const std::string& GetBusName() const = 0;
45 virtual void SetApplicationChild( Accessible* ) = 0;
46 virtual void SetApplicationName( std::string ) = 0;
47 virtual Accessible* GetApplication() const = 0;
48 virtual Accessible* FindByPath( const std::string& ) const = 0;
49 virtual void ApplicationShown() = 0;
50 virtual void ApplicationHidden() = 0;
51 virtual void Initialize() = 0;
52 virtual ForceUpResult ForceUp()
55 return ForceUpResult::alreadyUp;
56 data = std::make_shared< Data >();
58 return ForceUpResult::justStarted;
60 virtual void ForceDown()
64 bool IsUp() const { return bool(data); }
66 virtual void EmitStateChanged( Accessible* obj, State state, int val1, int val2 = 0 ) = 0;
67 virtual void Emit( Accessible* obj, WindowEvent we, unsigned int detail1 = 0 ) = 0;
68 virtual Consumed Emit( KeyEventType type, unsigned int keyCode, const std::string& keyName, unsigned int timeStamp, bool isText ) = 0;
69 void MakePublic( Visibility );
71 static Bridge* GetCurrentBridge();
76 ObjectsMapType objects;
77 std::atomic< unsigned int > objectId;
79 Accessible* root = nullptr;
80 Bridge* bridge = nullptr;
82 std::shared_ptr< Data > data;
83 friend class Accessible;
85 void RegisterOnBridge( Accessible* );
86 void SetIsOnRootLevel( Accessible* );
91 return Bridge::GetCurrentBridge()->IsUp();
94 class DALI_IMPORT_API Accessible
99 Accessible( const Accessible& ) = delete;
100 Accessible( Accessible&& ) = delete;
102 Accessible& operator=( const Accessible& ) = delete;
103 Accessible& operator=( Accessible&& ) = delete;
106 virtual ~Accessible();
108 void EmitShowing( bool showing );
109 void EmitVisible( bool visible );
110 void EmitHighlighted( bool set );
111 void Emit( WindowEvent we, unsigned int detail1 = 0 );
113 virtual std::string GetName() = 0;
114 virtual std::string GetDescription() = 0;
115 virtual Accessible* GetParent() = 0;
116 virtual size_t GetChildCount() = 0;
117 virtual std::vector< Accessible* > GetChildren();
118 virtual Accessible* GetChildAtIndex( size_t index ) = 0;
119 virtual size_t GetIndexInParent() = 0;
120 virtual Role GetRole() = 0;
121 virtual std::string GetRoleName();
122 virtual std::string GetLocalizedRoleName();
123 virtual States GetStates() = 0;
124 virtual Attributes GetAttributes() = 0;
125 virtual bool IsProxy();
126 virtual Address GetAddress();
128 std::vector< std::string > GetInterfaces();
129 bool GetIsOnRootLevel() const { return isOnRootLevel; }
131 static void RegisterControlAccessibilityGetter( std::function< Accessible*( Dali::Actor ) > );
132 static Accessible* Get( Dali::Actor actor );
135 std::shared_ptr< Bridge::Data > GetBridgeData();
140 std::weak_ptr< Bridge::Data > bridgeData;
141 ObjectsMapType::iterator it;
142 bool isOnRootLevel = false;
145 class DALI_IMPORT_API Action : public virtual Accessible
148 virtual std::string GetActionName( size_t index ) = 0;
149 virtual std::string GetLocalizedActionName( size_t index ) = 0;
150 virtual std::string GetActionDescription( size_t index ) = 0;
151 virtual std::string GetActionKeyBinding( size_t index ) = 0;
152 virtual size_t GetActionCount() = 0;
153 virtual bool DoAction( size_t index ) = 0;
156 class DALI_IMPORT_API Collection : public virtual Accessible
161 class DALI_IMPORT_API Component : public virtual Accessible
164 virtual Rectangle GetExtents( CoordType ctype ) = 0;
165 virtual ComponentLayer GetLayer() = 0;
166 virtual int GetMdiZOrder() = 0;
167 virtual bool GrabFocus() = 0;
168 virtual double GetAlpha() = 0;
169 virtual bool SetExtents( Rectangle rect, CoordType ctype ) = 0;
170 virtual bool GrabHighlight() = 0;
171 virtual bool ClearHighlight() = 0;
172 virtual int GetHighlightIndex() = 0;
173 virtual bool IsScrollable();
174 virtual Component* GetAccessibleAtPoint( Point p, CoordType ctype );
175 virtual bool Contains( Point p, CoordType ctype );
178 class DALI_IMPORT_API Value : public virtual Accessible
181 virtual double GetMinimum() = 0;
182 virtual double GetCurrent() = 0;
183 virtual double GetMaximum() = 0;
184 virtual bool SetCurrent( double ) = 0;
185 virtual double GetMinimumIncrement() = 0;
188 class DALI_IMPORT_API Text : public virtual Accessible
191 virtual std::string GetText( size_t startOffset, size_t endOffset ) = 0;
192 virtual size_t GetCharacterCount() = 0;
193 virtual Range GetTextAtOffset( size_t offset, TextBoundary boundary ) = 0;
194 virtual Range GetSelection( size_t selectionNum ) = 0;
195 virtual bool RemoveSelection( size_t selectionNum ) = 0;
196 virtual bool SetSelection( size_t selectionNum, size_t startOffset, size_t endOffset ) = 0;
199 class DALI_IMPORT_API EditableText : public virtual Accessible
202 virtual bool CopyText( size_t startPosition, size_t endPosition ) = 0;
203 virtual bool CutText( size_t startPosition, size_t endPosition ) = 0;
207 * @brief minimalistic, always empty Accessible object with settable address
209 * For those situations, where you want to return address in different bridge
210 * (embedding for example), but the object itself ain't planned to be used otherwise.
211 * This object has null parent, no children, empty name and so on
213 class DALI_IMPORT_API EmptyAccessibleWithAddress : public virtual Accessible
216 EmptyAccessibleWithAddress() = default;
217 EmptyAccessibleWithAddress( Address address ) : address( std::move( address ) ) {}
219 void SetAddress( Address address ) { this->address = std::move( address ); }
221 std::string GetName() override { return ""; }
222 std::string GetDescription() override { return ""; }
223 Accessible* GetParent() override { return nullptr; }
224 size_t GetChildCount() override { return 0; }
225 std::vector< Accessible* > GetChildren() override { return {}; }
226 Accessible* GetChildAtIndex( size_t index ) override
228 throw AccessibleError{"out of bounds index (" + std::to_string( index ) + ") - no children"};
230 size_t GetIndexInParent() override { return static_cast< size_t >( -1 ); }
231 Role GetRole() override { return {}; }
232 std::string GetRoleName() override;
233 States GetStates() override { return {}; }
234 Attributes GetAttributes() override { return {}; }
235 Address GetAddress() override
244 std::shared_ptr< Bridge > CreateBridge();