atspi 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.yardopts +2 -0
- data/Gemfile +3 -0
- data/LICENSE.txt +21 -0
- data/README.md +69 -0
- data/Rakefile +2 -0
- data/atspi.gemspec +23 -0
- data/bin/console +7 -0
- data/lib/atspi/accessible/action.rb +45 -0
- data/lib/atspi/accessible/children/selected.rb +32 -0
- data/lib/atspi/accessible/children.rb +72 -0
- data/lib/atspi/accessible/descendants/attribute_filter.rb +32 -0
- data/lib/atspi/accessible/descendants/interface_filter.rb +24 -0
- data/lib/atspi/accessible/descendants/name_filter.rb +18 -0
- data/lib/atspi/accessible/descendants/options.rb +49 -0
- data/lib/atspi/accessible/descendants/role_filter.rb +23 -0
- data/lib/atspi/accessible/descendants/state_filter.rb +23 -0
- data/lib/atspi/accessible/descendants.rb +278 -0
- data/lib/atspi/accessible/document.rb +26 -0
- data/lib/atspi/accessible/extents.rb +129 -0
- data/lib/atspi/accessible/hyperlink/anchor.rb +30 -0
- data/lib/atspi/accessible/hyperlink.rb +31 -0
- data/lib/atspi/accessible/image.rb +35 -0
- data/lib/atspi/accessible/selectable.rb +47 -0
- data/lib/atspi/accessible/table/cell/columns.rb +44 -0
- data/lib/atspi/accessible/table/cell/rows.rb +44 -0
- data/lib/atspi/accessible/table/cell.rb +18 -0
- data/lib/atspi/accessible/table/cells.rb +37 -0
- data/lib/atspi/accessible/table/column.rb +59 -0
- data/lib/atspi/accessible/table/columns/selected.rb +42 -0
- data/lib/atspi/accessible/table/columns.rb +34 -0
- data/lib/atspi/accessible/table/row.rb +59 -0
- data/lib/atspi/accessible/table/rows/selected.rb +42 -0
- data/lib/atspi/accessible/table/rows.rb +31 -0
- data/lib/atspi/accessible/table.rb +50 -0
- data/lib/atspi/accessible/text/caret.rb +31 -0
- data/lib/atspi/accessible/text/character.rb +45 -0
- data/lib/atspi/accessible/text/editable.rb +90 -0
- data/lib/atspi/accessible/text/hyperlink.rb +19 -0
- data/lib/atspi/accessible/text/hypertext.rb +29 -0
- data/lib/atspi/accessible/text/offset.rb +59 -0
- data/lib/atspi/accessible/text/range.rb +66 -0
- data/lib/atspi/accessible/text/selection.rb +48 -0
- data/lib/atspi/accessible/text.rb +120 -0
- data/lib/atspi/accessible/value.rb +47 -0
- data/lib/atspi/accessible.rb +267 -0
- data/lib/atspi/application.rb +46 -0
- data/lib/atspi/collection.rb +60 -0
- data/lib/atspi/desktop.rb +52 -0
- data/lib/atspi/extents.rb +28 -0
- data/lib/atspi/libatspi.rb +7 -0
- data/lib/atspi/requires.rb +76 -0
- data/lib/atspi/selectable_collection/selected.rb +23 -0
- data/lib/atspi/selectable_collection.rb +32 -0
- data/lib/atspi/state_set.rb +141 -0
- data/lib/atspi/version.rb +4 -0
- data/lib/atspi/window.rb +33 -0
- data/lib/atspi.rb +58 -0
- metadata +132 -0
@@ -0,0 +1,278 @@
|
|
1
|
+
Libatspi.load_class :MatchRule
|
2
|
+
|
3
|
+
module ATSPI
|
4
|
+
# A collection of all descendants in the tree below the accessible it belongs
|
5
|
+
# to. It can be filtered by state, attribute, role, interface and name using
|
6
|
+
# {#where}. The number of descendants to return can be set by {#limit_to}.
|
7
|
+
# Recursive search of the tree can be turned on and off by {#recursive}.
|
8
|
+
#
|
9
|
+
# All methods can be chained together:
|
10
|
+
#
|
11
|
+
# descendants = ATSPI.applications.first.descendants
|
12
|
+
# descendants.where(role: :page_tab, state: :selected).recursive(false).limit_to(1)
|
13
|
+
# # => #<ATSPI::Accessible::Descendants:0x101c51014 @state=all:[:selected] @role=any:[:page_tab] @limit=1 @recursive?=false … >
|
14
|
+
#
|
15
|
+
# To get the actual collection as an array call {#to_a}. Methods not defined
|
16
|
+
# here are automatically delegated to {#to_a}, so instances of this class can
|
17
|
+
# be directly treated like an array.
|
18
|
+
#
|
19
|
+
# descendants.where(interface: :Action).map{ |d| d.actions.map(&:name) }
|
20
|
+
# # => [["click"], [], ["click"], [], …]
|
21
|
+
#
|
22
|
+
# In essence, it wraps libatspi's AtspiCollection[https://developer.gnome.org/libatspi/stable/libatspi-atspi-collection.html] and
|
23
|
+
# AtspiMatchRule[https://developer.gnome.org/libatspi/stable/AtspiMatchRule.html]
|
24
|
+
class Accessible::Descendants
|
25
|
+
# @api private
|
26
|
+
def initialize(native)
|
27
|
+
@native = native
|
28
|
+
@filters = {
|
29
|
+
state: StateFilter.new,
|
30
|
+
attributes: AttributeFilter.new,
|
31
|
+
role: RoleFilter.new,
|
32
|
+
interface: InterfaceFilter.new,
|
33
|
+
name: NameFilter.new,
|
34
|
+
}
|
35
|
+
@options = Options.new(nil, inverted?: false, order: :canonical, limit: 0, recursive?: true)
|
36
|
+
end
|
37
|
+
|
38
|
+
# @!group Filter
|
39
|
+
# @note Filtering sometimes felt rocky on libatspi's side during testing.
|
40
|
+
# See the notes in the following sections for details.
|
41
|
+
#
|
42
|
+
# @see https://developer.gnome.org/libatspi/stable/AtspiMatchRule.html#atspi-match-rule-new atspi_match_rule_new
|
43
|
+
#
|
44
|
+
# @return [Descendants] a copy of this instance with the modified filters.
|
45
|
+
#
|
46
|
+
# @overload where(state:)
|
47
|
+
# Filters by state(s)
|
48
|
+
#
|
49
|
+
# @param state [Symbol,Array<Symbol[, mode: :all]>] the states filter.
|
50
|
+
# States are given as symbol derived from libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiStateType AtspiStateType enum}
|
51
|
+
# by removing the +ATSPI_STATE_+ prefix and making it lowercase.
|
52
|
+
#
|
53
|
+
# When given an array, the last item can be set to a hash configuring
|
54
|
+
# the filter mode. The mode has to be one of +:all+, +:any+, +:none+,
|
55
|
+
# +:empty+. It corresponds to the match type in {https://developer.gnome.org/libatspi/stable/AtspiMatchRule.html#atspi-match-rule-new atspi_match_rule_new} and
|
56
|
+
# {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiCollectionMatchType AtspiCollectionMatchType}, accordingly.
|
57
|
+
#
|
58
|
+
# @example
|
59
|
+
# # Selects accessibles in state :selected
|
60
|
+
# where(state: :selected)
|
61
|
+
#
|
62
|
+
# # Selects accessibles in both states :selectable *and* :selected
|
63
|
+
# where(state: [:selectable, :selected])
|
64
|
+
#
|
65
|
+
# # Selects accessibles in either state :selectable *or* :selected (or both)
|
66
|
+
# where(state: [:selectable, :selected, mode: :any])
|
67
|
+
#
|
68
|
+
# @overload where(attributes:)
|
69
|
+
# Filters by attribute(s)
|
70
|
+
#
|
71
|
+
# @param attributes [Hash<String => String[, mode: :any]>] the attributes
|
72
|
+
# filter. Attributes are given as a Hash as returned by
|
73
|
+
# {Accessible#attributes}.
|
74
|
+
#
|
75
|
+
# The +:mode+ key of the hash can be used to configuring the filter
|
76
|
+
# mode. The mode has to be one of +:all+, +:any+, +:none+, +:empty+. It
|
77
|
+
# corresponds to the match type in {https://developer.gnome.org/libatspi/stable/AtspiMatchRule.html#atspi-match-rule-new atspi_match_rule_new} and
|
78
|
+
# {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiCollectionMatchType AtspiCollectionMatchType}, accordingly.
|
79
|
+
#
|
80
|
+
# @note Filtering attributes in mode +:all+ effectively disables the filter
|
81
|
+
# and returns all descendants. It does not narrow down the result set as
|
82
|
+
# one would expect.
|
83
|
+
#
|
84
|
+
# @example
|
85
|
+
# # Selects accessibles with value "button" for attribute "tag"
|
86
|
+
# where(attributes: { "tag" => "button" })
|
87
|
+
#
|
88
|
+
# # Selects accessibles with value "button" *or* "input" for attribute "tag"
|
89
|
+
# where(attributes: { "tag" => ["button", "input"] })
|
90
|
+
#
|
91
|
+
# # Selects accessibles with value "button" for attribute "tag" *or* value "block" for attribute "display"
|
92
|
+
# where(attributes: { "tag" => "button", "display" => "block" })
|
93
|
+
#
|
94
|
+
# @overload where(role:)
|
95
|
+
# Filters by role
|
96
|
+
#
|
97
|
+
# @param role [Symbol,Array<Symbol[, mode: :any]>] the roles filter.
|
98
|
+
# Roles are given as symbols derived from libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiRole AtspiRole enum}
|
99
|
+
# by removing the +ATSPI_ROLE_+ prefix and making it lowercase.
|
100
|
+
#
|
101
|
+
# When given an array, the last item can be set to a hash configuring
|
102
|
+
# the filter mode. The mode has to be one of +:all+, +:any+, +:none+,
|
103
|
+
# +:empty+. It corresponds to the match type in {https://developer.gnome.org/libatspi/stable/AtspiMatchRule.html#atspi-match-rule-new atspi_match_rule_new} and
|
104
|
+
# {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiCollectionMatchType AtspiCollectionMatchType}, accordingly.
|
105
|
+
#
|
106
|
+
# @note Setting the mode to a value different from +:any+ for role filters
|
107
|
+
# effectively disables the filter and returns all descendants. Since an
|
108
|
+
# accessible has only exactly one role, one would expect that it does return an
|
109
|
+
# empty set, but it does not.
|
110
|
+
#
|
111
|
+
# @example
|
112
|
+
# # Selects accessibles with role :frame
|
113
|
+
# where(role: :frame)
|
114
|
+
#
|
115
|
+
# # Selects accessibles with role :page_tab_list *or* :page_tab
|
116
|
+
# where(role: [:page_tab_list, :page_tab])
|
117
|
+
#
|
118
|
+
# @overload where(interface:)
|
119
|
+
# Filters by interface(s)
|
120
|
+
#
|
121
|
+
# @param role [Symbol,Array<Symbol[, mode: :all]>] the role filter.
|
122
|
+
# Interfaces are given as symbols derived from their name returned by
|
123
|
+
# {Accessible#interfaces}
|
124
|
+
#
|
125
|
+
# When given an array, the last item can be set to a hash configuring
|
126
|
+
# the filter mode. The mode has to be one of +:all+, +:any+, +:none+,
|
127
|
+
# +:empty+. It corresponds to the match type in {https://developer.gnome.org/libatspi/stable/AtspiMatchRule.html#atspi-match-rule-new atspi_match_rule_new} and
|
128
|
+
# {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiCollectionMatchType AtspiCollectionMatchType}, accordingly.
|
129
|
+
#
|
130
|
+
# @note Filtering by multiple interfaces and including +:Accessible+ or
|
131
|
+
# +:Collection+ in mode +:all+ does not work. Instead it always returns
|
132
|
+
# an empty set.
|
133
|
+
#
|
134
|
+
# @note Filtering interfaces in mode +:none+ effectively disables the filter
|
135
|
+
# and returns the entire set of descendants. Since an accessible always
|
136
|
+
# has at least the accessible interfaces it implements one would expect
|
137
|
+
# that it does return an empty set, but it does not.
|
138
|
+
#
|
139
|
+
# @example
|
140
|
+
# # Selects accessibles implementing Action
|
141
|
+
# where(interface: :Action)
|
142
|
+
#
|
143
|
+
# # Selects accessibles implementing Action+ *and* Selection
|
144
|
+
# where(interface: [:Action, :Selection])
|
145
|
+
#
|
146
|
+
# # Selects accessibles implementing Action *or* +Selection or both
|
147
|
+
# where(interface: [:Action, :Selection, mode: :any])
|
148
|
+
#
|
149
|
+
# @overload where(name:)
|
150
|
+
# Filters by name
|
151
|
+
#
|
152
|
+
# @param name [String,RegExp] the name filter. When given a string it is
|
153
|
+
# matched against the entire name from start to end like +/^name$/+.
|
154
|
+
#
|
155
|
+
# @example
|
156
|
+
# # Selects accessibles with name exactly "Accessibles Name"
|
157
|
+
# where(name: "Accessible Name")
|
158
|
+
#
|
159
|
+
# # Selects accessibles with a name matching /a.{11}y/
|
160
|
+
# where(name: /a.{11}y/)
|
161
|
+
#
|
162
|
+
# @overload where(filters)
|
163
|
+
# Combines all or a subset of filters in a single call.
|
164
|
+
#
|
165
|
+
# @example
|
166
|
+
# where(name: /a.{11}y/, state: [:selectable, :selected], role: :page_tab)
|
167
|
+
#
|
168
|
+
# @param filters [Hash]
|
169
|
+
# @option filters [Symbol, Array] :states
|
170
|
+
# @option filters [Symbol, Array] :role
|
171
|
+
# @option filters [String, RegExp] :name
|
172
|
+
# @option filters [Hash] :attributes
|
173
|
+
# @option filters [Symbol, Array] :interface
|
174
|
+
def where(filters)
|
175
|
+
dup(filters: @filters.map do |name, filter|
|
176
|
+
extended_filter = filters[name] ? filter.extend(*filters[name]) : filter
|
177
|
+
[name, extended_filter]
|
178
|
+
end.to_h)
|
179
|
+
end
|
180
|
+
|
181
|
+
# Inverts the conditions set by {#where}.
|
182
|
+
#
|
183
|
+
# @note Seems to be not considered by libatspi?!
|
184
|
+
#
|
185
|
+
# @param invert [true, false]
|
186
|
+
#
|
187
|
+
# @return [Descendants] a copy of the current descendants with the modified
|
188
|
+
# _inverted_ option.
|
189
|
+
#
|
190
|
+
# @see https://developer.gnome.org/libatspi/stable/AtspiMatchRule.html#atspi-match-rule-new invert parameter of atspi_match_rule_new
|
191
|
+
def invert(invert = true)
|
192
|
+
dup(options: @options.invert(invert))
|
193
|
+
end
|
194
|
+
# @!endgroup
|
195
|
+
|
196
|
+
# @!group Options
|
197
|
+
# Sorts the collection of descendants.
|
198
|
+
#
|
199
|
+
# @param order [Symbol] derived from libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiCollectionSortOrder AtspiCollectionSortOrder enum}
|
200
|
+
# by removing the prefix +ATSPI_Collection_SORT_ORDER_+ and making it lowercase.
|
201
|
+
#
|
202
|
+
# @return [Descendants] a copy of the current descendants with the modified
|
203
|
+
# _order_ option.
|
204
|
+
#
|
205
|
+
# @example
|
206
|
+
# descendants.sort_by(:flow) # => #<ATSPI::Accessible::Descendants:0x101c51014 … >
|
207
|
+
#
|
208
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-collection.html#atspi-collection-get-matches sortby parameter of atspi_collection_get_matches
|
209
|
+
def sort_by(order)
|
210
|
+
dup(options: @options.order_by(order))
|
211
|
+
end
|
212
|
+
|
213
|
+
# Limits the number of descendants to return.
|
214
|
+
#
|
215
|
+
# @param limit [Integer] A value of +0+ disables the limit.
|
216
|
+
#
|
217
|
+
# @return [Descendants] a copy of the current descendants with the modified
|
218
|
+
# _limit_ option.
|
219
|
+
#
|
220
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-collection.html#atspi-collection-get-matches count parameter of atspi_collection_get_matches
|
221
|
+
def limit_to(limit)
|
222
|
+
dup(options: @options.limit_to(limit))
|
223
|
+
end
|
224
|
+
|
225
|
+
# Turns recursive search on and off.
|
226
|
+
#
|
227
|
+
# @param recursive [true, false] To limit the descendants to the direct
|
228
|
+
# children of the accessible only, set +recursive+ to +false+. By setting
|
229
|
+
# +recursive+ to +true+, all descendants in the tree below the accessible
|
230
|
+
# the descendants are considered.
|
231
|
+
#
|
232
|
+
# @return [Descendants] a copy of the current descendants with the modified
|
233
|
+
# _recursive_ option.
|
234
|
+
#
|
235
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-collection.html#atspi-collection-get-matches traverse parameter of atspi_collection_get_matches
|
236
|
+
def recursive(recursive = true)
|
237
|
+
dup(options: @options.recursive(recursive))
|
238
|
+
end
|
239
|
+
# @!endgroup
|
240
|
+
|
241
|
+
# @!group Access
|
242
|
+
# @return [Array<Accessible>] the descendants according to the configured
|
243
|
+
# filters and options.
|
244
|
+
def to_a
|
245
|
+
match_rule = Libatspi::MatchRule.new(*@filters[:state], *@filters[:attributes],
|
246
|
+
*@filters[:role], *@filters[:interface], @options.inverted?)
|
247
|
+
matches = @native.matches(match_rule, *@options).to_a
|
248
|
+
matches = matches.select{ |native| native.name =~ @filters[:name].match } if @filters[:name].match
|
249
|
+
matches.map{ |native| Accessible.new(native) }
|
250
|
+
end
|
251
|
+
|
252
|
+
# Delegates missing methods to #to_a
|
253
|
+
# @return [Object] whatever Array#__send__(m, *args, &block) returns
|
254
|
+
def method_missing(m, *args, &block)
|
255
|
+
to_a.__send__(m, *args, &block)
|
256
|
+
end
|
257
|
+
# @!endgroup
|
258
|
+
|
259
|
+
# @!group Representations
|
260
|
+
# @return [String] itself as an inspectable string
|
261
|
+
def inspect
|
262
|
+
filter_inspect = @filters.map{ |n,f| "@#{n}=#{f.inspect}" }.join(' ')
|
263
|
+
"#<#{self.class.name}:0x#{'%x14' % __id__} #{filter_inspect} #{@options.inspect}>"
|
264
|
+
end
|
265
|
+
# @!endgroup
|
266
|
+
|
267
|
+
private
|
268
|
+
|
269
|
+
def dup(values)
|
270
|
+
clone = self.class.new(@native)
|
271
|
+
instance_variables.each do |name|
|
272
|
+
value = values[name.to_s.delete('@').to_sym] || instance_variable_get(name)
|
273
|
+
clone.instance_variable_set(name, value)
|
274
|
+
end
|
275
|
+
clone
|
276
|
+
end
|
277
|
+
end
|
278
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
class ATSPI::Accessible
|
2
|
+
# Wraps libatspi's AtspiDocument[https://developer.gnome.org/libatspi/stable/libatspi-atspi-document.html]
|
3
|
+
class Document
|
4
|
+
# @api private
|
5
|
+
def initialize(native)
|
6
|
+
@native = native
|
7
|
+
end
|
8
|
+
|
9
|
+
# @return [String] its locale
|
10
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-document.html#atspi-document-get-locale atspi_document_get_locale
|
11
|
+
def locale
|
12
|
+
@native.locale
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Hash<String => String>] its attributes
|
16
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-document.html#atspi-document-get-attributes atspi_document_get_attributes
|
17
|
+
def attributes
|
18
|
+
@native.document_attributes.to_h
|
19
|
+
end
|
20
|
+
|
21
|
+
# @return [String] itself as an inspectable string
|
22
|
+
def inspect
|
23
|
+
"#<#{self.class.name}:0x#{'%x14' % __id__} #{attributes.map{ |k, v| "@#{k}=#{v.inspect}" }.join(' ')}>"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
class ATSPI::Accessible
|
2
|
+
# Wraps libatspi's AtspiComponent[https://developer.gnome.org/libatspi/stable/libatspi-atspi-component.html]
|
3
|
+
module Extents
|
4
|
+
# @!group Attributes & States
|
5
|
+
# Checks if it is extending, that is it has a position and size.
|
6
|
+
# Accessibles implementing the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-component component interface}
|
7
|
+
# are extending.
|
8
|
+
#
|
9
|
+
# @return [true, false]
|
10
|
+
def extends?
|
11
|
+
not @native.component_iface.nil?
|
12
|
+
end
|
13
|
+
|
14
|
+
# @return [Symbol] its layer derived from libatspi's {AtspiComponentLayer enum}[https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiComponentLayer]
|
15
|
+
# by removing the prefix +ATSPI_LAYER_+ and making it lowercase. +:invalid+
|
16
|
+
# if it does not implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-component component interface}.
|
17
|
+
#
|
18
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-component.html#atspi-component-get-layer atspi_component_get_layer
|
19
|
+
def layer
|
20
|
+
if extends?
|
21
|
+
@native.layer
|
22
|
+
else
|
23
|
+
:invalid
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
# @return [Integer] its mdi_z_order. +-1+ if it does not implement the
|
28
|
+
# {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-component component interface}.
|
29
|
+
#
|
30
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-component.html#atspi-component-get-mdi-z-order atspi_component_get_mdi_z_order
|
31
|
+
def mdi_z_order
|
32
|
+
if extends?
|
33
|
+
@native.mdi_z_order
|
34
|
+
else
|
35
|
+
-1
|
36
|
+
end
|
37
|
+
end
|
38
|
+
# @!endgroup
|
39
|
+
|
40
|
+
# @!group Actions
|
41
|
+
# Sets the input focus to it.
|
42
|
+
#
|
43
|
+
# @return [true, false] indicating success of the operation. +false+ if it
|
44
|
+
# does not implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-component component interface}.
|
45
|
+
#
|
46
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-component.html#atspi-component-grab-focus atspi_component_grab_focus
|
47
|
+
def grab_focus
|
48
|
+
extends? and @native.grab_focus
|
49
|
+
end
|
50
|
+
# @!endgroup
|
51
|
+
|
52
|
+
# @!group Attributes & States
|
53
|
+
# @return [Float] its opacity between +0.0+ (transparent) and +1.0+ (opaque). +0.0+
|
54
|
+
# if it does not implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-component component interface}.
|
55
|
+
#
|
56
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-component.html#atspi-component-get-alpha atspi_component_get_alpha
|
57
|
+
def opacity
|
58
|
+
if extends?
|
59
|
+
@native.alpha
|
60
|
+
else
|
61
|
+
0.0
|
62
|
+
end
|
63
|
+
end
|
64
|
+
alias_method :alpha, :opacity
|
65
|
+
|
66
|
+
# Checks if the given point lies within its bounds
|
67
|
+
#
|
68
|
+
# @param x [Integer]
|
69
|
+
# @param y [Integer]
|
70
|
+
# @param relative_to [Symbol] coordinate system derived from
|
71
|
+
# libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiCoordType AtspiCoordType enum}
|
72
|
+
# by removing the prefix +ATSPI_COORD_TYPE+ and making it lowercase
|
73
|
+
#
|
74
|
+
# @return [true, false]
|
75
|
+
#
|
76
|
+
# @example
|
77
|
+
# accessible.contains?(1243, 323, relative_to: :screen) # => true
|
78
|
+
#
|
79
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-component.html#atspi-component-contains atspi_component_contains
|
80
|
+
def contains?(x, y, relative_to:)
|
81
|
+
extends? and @native.contains(x, y, relative_to)
|
82
|
+
end
|
83
|
+
# @!endgroup
|
84
|
+
|
85
|
+
# @!group Tree & Traversal
|
86
|
+
# @param x [Integer]
|
87
|
+
# @param y [Integer]
|
88
|
+
# @param relative_to [Symbol] coordinate system derived from
|
89
|
+
# libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiCoordType AtspiCoordType enum}
|
90
|
+
# by removing the prefix +ATSPI_COORD_TYPE+ and making it lowercase
|
91
|
+
#
|
92
|
+
# @return [Accessible, nil] the descendant at the given coordinates. +nil+
|
93
|
+
# if it does not implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-component component interface}.
|
94
|
+
#
|
95
|
+
# @example
|
96
|
+
# accessible.descendant_at(1243, 323, relative_to: :screen) # => #<ATSPI::Accessible:0x140839014 …>
|
97
|
+
#
|
98
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-component.html#atspi-component-get-accessible-at-point atspi_component_get_accessible_at_point
|
99
|
+
def descendant_at(x, y, relative_to:)
|
100
|
+
if extends?
|
101
|
+
ATSPI::Accessible.new(@native.accessible_at_point(x, y, relative_to))
|
102
|
+
else
|
103
|
+
nil
|
104
|
+
end
|
105
|
+
end
|
106
|
+
# @!endgroup
|
107
|
+
|
108
|
+
# @!group Attributes & States
|
109
|
+
# @param relative_to [Symbol] coordinate system derived from
|
110
|
+
# libatspi's {https://developer.gnome.org/libatspi/stable/libatspi-atspi-constants.html#AtspiCoordType AtspiCoordType enum}
|
111
|
+
# by removing the prefix +ATSPI_COORD_TYPE_+ and making it lowercase
|
112
|
+
#
|
113
|
+
# @return [ATSPI::Extents] its extents. Will have a (0,0) position and a
|
114
|
+
# 0x0 size if it does not implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-component component interface}.
|
115
|
+
#
|
116
|
+
# @example
|
117
|
+
# accessible.extents(relative_to: :screen) # => #<ATSPI::Extents:0x10b62c814 @x=2192 @y=187 @width=655 @height=492>
|
118
|
+
#
|
119
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-component.html#atspi-component-get-extents atspi_component_get_extents
|
120
|
+
def extents(relative_to:)
|
121
|
+
if extends?
|
122
|
+
ATSPI::Extents.new(@native.extents(relative_to))
|
123
|
+
else
|
124
|
+
ATSPI::Extents.new(Struct.new(:x, :y, :width, :height).new(0, 0, 0, 0))
|
125
|
+
end
|
126
|
+
end
|
127
|
+
# @!endgroup
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module ATSPI
|
2
|
+
# Wraps libatspi's AtspiHyperlink[https://developer.gnome.org/libatspi/stable/AtspiHyperlink.html]
|
3
|
+
# together with {Hyperlink}.
|
4
|
+
class Accessible::Hyperlink::Anchor
|
5
|
+
# @api private
|
6
|
+
def initialize(native, idx)
|
7
|
+
@native = native
|
8
|
+
@idx = idx
|
9
|
+
end
|
10
|
+
|
11
|
+
# @return [String] its uri
|
12
|
+
# @see https://developer.gnome.org/libatspi/stable/AtspiHyperlink.html#atspi-hyperlink-get-uri atspi_hyperlink_get_uri
|
13
|
+
def uri
|
14
|
+
@native.uri(@idx)
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Accessible,nil] its object or nil if it has none
|
18
|
+
# @see https://developer.gnome.org/libatspi/stable/AtspiHyperlink.html#atspi-hyperlink-get-object atspi_hyperlink_get_object
|
19
|
+
def object
|
20
|
+
if object = @native.object(@idx)
|
21
|
+
Accessible.new(object)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [String] itself as an inspectable string
|
26
|
+
def inspect
|
27
|
+
"#<#{self.class.name}:0x#{'%x14' % __id__} @uri=#{uri.inspect}>"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
class ATSPI::Accessible
|
2
|
+
# Wraps libatspi's AtspiHyperlink[https://developer.gnome.org/libatspi/stable/AtspiHyperlink.html]
|
3
|
+
# together with {Anchor}
|
4
|
+
class Hyperlink
|
5
|
+
extend Forwardable
|
6
|
+
# @api private
|
7
|
+
def initialize(native)
|
8
|
+
@native = native
|
9
|
+
end
|
10
|
+
|
11
|
+
# @return [Array<Anchor>] its anchors
|
12
|
+
# @see https://developer.gnome.org/libatspi/stable/AtspiHyperlink.html#atspi-hyperlink-get-n-anchors atspi_hyperlink_get_n_anchors
|
13
|
+
def anchors
|
14
|
+
@native.n_anchors.times.map do |idx|
|
15
|
+
Anchor.new(@native, idx)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Checks if it's valid
|
20
|
+
# @return [true,false]
|
21
|
+
# @see https://developer.gnome.org/libatspi/stable/AtspiHyperlink.html#atspi-hyperlink-is-valid atspi_hyperlink_is_valid
|
22
|
+
def valid?
|
23
|
+
@native.is_valid
|
24
|
+
end
|
25
|
+
|
26
|
+
# @return [String] itself as an inspectable string
|
27
|
+
def inspect
|
28
|
+
"#<#{self.class.name}:0x#{'%x14' % __id__} @anchors=#{anchors.inspect}>"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module ATSPI
|
2
|
+
# Wraps libatspi's AtspiImage[https://developer.gnome.org/libatspi/stable/libatspi-atspi-image.html]
|
3
|
+
class Accessible::Image
|
4
|
+
# @api private
|
5
|
+
def initialize(native)
|
6
|
+
@native = native
|
7
|
+
end
|
8
|
+
|
9
|
+
# @return [String] its description
|
10
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-image.html#atspi-image-get-image-description atspi_image_get_image_description
|
11
|
+
def description
|
12
|
+
@native.image_description
|
13
|
+
end
|
14
|
+
|
15
|
+
# @param (see Accessible::Extents#extents)
|
16
|
+
# @return [Extents] its extents
|
17
|
+
# @example (see Accessible::Extents#extents)
|
18
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-image.html#atspi-image-get-image-extents atspi_image_get_image_extents
|
19
|
+
def extents(relative_to:)
|
20
|
+
Extents.new(@native.image_extents(relative_to))
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [String] its locale
|
24
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-image.html#atspi-image-get-image-locale atspi_image_get_image_locale
|
25
|
+
def locale
|
26
|
+
@native.image_locale
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [String] itself as an inspectable string
|
30
|
+
def inspect
|
31
|
+
"#<#{self.class.name}:0x#{'%x14' % __id__} @description=#{description.inspect} " <<
|
32
|
+
"@extents=#{extents(relative_to: :screen).inspect}>"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class ATSPI::Accessible
|
2
|
+
# Wraps libatspi's AtspiSelection[https://developer.gnome.org/libatspi/stable/libatspi-atspi-selection.html]
|
3
|
+
# together with parts of {Children} and {Children::Selected}
|
4
|
+
module Selectable
|
5
|
+
# @!group Attributes & States
|
6
|
+
# Checks if it can be selected. Accessibles which parent's native
|
7
|
+
# implements the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-selection selection interface}
|
8
|
+
# are selectable.
|
9
|
+
#
|
10
|
+
# @return [true, false]
|
11
|
+
def selectable?
|
12
|
+
parent.children.selectable?
|
13
|
+
end
|
14
|
+
# @!endgroup
|
15
|
+
|
16
|
+
# @!group Actions
|
17
|
+
# Selects it
|
18
|
+
# @return [true, false] indicating success of the operation. +false+ if its
|
19
|
+
# parent does not implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-selection selection interface}.
|
20
|
+
#
|
21
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-selection.html#atspi-selection-select-child atspi_selection_select_child
|
22
|
+
def select
|
23
|
+
selectable? and parent.__send__(:native).select_child(index_in_parent)
|
24
|
+
end
|
25
|
+
|
26
|
+
# Deselects it
|
27
|
+
# @return [true, false] indicating success of the operation. +false+ if its
|
28
|
+
# parent does not implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-selection selection interface}.
|
29
|
+
#
|
30
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-selection.html#atspi-selection-deselect-child atspi_selection_deselect_child
|
31
|
+
def deselect
|
32
|
+
selectable? and parent.__send__(:native).deselect_child(index_in_parent)
|
33
|
+
end
|
34
|
+
# @!endgroup
|
35
|
+
|
36
|
+
# @!group Attributes & States
|
37
|
+
# Checks if it currently is selected
|
38
|
+
# @return [true, false] +false+ if its
|
39
|
+
# parent does not implement the {https://developer.gnome.org/libatspi/stable/AtspiAccessible.html#atspi-accessible-get-selection selection interface}.
|
40
|
+
#
|
41
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-selection.html#atspi-selection-is-child-selected atspi_selection_is_child_selected
|
42
|
+
def selected?
|
43
|
+
selectable? and parent.__send__(:native).is_child_selected(index_in_parent)
|
44
|
+
end
|
45
|
+
# @!endgroup
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module ATSPI
|
2
|
+
class Accessible::Table
|
3
|
+
# Represents the columns a table {Cell} spans.
|
4
|
+
class Cell::Columns
|
5
|
+
include SelectableCollection::Selected
|
6
|
+
|
7
|
+
# @api private
|
8
|
+
INDEX_METHOD = :index
|
9
|
+
|
10
|
+
# @api private
|
11
|
+
def initialize(native)
|
12
|
+
@native = native
|
13
|
+
@first_idx = row_col_span[2]
|
14
|
+
end
|
15
|
+
|
16
|
+
# @!group Enumerable interface
|
17
|
+
# @param n [Integer] the index in the collection of the cell's columns
|
18
|
+
# and not the index in the collection of all the table's columns.
|
19
|
+
#
|
20
|
+
# @return [Column] the n'th column of the cell
|
21
|
+
#
|
22
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-row-column-extents-at-index atspi_table_get_row_column_extents_at_index
|
23
|
+
def at(n)
|
24
|
+
super do |mapped_idx|
|
25
|
+
Column.new(@native.get_parent, @first_idx+mapped_idx)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Integer] the number of columns the cell spans
|
30
|
+
#
|
31
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-row-column-extents-at-index atspi_table_get_row_column_extents_at_index
|
32
|
+
def count
|
33
|
+
row_col_span[4]
|
34
|
+
end
|
35
|
+
# @!endgroup
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def row_col_span
|
40
|
+
@native.get_parent.row_column_extents_at_index(@native.index_in_parent)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module ATSPI
|
2
|
+
class Accessible::Table
|
3
|
+
# Represents the rows a table {Cell} spans.
|
4
|
+
class Cell::Rows
|
5
|
+
include SelectableCollection::Selected
|
6
|
+
|
7
|
+
# @api private
|
8
|
+
INDEX_METHOD = :index
|
9
|
+
|
10
|
+
# @api private
|
11
|
+
def initialize(native)
|
12
|
+
@native = native
|
13
|
+
@first_idx = row_col_span[1]
|
14
|
+
end
|
15
|
+
|
16
|
+
# @!group Enumerable interface
|
17
|
+
# @param n [Integer] the index in the collection of the cell's rows and
|
18
|
+
# not the index in the collection of all the table's rows.
|
19
|
+
#
|
20
|
+
# @return [Row] the n'th row of the cell
|
21
|
+
#
|
22
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-row-column-extents-at-index atspi_table_get_row_column_extents_at_index
|
23
|
+
def at(n)
|
24
|
+
super do |mapped_idx|
|
25
|
+
Row.new(@native.get_parent, @first_idx+mapped_idx)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Integer] the number of rows the cell spans
|
30
|
+
#
|
31
|
+
# @see https://developer.gnome.org/libatspi/stable/libatspi-atspi-table.html#atspi-table-get-row-column-extents-at-index atspi_table_get_row_column_extents_at_index
|
32
|
+
def count
|
33
|
+
row_col_span[3]
|
34
|
+
end
|
35
|
+
# @!endgroup
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def row_col_span
|
40
|
+
@native.get_parent.row_column_extents_at_index(@native.index_in_parent)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|