1 #ifndef DALI_ATSPI_ACCESSIBILITY_H
\r
2 #define DALI_ATSPI_ACCESSIBILITY_H
\r
4 * Copyright (c) 2019 Samsung Electronics Co., Ltd.
\r
6 * Licensed under the Apache License, Version 2.0 (the "License");
\r
7 * you may not use this file except in compliance with the License.
\r
8 * You may obtain a copy of the License at
\r
10 * http://www.apache.org/licenses/LICENSE-2.0
\r
12 * Unless required by applicable law or agreed to in writing, software
\r
13 * distributed under the License is distributed on an "AS IS" BASIS,
\r
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
15 * See the License for the specific language governing permissions and
\r
16 * limitations under the License.
\r
20 // EXTERNAL INCLUDES
\r
25 #include <exception>
\r
26 #include <functional>
\r
30 #include <unordered_map>
\r
37 // INTERNAL INCLUDES
\r
38 #include <dali/public-api/dali-adaptor-common.h>
\r
42 namespace Accessibility
\r
46 * @brief Enumeration describing a relation between accessible objects
\r
47 * 1 to 0..N relation model is supported. By default relation is not symmetrical.
\r
48 * Symmetry must be explicitly maintained.
\r
50 enum class RelationType : uint32_t
\r
52 NULL_OF, ///< Null Relation.
\r
53 LABEL_FOR, ///< Label For.
\r
54 LABELLED_BY, ///< Labelled By.
\r
55 CONTROLLER_FOR, ///< Controller For.
\r
56 CONTROLLED_BY, ///< Controlled By.
\r
57 MEMBER_OF, ///< Member Of.
\r
58 TOOLTIP_FOR, ///< ToolTip For.
\r
59 NODE_CHILD_OF, ///< Node Child Of.
\r
60 NODE_PARENT_OF, ///< Node Parent Of.
\r
61 EXTENDED, ///< Extended.
\r
62 FLOWS_TO, ///< Flows To.
\r
63 FLOWS_FROM, ///< Flows From.
\r
64 SUBWINDOW_OF, ///< Sub Window Of.
\r
65 EMBEDS, ///< Embeds.
\r
66 EMBEDDED_BY, ///< Embedded By.
\r
67 POPUP_FOR, ///< Popup For
\r
68 PARENT_WINDOW_OF, ///< Parent Window Of.
\r
69 DESCRIPTION_FOR, ///< Description For.
\r
70 DESCRIBED_BY, ///< Described By.
\r
71 DETAILS, ///< Details.
\r
72 DETAILS_FOR, ///< Details For.
\r
73 ERROR_MESSAGE, ///< Error Message.
\r
74 ERROR_FOR, ///< Error For.
\r
79 * @brief Enumeration describing if coordinates are relative to screen or window
\r
80 * @see Accessibility::Component::GetExtents
\r
81 * @see Accessibility::Component::Contains
\r
83 enum class CoordType
\r
85 SCREEN, ///< Screen.
\r
90 * @brief Enumeration indicating relative stacking order
\r
91 * ComponentLayer allows to describe visibility of all parts of UI
\r
92 * basing on the concrete stacking order
\r
93 * @see Accessibility::Component::GetLayer
\r
94 * @note currently only ComponentLayer::Window is supported
\r
96 enum class ComponentLayer
\r
98 INVALID, ///< Invalid.
\r
99 BACKGROUND, ///< Background.
\r
100 CANVAS, ///< Canvas.
\r
101 WIDGET, ///< Widget.
\r
104 OVERLAY, ///< Overlay.
\r
105 WINDOW, ///< Window.
\r
110 * @brief Enumeration describing role of the Accessibility object
\r
111 * Object can be described by only one role.
\r
112 * @see Accessibility::Accessible::GetRole
\r
114 enum class Role : uint32_t
\r
173 TABLE_COLUMN_HEADER,
\r
205 INPUT_METHOD_WINDOW,
\r
208 DOCUMENT_SPREADSHEET,
\r
209 DOCUMENT_PRESENTATION,
\r
241 * @brief Enumeration describing states of the Accessibility object
\r
242 * Object can be in many states at the same time.
\r
243 * @see Accessibility::Accessible::GetStates
\r
245 enum class State : uint32_t
\r
278 MANAGES_DESCENDANTS,
\r
284 SUPPORTS_AUTOCOMPLETION,
\r
297 * @brief Enumeration describing change of text object
\r
299 enum class TextChangedState : uint32_t
\r
307 * @brief Enumeration describing change of object property
\r
309 enum class ObjectPropertyChangeEvent
\r
319 * @brief Enumeration describing change of window object
\r
320 * @see Accessibility::Accessible::Emit
\r
322 enum class WindowEvent
\r
346 * @brief Enumeration used to acquire bounded text from accessible object having textual content.
\r
347 * @see Accessibility::Text::GetTextAtOffset
\r
348 * @note Currently only TextBoundary::Character is supported
\r
350 enum class TextBoundary : uint32_t
\r
352 CHARACTER, ///> Only one character is acquired.
\r
353 WORD, ///> Not supported.
\r
354 SENTENCE, ///> Not supported.
\r
355 LINE, ///> Not supported.
\r
356 PARAGRAPH, ///> Not supported.
\r
361 * @brief Enumeration describing type of gesture
\r
362 * @see Accessibility::Accessible::DoGesture
\r
364 enum class Gesture : int32_t
\r
368 THREE_FINGER_HOVER,
\r
369 ONE_FINGER_FLICK_LEFT,
\r
370 ONE_FINGER_FLICK_RIGHT,
\r
371 ONE_FINGER_FLICK_UP,
\r
372 ONE_FINGER_FLICK_DOWN,
\r
373 TWO_FINGERS_FLICK_LEFT,
\r
374 TWO_FINGERS_FLICK_RIGHT,
\r
375 TWO_FINGERS_FLICK_UP,
\r
376 TWO_FINGERS_FLICK_DOWN,
\r
377 THREE_FINGERS_FLICK_LEFT,
\r
378 THREE_FINGERS_FLICK_RIGHT,
\r
379 THREE_FINGERS_FLICK_UP,
\r
380 THREE_FINGERS_FLICK_DOWN,
\r
381 ONE_FINGER_SINGLE_TAP,
\r
382 ONE_FINGER_DOUBLE_TAP,
\r
383 ONE_FINGER_TRIPLE_TAP,
\r
384 TWO_FINGERS_SINGLE_TAP,
\r
385 TWO_FINGERS_DOUBLE_TAP,
\r
386 TWO_FINGERS_TRIPLE_TAP,
\r
387 THREE_FINGERS_SINGLE_TAP,
\r
388 THREE_FINGERS_DOUBLE_TAP,
\r
389 THREE_FINGERS_TRIPLE_TAP,
\r
390 ONE_FINGER_FLICK_LEFT_RETURN,
\r
391 ONE_FINGER_FLICK_RIGHT_RETURN,
\r
392 ONE_FINGER_FLICK_UP_RETURN,
\r
393 ONE_FINGER_FLICK_DOWN_RETURN,
\r
394 TWO_FINGERS_FLICK_LEFT_RETURN,
\r
395 TWO_FINGERS_FLICK_RIGHT_RETURN,
\r
396 TWO_FINGERS_FLICK_UP_RETURN,
\r
397 TWO_FINGERS_FLICK_DOWN_RETURN,
\r
398 THREE_FINGERS_FLICK_LEFT_RETURN,
\r
399 THREE_FINGERS_FLICK_RIGHT_RETURN,
\r
400 THREE_FINGERS_FLICK_UP_RETURN,
\r
401 THREE_FINGERS_FLICK_DOWN_RETURN,
\r
402 ONE_FINGER_DOUBLE_TAP_N_HOLD,
\r
403 TWO_FINGERS_DOUBLE_TAP_N_HOLD,
\r
404 THREE_FINGERS_DOUBLE_TAP_N_HOLD,
\r
409 * @brief Enumeration indicating current state of gesture
\r
410 * @see Dali::Accessibility::GestureInfo
\r
412 enum class GestureState : int32_t
\r
421 * @brief Enumeration of ReadingInfoType
\r
423 enum class ReadingInfoType
\r
432 * @brief Helper class for storing values treated as bit sets
\r
433 * This class provides all bitset-like methods for bitset size larger, than long long int
\r
434 * @see Dali::Accessibility::Accessible::GetStates
\r
435 * @see Dali::Accessibility::Accessible::GetRoles
\r
437 template < size_t I, typename S >
\r
440 std::array< uint32_t, I > data;
\r
446 static constexpr bool _accepts()
\r
451 template < typename T > static constexpr bool _accepts()
\r
453 return std::is_enum< T >::value;
\r
456 template < typename T, typename T2, typename ... ARGS > static constexpr bool _accepts()
\r
458 return std::is_enum< T >::value && _accepts< T2, ARGS... >();
\r
461 template < typename T, typename ... ARGS > void _set(T t, ARGS ... args)
\r
469 for( auto& u : data )
\r
474 BitSets(const BitSets&) = default;
\r
475 BitSets(BitSets&&) = default;
\r
477 template < typename T, typename ... ARGS, typename std::enable_if< _accepts< T, ARGS... >() >::type * = nullptr >BitSets( T t, ARGS ... args )
\r
479 for( auto& u : data )
\r
481 _set( t, args... );
\r
484 explicit BitSets( std::array< uint32_t, I > d )
\r
486 for( auto i = 0u; i < I; ++i )
\r
492 explicit BitSets( std::array< int32_t, I > d )
\r
494 for( auto i = 0u; i < I; ++i )
\r
496 data[i] = static_cast<uint32_t>( d[i] );
\r
500 BitSets& operator = (const BitSets&) = default;
\r
501 BitSets& operator = (BitSets&&) = default;
\r
505 std::array< uint32_t, I >& data;
\r
508 reference& operator=( reference r )
\r
510 (*this) = static_cast<bool>( r );
\r
514 reference& operator=( bool v )
\r
518 data[pos / 32] |= 1 << (pos & 31);
\r
522 data[pos / 32] &= ~(1 << (pos & 31));
\r
527 operator bool() const
\r
529 auto i = static_cast<size_t>( pos );
\r
530 return (data[i / 32] & (1 << (i & 31))) != 0;
\r
534 reference operator[]( S index )
\r
536 return { data, static_cast<size_t>( index ) };
\r
539 bool operator[]( S index ) const
\r
541 auto i = static_cast<size_t>( index );
\r
542 return ( data[i / 32] & ( 1 << (i & 31) ) ) != 0;
\r
545 std::array< uint32_t, I > GetRawData() const
\r
550 BitSets operator|( BitSets b ) const
\r
553 for( auto i = 0u; i < I; ++i )
\r
555 r.data[i] = data[i] | b.data[i];
\r
560 BitSets operator^( BitSets b ) const
\r
563 for( auto i = 0u; i < I; ++i )
\r
565 r.data[i] = data[i] ^ b.data[i];
\r
570 BitSets operator&( BitSets b ) const
\r
573 for( auto i = 0u; i < I; ++i )
\r
575 r.data[i] = data[i] & b.data[i];
\r
580 bool operator==( BitSets b ) const
\r
582 for( auto i = 0u; i < I; ++i )
\r
584 if( data[i] != b.data[i] )
\r
592 bool operator!=(BitSets b) const
\r
594 return !((*this) == b);
\r
597 explicit operator bool() const
\r
599 for( auto& u : data )
\r
609 size_t size() const
\r
615 using ReadingInfoTypes = BitSets<1, ReadingInfoType>;
\r
616 using States = BitSets< 2, State >;
\r
617 using Attributes = std::unordered_map< std::string, std::string >;
\r
620 * @brief Class representing unique object address on accessibility bus
\r
621 * @see Dali::Accessibility::Accessible::GetAddress
\r
623 class DALI_ADAPTOR_API Address
\r
626 Address() = default;
\r
628 Address( std::string bus, std::string path )
\r
629 : mBus(std::move(bus)),
\r
630 mPath(std::move(path))
\r
634 explicit operator bool() const
\r
636 return !mPath.empty();
\r
639 std::string ToString() const
\r
641 return *this ? mBus + ":" + mPath : "::null";
\r
644 const std::string& GetBus() const;
\r
646 const std::string& GetPath() const
\r
651 bool operator == ( const Address& a ) const
\r
653 return mBus == a.mBus && mPath == a.mPath;
\r
656 bool operator != ( const Address& a ) const
\r
658 return !(*this == a);
\r
662 mutable std::string mBus, mPath;
\r
666 * @brief Enumeration describing type of key event
\r
667 * @see Adaptor::AccessibilityObserver::OnAccessibleKeyEvent
\r
669 enum class KeyEventType
\r
676 * @brief Enumeration with human readable values describing state of event
\r
677 * @see Dali::Accessibility::Bridge::Emit
\r
679 enum class Consumed
\r
686 * @brief Helper class representing two dimensional point with integer coordinates
\r
688 struct DALI_ADAPTOR_API Point
\r
695 Point( int x, int y )
\r
701 bool operator==(Point p) const
\r
703 return x == p.x && y == p.y;
\r
705 bool operator!=(Point p) const
\r
707 return !(*this == p);
\r
712 * @brief Helper class representing size of rectangle object with usage of two integer values
\r
714 struct DALI_ADAPTOR_API Size
\r
727 bool operator==( Size p ) const
\r
729 return width == p.width && height == p.height;
\r
732 bool operator!=( Size p ) const
\r
734 return !(*this == p);
\r
739 * @brief Helper class used to store data related with Accessibility::Text interface
\r
740 * @see Dali::Accessibility::Text::GetTextAtOffset
\r
741 * @see Dali::Accessibility::Text::GetSelection
\r
743 struct DALI_ADAPTOR_API Range
\r
745 int32_t startOffset = 0;
\r
746 int32_t endOffset = 0;
\r
747 std::string content;
\r
751 Range(size_t start, size_t end)
\r
752 : startOffset(start),
\r
757 Range(size_t start, size_t end, std::string content)
\r
758 : startOffset(start),
\r
766 * @brief Structure containing all values needed to invoke Accessible::DoGesture
\r
767 * type : numerated gesture type
\r
768 * xBeg, yBeg : point where gesture begins
\r
769 * xEnd, yEnd : point where gesture ends
\r
770 * state : enumerated state of gesture
\r
771 * eventTime : time when event occured
\r
772 * @see Dali::Accessibility::Accessible::DoGesture
\r
774 struct DALI_ADAPTOR_API GestureInfo
\r
776 GestureInfo() = default;
\r
777 GestureInfo(Gesture type, int32_t xBeg, int32_t xEnd, int32_t yBeg, int32_t yEnd, GestureState state, uint32_t eventTime)
\r
784 eventTime(eventTime)
\r
793 GestureState state{};
\r
794 uint32_t eventTime{};
\r
798 * @brief Class representing accessibility relations
\r
799 * Class connecting one source object with multiple target objects with usage
\r
800 * of specific relation type.
\r
801 * @note std::string representing source and targets are string values of Accessibility::Address
\r
802 * @see Dali::Accessibility::Accessible::Address
\r
803 * @see Dali::Accessibility::Accessible::RelationType
\r
805 struct DALI_ADAPTOR_API Relation
\r
807 Relation(RelationType relationType, std::vector<Address> targets)
\r
808 : relationType(relationType),
\r
813 RelationType relationType;
\r
814 std::vector<Address> targets;
\r
817 } // namespace Accessibility
\r
818 } // namespace Dali
\r
820 #endif // DALI_ATSPI_ACCESSIBILITY_H
\r