atspi 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.yardopts +2 -0
  4. data/Gemfile +3 -0
  5. data/LICENSE.txt +21 -0
  6. data/README.md +69 -0
  7. data/Rakefile +2 -0
  8. data/atspi.gemspec +23 -0
  9. data/bin/console +7 -0
  10. data/lib/atspi/accessible/action.rb +45 -0
  11. data/lib/atspi/accessible/children/selected.rb +32 -0
  12. data/lib/atspi/accessible/children.rb +72 -0
  13. data/lib/atspi/accessible/descendants/attribute_filter.rb +32 -0
  14. data/lib/atspi/accessible/descendants/interface_filter.rb +24 -0
  15. data/lib/atspi/accessible/descendants/name_filter.rb +18 -0
  16. data/lib/atspi/accessible/descendants/options.rb +49 -0
  17. data/lib/atspi/accessible/descendants/role_filter.rb +23 -0
  18. data/lib/atspi/accessible/descendants/state_filter.rb +23 -0
  19. data/lib/atspi/accessible/descendants.rb +278 -0
  20. data/lib/atspi/accessible/document.rb +26 -0
  21. data/lib/atspi/accessible/extents.rb +129 -0
  22. data/lib/atspi/accessible/hyperlink/anchor.rb +30 -0
  23. data/lib/atspi/accessible/hyperlink.rb +31 -0
  24. data/lib/atspi/accessible/image.rb +35 -0
  25. data/lib/atspi/accessible/selectable.rb +47 -0
  26. data/lib/atspi/accessible/table/cell/columns.rb +44 -0
  27. data/lib/atspi/accessible/table/cell/rows.rb +44 -0
  28. data/lib/atspi/accessible/table/cell.rb +18 -0
  29. data/lib/atspi/accessible/table/cells.rb +37 -0
  30. data/lib/atspi/accessible/table/column.rb +59 -0
  31. data/lib/atspi/accessible/table/columns/selected.rb +42 -0
  32. data/lib/atspi/accessible/table/columns.rb +34 -0
  33. data/lib/atspi/accessible/table/row.rb +59 -0
  34. data/lib/atspi/accessible/table/rows/selected.rb +42 -0
  35. data/lib/atspi/accessible/table/rows.rb +31 -0
  36. data/lib/atspi/accessible/table.rb +50 -0
  37. data/lib/atspi/accessible/text/caret.rb +31 -0
  38. data/lib/atspi/accessible/text/character.rb +45 -0
  39. data/lib/atspi/accessible/text/editable.rb +90 -0
  40. data/lib/atspi/accessible/text/hyperlink.rb +19 -0
  41. data/lib/atspi/accessible/text/hypertext.rb +29 -0
  42. data/lib/atspi/accessible/text/offset.rb +59 -0
  43. data/lib/atspi/accessible/text/range.rb +66 -0
  44. data/lib/atspi/accessible/text/selection.rb +48 -0
  45. data/lib/atspi/accessible/text.rb +120 -0
  46. data/lib/atspi/accessible/value.rb +47 -0
  47. data/lib/atspi/accessible.rb +267 -0
  48. data/lib/atspi/application.rb +46 -0
  49. data/lib/atspi/collection.rb +60 -0
  50. data/lib/atspi/desktop.rb +52 -0
  51. data/lib/atspi/extents.rb +28 -0
  52. data/lib/atspi/libatspi.rb +7 -0
  53. data/lib/atspi/requires.rb +76 -0
  54. data/lib/atspi/selectable_collection/selected.rb +23 -0
  55. data/lib/atspi/selectable_collection.rb +32 -0
  56. data/lib/atspi/state_set.rb +141 -0
  57. data/lib/atspi/version.rb +4 -0
  58. data/lib/atspi/window.rb +33 -0
  59. data/lib/atspi.rb +58 -0
  60. metadata +132 -0
@@ -0,0 +1,66 @@
1
+ module ATSPI
2
+ class Accessible::Text
3
+ # Represents a range in a {Text}.
4
+ class Range
5
+ extend Forwardable
6
+
7
+ # @api private
8
+ def initialize(text_native, range_native)
9
+ @text_native = text_native
10
+ @range_native = range_native
11
+ end
12
+
13
+ # @!group Attributes
14
+ # @return [Offset] its start offset
15
+ #
16
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#AtspiRange-struct struct AtspiRange
17
+ def start
18
+ Offset.new(@text_native, @range_native.start_offset)
19
+ end
20
+
21
+ # @return [Offset] its end offset
22
+ #
23
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#AtspiRange-struct struct AtspiRange
24
+ def end
25
+ Offset.new(@text_native, @range_native.end_offset)
26
+ end
27
+
28
+ # @return [Integer] its length
29
+ def length
30
+ self.end.to_i - start.to_i
31
+ end
32
+
33
+ # @param relative_to [Symbol] coordinate system derived from
34
+ # libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiCoordType AtspiCoordType enum}
35
+ # by removing the prefix +ATSPI_COORD_TYPE+ and making it lowercase
36
+ #
37
+ # @return [Extents] its extents
38
+ #
39
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-get-range-extents atspi_text_get_range_extents
40
+ def extents(relative_to:)
41
+ Extents.new(@text_native.range_extents(start.to_i, self.end.to_i, relative_to))
42
+ end
43
+ # @!endgroup
44
+
45
+ # @!group Representations
46
+ # @return [String] its string representation
47
+ #
48
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#AtspiTextRange-struct struct AtspiTextRange
49
+ def to_s
50
+ if @range_native.respond_to? :content
51
+ @range_native.content
52
+ else
53
+ @text_native.text(start.to_i, self.end.to_i)
54
+ end
55
+ end
56
+
57
+ # @return [String] itself as an inspectable string
58
+ def inspect
59
+ text_s = to_s[0..20] << (length > 20 ? '…' : '')
60
+ "#<#{self.class.name}:0x#{'%x14' % __id__} @to_s=#{text_s.inspect} @length=#{length} " <<
61
+ "@start=#{start} @end=#{self.end} @extents=#{extents(relative_to: :screen).inspect}>"
62
+ end
63
+ # @!endgroup
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,48 @@
1
+ module ATSPI
2
+ class Accessible::Text
3
+ # Represents a selected range in a {Text}.
4
+ class Selection < Range
5
+ extend Forwardable
6
+
7
+ # @api private
8
+ def initialize(text_native, idx)
9
+ @text_native = text_native
10
+ @idx = idx
11
+ @range_native = @text_native.selection(idx)
12
+ end
13
+
14
+ # @!group Actions
15
+ # Deselects itself.
16
+ #
17
+ # @return [true,false] indicating success
18
+ #
19
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-remove-selection atspi_text_remove_selection
20
+ def deselect
21
+ @text_native.remove_selection(@idx)
22
+ end
23
+
24
+ # Moves its start to the given offset.
25
+ #
26
+ # @param new_start_offset [responds to #to_i]
27
+ #
28
+ # @return [true,false] indicating success
29
+ #
30
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-set-selection atspi_text_set_selection
31
+ def move_start_to(new_start_offset)
32
+ @text_native.set_selection(@idx, new_start_offset.to_i, self.end)
33
+ end
34
+
35
+ # Moves its end to the given offset.
36
+ #
37
+ # @param new_end_offset [responds to #to_i]
38
+ #
39
+ # @return [true,false] indicating success
40
+ #
41
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-set-selection atspi_text_set_selection
42
+ def move_end_to(new_end_offset)
43
+ @text_native.set_selection(@idx, start, new_end_offset.to_i)
44
+ end
45
+ # @!endgroup
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,120 @@
1
+ class ATSPI::Accessible
2
+ # Wraps libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html text interface},
3
+ # {https://developer.gnome.org/libatspi/stable/libatspi-atspi-editabletext.html editable_text interface} and
4
+ # {https://developer.gnome.org/libatspi/stable/libatspi-atspi-hypertext.html hypertext interface}.
5
+ class Text
6
+ extend Forwardable
7
+ include Editable
8
+ include Hypertext
9
+
10
+ # @api private
11
+ def initialize(native)
12
+ @native = native
13
+ end
14
+
15
+ # @!group Attributes & States
16
+ # @return [Integer] its length
17
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-get-character-count atspi_text_get_character_count
18
+ def length
19
+ @native.character_count
20
+ end
21
+
22
+ # @return [Caret] its caret/cursor
23
+ def caret
24
+ Caret.new(@native)
25
+ end
26
+ alias_method :cursor, :caret
27
+
28
+ # @return [Array<Selection>] its selected text ranges
29
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-get-n-selections atspi_text_get_n_selections
30
+ def selections
31
+ @native.n_selections.times.map do |idx|
32
+ Selection.new(@native, idx)
33
+ end
34
+ end
35
+ # @!endgroup
36
+
37
+ # @!group Geometric Access
38
+ # @param x [Integer]
39
+ # @param y [Integer]
40
+ # @param relative_to [Symbol] coordinate system derived from
41
+ # libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiCoordType AtspiCoordType enum}
42
+ # by removing the prefix +ATSPI_COORD_TYPE+ and making it lowercase
43
+ #
44
+ # @return [Offset] the offset at the given point
45
+ #
46
+ # @example
47
+ # text.offset_at(1243, 323, relative_to: :screen) # => #<ATSPI::Accessible::Text::Offset:0x112779814 … >
48
+ #
49
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-get-offset-at-point atspi_text_get_offset_at_point
50
+ def offset_at(x, y, relative_to:)
51
+ Offset.new(@native, @native.offset_at_point(x, y, relative_to))
52
+ end
53
+
54
+ # @param x [Integer] x position of the rectangle
55
+ # @param y [Integer] y position of the rectangle
56
+ # @param width [Integer] width of the rectangle
57
+ # @param height [Integer] height of the rectangle
58
+ # @param relative_to [Symbol] coordinate system derived from
59
+ # libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiCoordType AtspiCoordType enum}
60
+ # by removing the prefix +ATSPI_COORD_TYPE+ and making it lowercase
61
+ # @param clip_x [Symbol] how to treat characters intersecting the
62
+ # rectangle in x direction. derived from libatspi's
63
+ # {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiTextClipType AtspiTextClipType enum}
64
+ # by removing the prefix +ATSPI_TEXT_CLIP_+ and making it lowercase
65
+ #
66
+ # @return [Array<Range>] the ranges inside the given rectangle
67
+ #
68
+ # @example
69
+ # ranges_in(200, 300, 543, 322, relative_to: :window, clip_x: :both, clip_y: :min) # => [#<ATSPI::Accessible::Text::Range:0xea30bc14 … >, …]
70
+ #
71
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-get-bounded-ranges atspi_text_get_bounded_ranges
72
+ def ranges_in(x, y, width, height, relative_to:, clip_x: :none, clip_y: :none)
73
+ @native.bounded_ranges(x, y, width, height, relative_to, clip_x, clip_y).map do |range|
74
+ Range.new(@native, range)
75
+ end
76
+ end
77
+ # @!endgroup
78
+
79
+ # @!group Actions
80
+ # Selects the text between the given offsets.
81
+ #
82
+ # @param from [responds to #to_i] start offset
83
+ # @param to [responds to #to_i] end offset
84
+ #
85
+ # @return [true,false] indicating success
86
+ #
87
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-add-selection atspi_text_add_selection
88
+ def select(from: 0, to: length)
89
+ @native.add_selection(from.to_i, to.to_i)
90
+ end
91
+
92
+ # Deselects the entire text.
93
+ #
94
+ # To deselect a single selection do it via {Selection#deselect}.
95
+ #
96
+ # @return [true,false] indicating success
97
+ def deselect
98
+ selections.reverse.map(&:deselect).all?
99
+ end
100
+ # @!endgroup
101
+
102
+ # @!group Representations
103
+ # @param from [responds to #to_i] start offset
104
+ # @param to [responds to #to_i] end offset
105
+ #
106
+ # @return [String] its string representation
107
+ #
108
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-text.html#atspi-text-get-text atspi_text_get_text
109
+ def to_s(from: 0, to: length)
110
+ @native.text(from.to_i, to.to_i)
111
+ end
112
+
113
+ # @return [String] itself as an inspectable string
114
+ def inspect
115
+ text_s = to_s(from: 0, to: 20) << (length > 20 ? '…' : '')
116
+ "#<#{self.class.name}:0x#{'%x14' % __id__} @to_s=#{text_s.inspect} @length=#{length}>"
117
+ end
118
+ # @!endgroup
119
+ end
120
+ end
@@ -0,0 +1,47 @@
1
+ module ATSPI
2
+ # Wraps libatspi's AtspiValue[https://developer.gnome.org/libatspi/stable/libatspi-atspi-value.html]
3
+ class Accessible::Value
4
+ extend Forwardable
5
+
6
+ # @api private
7
+ def initialize(native)
8
+ @native = native
9
+ end
10
+
11
+ # @return [Float] its minimum
12
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-value.html#atspi-value-get-minimum-value atspi_value_get_minimum_value
13
+ def minimum
14
+ @native.minimum_value
15
+ end
16
+
17
+ # @return [Float] its maximum
18
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-value.html#atspi-value-get-maximum-value atspi_value_get_maximum_value
19
+ def maximum
20
+ @native.maximum_value
21
+ end
22
+
23
+ # @return [Float] its current value
24
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-value.html#atspi-value-get-current-value atspi_value_get_current_value
25
+ def current
26
+ @native.current_value
27
+ end
28
+
29
+ # Sets its value to the given one.
30
+ # @return [true,false] indicating success
31
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-value.html#atspi-value-set-current-value atspi_value_set_current_value
32
+ def set_to(value)
33
+ @native.set_current_value(value)
34
+ end
35
+
36
+ # @return [Float] its minimum increment
37
+ # @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-value.html#atspi-value-get-minimum-increment atspi_value_get_minimum_increment
38
+ def step
39
+ @native.minimum_increment
40
+ end
41
+
42
+ # @return [String] itself as an inspectable string
43
+ def inspect
44
+ "#<#{self.class.name}:0x#{'%x14' % __id__} @min=#{min} @cur=#{cur} @max=#{max} @incr=#{incr}>"
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,267 @@
1
+ Libatspi.load_class :Accessible
2
+
3
+ module ATSPI
4
+ # Wraps libatspi's AtspiAccessible[https://developer.gnome.org/libatspi/stable/AtspiAccessible.html]
5
+ #
6
+ # The entry point to get ATSPI::Accessibles or one of it sub types are
7
+ # {ATSPI.desktops ATSPI.desktops} and {ATSPI.applications ATSPI.applications}.
8
+ # From there, accessibles are gotten via Tree & Traversal methods like
9
+ # {#parent}, {#children} or {#descendants}.
10
+ #
11
+ # Most methods correspond directly to the method in libatspi. Some have an
12
+ # extended or beautified interface that is documented here.
13
+ class Accessible
14
+ extend Forwardable
15
+ include Extents
16
+ include Selectable
17
+
18
+ class << self
19
+ # @api private
20
+ def new(native)
21
+ if self == Accessible
22
+ native and (new_mapped(native) or super)
23
+ else
24
+ super
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def new_mapped(native)
31
+ case native.role
32
+ when :desktop_frame then Desktop.new(native)
33
+ when :application then Application.new(native)
34
+ when :frame then Window.new(native)
35
+ else nil
36
+ end
37
+ end
38
+ end
39
+
40
+ # @api private
41
+ def initialize(native)
42
+ @native = native
43
+ end
44
+
45
+ attr_reader :native
46
+ private :native
47
+
48
+ # @!group Identification
49
+ # @return [Desktop] its desktop. That is the {#parent} of its {#application}.
50
+ delegate :desktop => :application
51
+
52
+ # @return [Application] its application
53
+ #
54
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-application atspi_accessible_get_application
55
+ def application
56
+ Application.new(@native.application)
57
+ end
58
+
59
+ # @return [Window] its top level window. It is a {#children child} of its {#application} and has
60
+ # the {#role} :frame.
61
+ delegate :window => :parent
62
+
63
+ # @return [Integer] the index in the collection of its {#parent} {#children}
64
+ #
65
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-index-in-parent atspi_accessible_get_index_in_parent
66
+ delegate :index_in_parent => :@native
67
+ alias_method :index, :index_in_parent
68
+
69
+ # @return [Array<Integer>] the list of {#index_in_parent} of all its
70
+ # ancestors until reaching its {#window}, exclusive.
71
+ def path
72
+ parent.path + [*index_in_parent]
73
+ end
74
+ # @!endgroup
75
+
76
+ # @!group Attributes & States
77
+ # @return [String] its name
78
+ #
79
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-name atspi_accessible_get_name
80
+ delegate :name => :@native
81
+
82
+ # @return [String] its description
83
+ #
84
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-description atspi_accessible_get_description
85
+ delegate :description => :@native
86
+
87
+ # @return [Symbol] its role derived from libatspi's {AtspiRole enum}[https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiRole]
88
+ # by removing the prefix +ATSPI_ROLE_+ and making it lowercase.
89
+ #
90
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-role atspi_accessible_get_role
91
+ delegate :role => :@native
92
+
93
+ # @return [String] its role as string
94
+ #
95
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-role-name atspi_accessible_get_role_name
96
+ delegate :role_name => :@native
97
+
98
+ # @return [String] its role as a localized string
99
+ #
100
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-localized-role-name atspi_accessible_get_localized_role_name
101
+ delegate :localized_role_name => :@native
102
+
103
+ # @return [String] its toolkit's name
104
+ #
105
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-toolkit-name atspi_accessible_get_toolkit_name
106
+ delegate :toolkit_name => :@native
107
+
108
+ # @return [String] its toolkit's version
109
+ #
110
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-toolkit-version atspi_accessible_get_toolkit_version
111
+ delegate :toolkit_version => :@native
112
+
113
+ # @return [StateSet] its states
114
+ #
115
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-state-set atspi_accessible_get_state_set
116
+ def states
117
+ StateSet.new_from_native(@native.state_set)
118
+ end
119
+
120
+ # @return [Hash<String => String>] its attributes
121
+ #
122
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-attributes atspi_accessible_get_attributes
123
+ def attributes
124
+ @native.attributes.to_h
125
+ end
126
+
127
+ # @return [Array<String>] the interfaces it implements
128
+ #
129
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-interfaces atspi_accessible_get_interfaces
130
+ def interfaces
131
+ @native.interfaces.to_a
132
+ end
133
+ # @!endgroup
134
+
135
+ # @!group Tree & Traversal
136
+ # @return [Accessible] its parent
137
+ #
138
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-parent atspi_accessible_get_parent
139
+ def parent
140
+ Accessible.new(@native.get_parent)
141
+ end
142
+
143
+ # @return [Children] its children
144
+ def children
145
+ Children.new(@native)
146
+ end
147
+
148
+ # @return [Descendants, []] its descendants. It will be an empty array it
149
+ # does not implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-collection collection interface}
150
+ #
151
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-collection atspi_accessible_get_collection
152
+ def descendants
153
+ if @native.collection_iface
154
+ Descendants.new(@native)
155
+ else
156
+ []
157
+ end
158
+ end
159
+
160
+ # @return [Hash<Symbol => Array<Accessible>>] its relations to other
161
+ # accessibles. Keys name the relation type and values are relation
162
+ # targets.
163
+ #
164
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-relation-set atspi_accessible_get_relation_set
165
+ # @see https://developer.gnome.org/libatspi/stable/AtspiRelation.html atspi-relation
166
+ def relations
167
+ @native.relation_set.to_a.inject({}) do |relations, relation|
168
+ type = relation.relation_type
169
+ targets = relation.n_targets.times.map{ |idx| Accessible.new(relation.target(idx)) }
170
+ relations.merge!(type => targets)
171
+ end
172
+ end
173
+ # @!endgroup
174
+
175
+ # @!group Actions
176
+ # @return [Array<Action>] the actions it supports. The array will be empty
177
+ # if it does not implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-action action interface}.
178
+ #
179
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-action atspi_accessible_get_action_iface
180
+ def actions
181
+ if @native.action_iface
182
+ @native.n_actions.times.map{ |idx| Action.new(@native, idx) }
183
+ else
184
+ []
185
+ end
186
+ end
187
+ # @!endgroup
188
+
189
+ # @!group Representative for
190
+ # @return [Document, nil] its document. It will be nil if it does not
191
+ # implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-document document interface}.
192
+ #
193
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-document atspi_accessible_get_document_iface
194
+ def document
195
+ if @native.document_iface
196
+ Document.new(@native)
197
+ end
198
+ end
199
+
200
+ # @return [Text, nil] its text. It will be nil if it does not
201
+ # implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-text text interface}.
202
+ #
203
+ # @note The {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-editable-text editable_text interface}
204
+ # and {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-hypertext hypertext interface} are
205
+ # available through {Text}, too.
206
+ #
207
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-text atspi_accessible_get_text_iface
208
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-editable-text atspi_accessible_get_editable_text_iface
209
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-hypertext atspi_accessible_get_hypertext_iface
210
+ def text
211
+ if @native.text_iface
212
+ Text.new(@native)
213
+ end
214
+ end
215
+
216
+ # @return [Hyperlink, nil] its hyperlink. It will be nil if it does not
217
+ # have a {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-hyperlink hyperlink}.
218
+ #
219
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-hyperlink atspi_accessible_get_hyperlink
220
+ def hyperlink
221
+ if hyperlink = @native.hyperlink
222
+ Hyperlink.new(hyperlink)
223
+ end
224
+ end
225
+ alias_method :link, :hyperlink
226
+
227
+ # @return [Image, nil] its image. It will be nil if it does not
228
+ # implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-image image interface}.
229
+ #
230
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-image atspi_accessible_get_image_iface
231
+ def image
232
+ if @native.image_iface
233
+ Image.new(@native)
234
+ end
235
+ end
236
+
237
+ # @return [Value, nil] its image. It will be nil if it does not
238
+ # implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-value value interface}.
239
+ #
240
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-value atspi_accessible_get_value_iface
241
+ def value
242
+ if @native.value_iface
243
+ Value.new(@native)
244
+ end
245
+ end
246
+
247
+ # @return [Table, nil] its table. It will be nil if it does not
248
+ # implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-table table interface}.
249
+ #
250
+ # @see https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-table atspi_accessible_get_table_iface
251
+ def table
252
+ if @native.table_iface
253
+ Table.new(@native)
254
+ end
255
+ end
256
+ # @!endgroup
257
+
258
+ # @!group Representations
259
+ # @return [String] itself as an inspectable string
260
+ def inspect
261
+ "#<#{self.class.name}:0x#{'%x14' % __id__} @desktop=#{desktop.index} " <<
262
+ "@application=#{application.name} @window=#{window.name} @path=#{path.join('/')} " <<
263
+ "@name=#{name.inspect} @role=#{role.inspect} @extents=#{extents(relative_to: :screen).inspect}>"
264
+ end
265
+ # @!endgroup
266
+ end
267
+ end
@@ -0,0 +1,46 @@
1
+ module ATSPI
2
+ # Applications are Accessibles having a few exceptions.
3
+ class Application < Accessible
4
+ # @!group Identification
5
+ # It has no path.
6
+ # @return [[]]
7
+ def path
8
+ []
9
+ end
10
+
11
+ # Its desktop is its parent
12
+ # @return [Desktop]
13
+ def desktop
14
+ parent
15
+ end
16
+
17
+ # Its application is itself
18
+ # @return [self]
19
+ def application
20
+ self
21
+ end
22
+
23
+ # It belongs to no window
24
+ # @return nil
25
+ def window
26
+ nil
27
+ end
28
+ # @!endgroup
29
+
30
+ # @!group Tree & Traversal
31
+ # Its windows are its children.
32
+ # @param (see Accessible#children)
33
+ # @return (see Accessible#children)
34
+ def windows
35
+ children
36
+ end
37
+ # @!endgroup
38
+
39
+ # @!group Representations
40
+ # @return [String] itself as an inspectable string
41
+ def inspect
42
+ "#<#{self.class.name}:0x#{'%x14' % __id__} @desktop=#{desktop.index} @name=#{name.inspect}>"
43
+ end
44
+ # @!endgroup
45
+ end
46
+ end
@@ -0,0 +1,60 @@
1
+ module ATSPI
2
+ # Included in classes representing a collection that can be iterated over.
3
+ # A Collection is an Enumerable adjusted to the what we can efficiently get
4
+ # from libatspi. In particular, it provides access to items by index and
5
+ # from the end of the collection.
6
+ module Collection
7
+ include Enumerable
8
+ # @!group Enumerable interface
9
+ # prerequisite for Enumerable
10
+ def each
11
+ count.times.each do |idx|
12
+ yield at(idx)
13
+ end
14
+ end
15
+
16
+ # @param idx [Integer]
17
+ # @return [Object] item at index +idx+
18
+ def at(idx)
19
+ if idx.between?(0, count-1)
20
+ yield idx
21
+ elsif idx.between?(-count, -1)
22
+ yield count+idx
23
+ else
24
+ nil
25
+ end
26
+ end
27
+
28
+ # alias for {#at}
29
+ def [](idx)
30
+ at(idx)
31
+ end
32
+
33
+ # @return [0] default size of collection
34
+ def count
35
+ 0
36
+ end
37
+ # alias for {#count}
38
+ def size; count end
39
+ # alias for {#count}
40
+ def length; count end
41
+
42
+ # @param n [Integer] number of items to return
43
+ # @return [Object,Array<Object>] item(s) from the end
44
+ def last(n = 1)
45
+ if n > 1
46
+ [n,count].min.downto(1).map{ |idx| at(-idx) }
47
+ else
48
+ at(-1)
49
+ end
50
+ end
51
+ # @!endgroup
52
+
53
+ # @!group Representation
54
+ # @return [String] instance as inspectable string
55
+ def inspect
56
+ "#<#{self.class.name}:0x#{'%x14' % __id__} @count=#{count}>"
57
+ end
58
+ # @!endgroup
59
+ end
60
+ end