1 #Copyright (C) 2008 Codethink Ltd
3 #This library is free software; you can redistribute it and/or
4 #modify it under the terms of the GNU Lesser General Public
5 #License version 2 as published by the Free Software Foundation.
7 #This program is distributed in the hope that it will be useful,
8 #but WITHOUT ANY WARRANTY; without even the implied warranty of
9 #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 #GNU General Public License for more details.
11 #You should have received a copy of the GNU Lesser General Public License
12 #along with this program; if not, write to the Free Software
13 #Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15 from interfaces import *
16 from base import BaseProxyMeta
17 from accessible import BoundingBox
18 from state import StateSet
20 from role import ROLE_UNKNOWN
21 from component import LAYER_WIDGET
28 #------------------------------------------------------------------------------
30 DESKTOP_PATH = '/org/freedesktop/atspi/accessible/desktop'
32 #------------------------------------------------------------------------------
34 class DesktopComponent(object):
36 The Component interface is implemented by objects which occupy
37 on-screen space, e.g. objects which have onscreen visual representations.
38 The methods in Component allow clients to identify where the
39 objects lie in the onscreen coordinate system, their relative
40 size, stacking order, and position. It also provides a mechanism
41 whereby keyboard focus may be transferred to specific user interface
42 elements programmatically. This is a 2D API, coordinates of 3D
43 objects are projected into the 2-dimensional screen view for
44 purposes of this interface.
47 def contains(self, *args, **kwargs):
49 @return True if the specified point lies within the Component's
50 bounding box, False otherwise.
54 def deregisterFocusHandler(self, *args, **kwargs):
56 Request that an EventListener registered via registerFocusHandler
57 no longer be notified when this object receives keyboard focus.
61 def getAccessibleAtPoint(self, *args, **kwargs):
63 @return the Accessible child whose bounding box contains the
68 def getAlpha(self, *args, **kwargs):
70 Obtain the alpha value of the component. An alpha value of 1.0
71 or greater indicates that the object is fully opaque, and an
72 alpha value of 0.0 indicates that the object is fully transparent.
73 Negative alpha values have no defined meaning at this time.
77 def getExtents(self, coord_type):
79 Obtain the Component's bounding box, in pixels, relative to the
80 specified coordinate system.
82 @return a BoundingBox which entirely contains the object's onscreen
83 visual representation.
85 #TODO This needs to return the window size
86 return BoundingBox(*(0,0,1024,768))
88 def getLayer(self, *args, **kwargs):
90 @return the ComponentLayer in which this object resides.
94 def getMDIZOrder(self):
96 Obtain the relative stacking order (i.e. 'Z' order) of an object.
97 Larger values indicate that an object is on "top" of the stack,
98 therefore objects with smaller MDIZOrder may be obscured by objects
99 with a larger MDIZOrder, but not vice-versa.
100 @return an integer indicating the object's place in the stacking
105 def getPosition(self, coord_type):
107 Obtain the position of the current component in the coordinate
108 system specified by coord_type.
111 an out parameter which will be back-filled with the returned
114 an out parameter which will be back-filled with the returned
119 def getSize(self, *args, **kwargs):
121 Obtain the size, in the coordinate system specified by coord_type,
122 of the rectangular area which fully contains the object's visual
123 representation, without accounting for viewport clipping.
125 the object's horizontal extents in the specified coordinate system.
127 the object's vertical extents in the specified coordinate system.
129 #TODO Need to return window size
132 def grabFocus(self, *args, **kwargs):
134 Request that the object obtain keyboard focus.
135 @return True if keyboard focus was successfully transferred to
140 def registerFocusHandler(self, *args, **kwargs):
142 Register an EventListener for notification when this object receives
147 #------------------------------------------------------------------------------
149 class Desktop(object):
151 The base interface which is implemented by all accessible objects.
152 All objects support interfaces for querying their contained
153 'children' and position in the accessible-object hierarchy,
154 whether or not they actually have children.
157 __metaclass__ = BaseProxyMeta
159 def __init__(self, cache):
161 Creates a desktop object. There should be one single desktop
162 object for the Registry object.
164 @param cache - The application cache.
165 @kwarf application - The application D-Bus name
167 If the application name is provided the Desktop is being used for
168 test and will only report the application provided as its single child.
170 self._appcache = cache
172 self._acc_path = DESKTOP_PATH
176 return '[%s | %s]' % (self.getRoleName(), self.name)
180 def __nonzero__(self):
184 return self.getChildCount()
186 def __getitem__(self, index):
187 # IndexError thrown by getChildAtIndex
188 return self.getChildAtIndex(index)
190 def __eq__(self, other):
194 if self._app_name == other._app_name and \
195 self._acc_path == other._acc_path:
199 except AttributeError:
202 def __ne__(self, other):
203 return not self.__eq__(other)
206 return hash(self._app_name + self._acc_path)
208 def getApplication(self):
210 Get the containing Application for this object.
211 @return the Application instance to which this object belongs.
215 def getAttributes(self):
217 Get a list of properties applied to this object as a whole, as
218 an AttributeSet consisting of name-value pairs. As such these
219 attributes may be considered weakly-typed properties or annotations,
220 as distinct from the strongly-typed interface instance data declared
221 using the IDL "attribute" keyword.
222 Not all objects have explicit "name-value pair" AttributeSet
224 Attribute names and values may have any UTF-8 string value, however
225 where possible, in order to facilitate consistent use and exposure
226 of "attribute" properties by applications and AT clients, attribute
227 names and values should chosen from a publicly-specified namespace
229 Where possible, the names and values in the name-value pairs
230 should be chosen from well-established attribute namespaces using
231 standard semantics. For example, attributes of Accessible objects
232 corresponding to XHTML content elements should correspond to
233 attribute names and values specified in the w3c XHTML specification,
234 at http://www.w3.org/TR/xhtml2, where such values are not already
235 exposed via a more strongly-typed aspect of the AT-SPI API. Metadata
236 names and values should be chosen from the 'Dublin Core' Metadata
237 namespace using Dublin Core semantics: http://dublincore.org/dcregistry/
238 Similarly, relevant structural metadata should be exposed using
239 attribute names and values chosen from the CSS2 and WICD specification:
240 http://www.w3.org/TR/1998/REC-CSS2-19980512 WICD (http://www.w3.org/TR/2005/WD-WICD-20051121/).
242 @return : An AttributeSet encapsulating any "attribute values"
243 currently defined for the object. An attribute set is a list of strings
244 with each string comprising an name-value pair format 'name:value'.
248 def getChildAtIndex(self, index):
250 Get the accessible child of this object at index.
252 an in parameter indicating which child is requested (zero-indexed).
253 @return : the 'nth' Accessible child of this object.
255 return self._appcache.create_application(self._appcache.application_list[index])
257 def getIndexInParent(self):
259 Get the index of this object in its parent's child list.
260 @return : a long integer indicating this object's index in the
265 def getLocalizedRoleName(self):
267 Get a string indicating the type of UI role played by this object,
268 translated to the current locale.
269 @return : a UTF-8 string indicating the type of UI role played
272 #TODO Need to localize this somehow. Hmmmmm
275 def getRelationSet(self):
277 Get a set defining this object's relationship to other accessible
279 @return : a RelationSet defining this object's relationships.
285 Get the Role indicating the type of UI role played by this object.
286 @return : a Role indicating the type of UI role played by this
291 def getRoleName(self):
293 Get a string indicating the type of UI role played by this object.
294 @return : a UTF-8 string indicating the type of UI role played
301 Get the current state of the object as a StateSet.
302 @return : a StateSet encapsulating the currently true states
307 def isEqual(self, accessible):
309 Determine whether an Accessible refers to the same object as
310 another. This method should be used rather than brute-force comparison
311 of object references (i.e. "by-value" comparison), as two object
312 references may have different apparent values yet refer to the
315 an Accessible object reference to compare to
316 @return : a boolean indicating whether the two object references
317 point to the same object.
319 #TODO Fix this method
320 return self == accessible
322 def get_childCount(self):
323 return len(self._appcache.application_list)
326 childCount: the number of children contained by this object.
328 childCount = property(fget=get_childCount, doc=_childCountDoc)
330 getChildCount = get_childCount
332 def get_description(self):
336 a string describing the object in more detail than name.
338 description = property(fget=get_description, doc=_descriptionDoc)
344 a (short) string representing the object's name.
346 name = property(fget=get_name, doc=_nameDoc)
348 def get_parent(self):
352 An Accessible object which is this object's containing object.
354 parent = property(fget=get_parent, doc=_parentDoc)
357 def interfaces(self):
358 return [ATSPI_ACCESSIBLE, ATSPI_COMPONENT]
360 def queryInterface(self, interface):
362 Gets a different accessible interface for this object
363 or raises a NotImplemented error if the given interface
366 if interface == ATSPI_ACCESSIBLE:
368 elif interface == ATSPI_COMPONENT:
369 return DesktopComponent()
371 raise NotImplementedError(
372 "%s not supported by accessible object at path %s"
373 % (interface, self._acc_path))
375 #END----------------------------------------------------------------------------