From 590c185517181d7efc05875084fc8454cc539ee1 Mon Sep 17 00:00:00 2001 From: Mark Doffman Date: Wed, 7 Oct 2009 09:40:11 +0100 Subject: [PATCH] 2009-07-10 Mark Doffman Remove pyatspi and the pyatspi tests that have been moved out into a separate repository. --- Makefile.am | 2 +- configure.ac | 8 - pyatspi/Accessibility.py | 41 - pyatspi/Makefile.am | 35 - pyatspi/__init__.py | 30 - pyatspi/accessible.py | 283 ------ pyatspi/accessiblecache.py | 196 ----- pyatspi/action.py | 111 --- pyatspi/application.py | 68 -- pyatspi/applicationcache.py | 248 ------ pyatspi/base.py | 203 ----- pyatspi/collection.py | 110 --- pyatspi/component.py | 189 ---- pyatspi/constants.py | 144 ---- pyatspi/desktop.py | 364 -------- pyatspi/deviceevent.py | 549 ------------ pyatspi/document.py | 74 -- pyatspi/editabletext.py | 124 --- pyatspi/event.py | 262 ------ pyatspi/factory.py | 28 - pyatspi/hyperlink.py | 109 --- pyatspi/hypertext.py | 71 -- pyatspi/image.py | 110 --- pyatspi/interfaces.py | 40 - pyatspi/loginhelper.py | 147 ---- pyatspi/registry.py | 482 ----------- pyatspi/relation.py | 137 --- pyatspi/role.py | 297 ------- pyatspi/selection.py | 136 --- pyatspi/state.py | 256 ------ pyatspi/table.py | 376 -------- pyatspi/text.py | 592 ------------- pyatspi/utils.py | 331 ------- pyatspi/value.py | 74 -- tests/Makefile.am | 11 - tests/apps/Makefile.am | 47 - tests/apps/accessible-app.c | 57 -- tests/apps/action-app.c | 29 - tests/apps/atk-object-xml-loader.c | 95 -- tests/apps/atk-object-xml-loader.h | 29 - tests/apps/component-app.c | 55 -- tests/apps/noop-app.c | 26 - tests/apps/relation-app.c | 90 -- tests/apps/test-application.c | 286 ------ tests/cspi/Makefile.am | 19 - tests/cspi/accessible-test.c | 37 - tests/cspi/classy-test-suite.c | 211 ----- tests/cspi/classy-test-suite.h | 76 -- tests/cspi/classy-test.c | 145 ---- tests/cspi/classy-test.h | 99 --- tests/cspi/key-listener-test.c | 201 ----- tests/cspi/keysynth-test.c | 65 -- tests/cspi/simple-at.c | 615 ------------- tests/cspi/simple-test.c | 46 - tests/cspi/test-simple.c | 816 ------------------ tests/data/Makefile.am | 3 - tests/data/accessible-test-results.xml | 136 --- tests/data/accessible-test.xml | 136 --- tests/dummyatk/Makefile.am | 38 - tests/dummyatk/my-atk-action.c | 222 ----- tests/dummyatk/my-atk-action.h | 58 -- tests/dummyatk/my-atk-component.c | 403 --------- tests/dummyatk/my-atk-component.h | 41 - tests/dummyatk/my-atk-hyperlink.c | 137 --- tests/dummyatk/my-atk-hyperlink.h | 35 - tests/dummyatk/my-atk-hypertext.c | 172 ---- tests/dummyatk/my-atk-hypertext.h | 33 - tests/dummyatk/my-atk-object.c | 186 ---- tests/dummyatk/my-atk-object.h | 37 - tests/dummyatk/my-atk-selection.c | 332 ------- tests/dummyatk/my-atk-selection.h | 55 -- tests/dummyatk/my-atk-streamable-content.c | 96 --- tests/dummyatk/my-atk-streamable-content.h | 35 - tests/dummyatk/my-atk-table.c | 177 ---- tests/dummyatk/my-atk-table.h | 86 -- tests/dummyatk/my-atk-text.c | 1290 ---------------------------- tests/dummyatk/my-atk-text.h | 60 -- tests/dummyatk/my-atk-value.c | 113 --- tests/dummyatk/my-atk-value.h | 34 - tests/dummyatk/my-atk.h | 14 - tests/dummyatk/resources_storage.c | 34 - tests/dummyatk/resources_storage.h | 16 - tests/dummyatk/useful_functions.c | 29 - tests/dummyatk/useful_functions.h | 30 - tests/dummyatk/user_marshal.c | 41 - tests/dummyatk/user_marshal.h | 60 -- tests/pyatspi/Makefile.am | 20 - tests/pyatspi/accessibletest.py | 219 ----- tests/pyatspi/actiontest.py | 73 -- tests/pyatspi/componenttest.py | 145 ---- tests/pyatspi/desktoptest.py | 184 ---- tests/pyatspi/pasytest/Events.py | 78 -- tests/pyatspi/pasytest/Makefile.am | 6 - tests/pyatspi/pasytest/Pasy.py | 146 ---- tests/pyatspi/pasytest/__init__.py | 16 - tests/pyatspi/relationtest.py | 70 -- tests/pyatspi/runtests.sh | 12 - tests/pyatspi/setvars.sh | 6 - tests/pyatspi/statetest.py | 101 --- tests/pyatspi/testrunner | 94 -- 100 files changed, 1 insertion(+), 14590 deletions(-) delete mode 100644 pyatspi/Accessibility.py delete mode 100644 pyatspi/Makefile.am delete mode 100644 pyatspi/__init__.py delete mode 100644 pyatspi/accessible.py delete mode 100644 pyatspi/accessiblecache.py delete mode 100644 pyatspi/action.py delete mode 100644 pyatspi/application.py delete mode 100644 pyatspi/applicationcache.py delete mode 100644 pyatspi/base.py delete mode 100644 pyatspi/collection.py delete mode 100644 pyatspi/component.py delete mode 100644 pyatspi/constants.py delete mode 100644 pyatspi/desktop.py delete mode 100644 pyatspi/deviceevent.py delete mode 100644 pyatspi/document.py delete mode 100644 pyatspi/editabletext.py delete mode 100644 pyatspi/event.py delete mode 100644 pyatspi/factory.py delete mode 100644 pyatspi/hyperlink.py delete mode 100644 pyatspi/hypertext.py delete mode 100644 pyatspi/image.py delete mode 100644 pyatspi/interfaces.py delete mode 100644 pyatspi/loginhelper.py delete mode 100644 pyatspi/registry.py delete mode 100644 pyatspi/relation.py delete mode 100644 pyatspi/role.py delete mode 100644 pyatspi/selection.py delete mode 100644 pyatspi/state.py delete mode 100644 pyatspi/table.py delete mode 100644 pyatspi/text.py delete mode 100644 pyatspi/utils.py delete mode 100644 pyatspi/value.py delete mode 100644 tests/Makefile.am delete mode 100644 tests/apps/Makefile.am delete mode 100644 tests/apps/accessible-app.c delete mode 100644 tests/apps/action-app.c delete mode 100644 tests/apps/atk-object-xml-loader.c delete mode 100644 tests/apps/atk-object-xml-loader.h delete mode 100644 tests/apps/component-app.c delete mode 100644 tests/apps/noop-app.c delete mode 100644 tests/apps/relation-app.c delete mode 100644 tests/apps/test-application.c delete mode 100644 tests/cspi/Makefile.am delete mode 100644 tests/cspi/accessible-test.c delete mode 100644 tests/cspi/classy-test-suite.c delete mode 100644 tests/cspi/classy-test-suite.h delete mode 100644 tests/cspi/classy-test.c delete mode 100644 tests/cspi/classy-test.h delete mode 100644 tests/cspi/key-listener-test.c delete mode 100644 tests/cspi/keysynth-test.c delete mode 100644 tests/cspi/simple-at.c delete mode 100644 tests/cspi/simple-test.c delete mode 100644 tests/cspi/test-simple.c delete mode 100644 tests/data/Makefile.am delete mode 100644 tests/data/accessible-test-results.xml delete mode 100644 tests/data/accessible-test.xml delete mode 100644 tests/dummyatk/Makefile.am delete mode 100644 tests/dummyatk/my-atk-action.c delete mode 100644 tests/dummyatk/my-atk-action.h delete mode 100644 tests/dummyatk/my-atk-component.c delete mode 100644 tests/dummyatk/my-atk-component.h delete mode 100644 tests/dummyatk/my-atk-hyperlink.c delete mode 100644 tests/dummyatk/my-atk-hyperlink.h delete mode 100644 tests/dummyatk/my-atk-hypertext.c delete mode 100644 tests/dummyatk/my-atk-hypertext.h delete mode 100644 tests/dummyatk/my-atk-object.c delete mode 100644 tests/dummyatk/my-atk-object.h delete mode 100644 tests/dummyatk/my-atk-selection.c delete mode 100644 tests/dummyatk/my-atk-selection.h delete mode 100644 tests/dummyatk/my-atk-streamable-content.c delete mode 100644 tests/dummyatk/my-atk-streamable-content.h delete mode 100644 tests/dummyatk/my-atk-table.c delete mode 100644 tests/dummyatk/my-atk-table.h delete mode 100644 tests/dummyatk/my-atk-text.c delete mode 100644 tests/dummyatk/my-atk-text.h delete mode 100644 tests/dummyatk/my-atk-value.c delete mode 100644 tests/dummyatk/my-atk-value.h delete mode 100644 tests/dummyatk/my-atk.h delete mode 100644 tests/dummyatk/resources_storage.c delete mode 100644 tests/dummyatk/resources_storage.h delete mode 100644 tests/dummyatk/useful_functions.c delete mode 100644 tests/dummyatk/useful_functions.h delete mode 100644 tests/dummyatk/user_marshal.c delete mode 100644 tests/dummyatk/user_marshal.h delete mode 100644 tests/pyatspi/Makefile.am delete mode 100644 tests/pyatspi/accessibletest.py delete mode 100644 tests/pyatspi/actiontest.py delete mode 100644 tests/pyatspi/componenttest.py delete mode 100644 tests/pyatspi/desktoptest.py delete mode 100644 tests/pyatspi/pasytest/Events.py delete mode 100644 tests/pyatspi/pasytest/Makefile.am delete mode 100644 tests/pyatspi/pasytest/Pasy.py delete mode 100644 tests/pyatspi/pasytest/__init__.py delete mode 100644 tests/pyatspi/relationtest.py delete mode 100755 tests/pyatspi/runtests.sh delete mode 100644 tests/pyatspi/setvars.sh delete mode 100644 tests/pyatspi/statetest.py delete mode 100755 tests/pyatspi/testrunner diff --git a/Makefile.am b/Makefile.am index 99b87a8..131502a 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1 +1 @@ -SUBDIRS=common atk-adaptor cspi pyatspi tests +SUBDIRS=common atk-adaptor cspi diff --git a/configure.ac b/configure.ac index 4656a11..7a193c0 100644 --- a/configure.ac +++ b/configure.ac @@ -24,7 +24,6 @@ AC_SUBST(LT_AGE) AM_INIT_AUTOMAKE([-Wall foreign]) AC_PROG_CC -AM_PATH_PYTHON(2.4) AM_DISABLE_STATIC AM_PROG_LIBTOOL PKG_PROG_PKG_CONFIG @@ -96,14 +95,7 @@ AC_CONFIG_FILES([Makefile tests/Makefile common/Makefile atk-adaptor/Makefile - tests/dummyatk/Makefile - tests/data/Makefile - tests/pyatspi/Makefile - tests/pyatspi/pasytest/Makefile - tests/apps/Makefile - tests/cspi/Makefile cspi/Makefile - pyatspi/Makefile ]) AC_OUTPUT diff --git a/pyatspi/Accessibility.py b/pyatspi/Accessibility.py deleted file mode 100644 index cf4df5b..0000000 --- a/pyatspi/Accessibility.py +++ /dev/null @@ -1,41 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from constants import * - -from registry import* -from accessible import * -from action import * -from application import * -from collection import * -from component import * -from constants import * -from desktop import * -from deviceevent import * -from document import * -from editabletext import * -from event import * -from hyperlink import * -from hypertext import * -from image import * -from interfaces import * -from loginhelper import * -from relation import * -from role import * -from selection import * -from state import * -from table import * -from text import * -from utils import * -from value import * diff --git a/pyatspi/Makefile.am b/pyatspi/Makefile.am deleted file mode 100644 index cd4e6f8..0000000 --- a/pyatspi/Makefile.am +++ /dev/null @@ -1,35 +0,0 @@ -pyatspidir = $(pythondir)/pyatspi -pyatspi_PYTHON = \ - Accessibility.py \ - accessible.py \ - accessiblecache.py \ - action.py \ - application.py \ - applicationcache.py \ - base.py \ - collection.py \ - component.py \ - constants.py \ - desktop.py \ - deviceevent.py \ - document.py \ - editabletext.py \ - event.py \ - factory.py \ - hyperlink.py \ - hypertext.py \ - image.py \ - __init__.py \ - interfaces.py \ - loginhelper.py \ - registry.py \ - relation.py \ - role.py \ - selection.py \ - state.py \ - table.py \ - text.py \ - utils.py \ - value.py - -CLEANFILES = *.pyc diff --git a/pyatspi/__init__.py b/pyatspi/__init__.py deleted file mode 100644 index 3ad8476..0000000 --- a/pyatspi/__init__.py +++ /dev/null @@ -1,30 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -__version__ = (1, 9, 0) - -import registry -Registry = registry._Registry() -registry._Registry = Registry -del registry - -import constants -from Accessibility import * - -#This is a re-creation of the namespace pollution implemented -#by PyORBit. -import sys -import Accessibility -sys.modules['Accessibility'] = Accessibility -del sys diff --git a/pyatspi/accessible.py b/pyatspi/accessible.py deleted file mode 100644 index 8bbe9b2..0000000 --- a/pyatspi/accessible.py +++ /dev/null @@ -1,283 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import ATSPI_ACCESSIBLE, ATSPI_APPLICATION -from base import BaseProxy, Enum -from factory import accessible_factory -from state import StateSet, _marshal_state_set -from relation import _marshal_relation_set -from role import Role, ROLE_NAMES - -__all__ = [ - "LOCALE_TYPE", - "LOCALE_TYPE_COLLATE", - "LOCALE_TYPE_CTYPE", - "LOCALE_TYPE_MESSAGES", - "LOCALE_TYPE_MONETARY", - "LOCALE_TYPE_NUMERIC", - "LOCALE_TYPE_TIME", - "BoundingBox", - "Accessible", - ] - -#------------------------------------------------------------------------------ - -class LOCALE_TYPE(Enum): - _enum_lookup = { - 0:'LOCALE_TYPE_MESSAGES', - 1:'LOCALE_TYPE_COLLATE', - 2:'LOCALE_TYPE_CTYPE', - 3:'LOCALE_TYPE_MONETARY', - 4:'LOCALE_TYPE_NUMERIC', - 5:'LOCALE_TYPE_TIME', - } - -LOCALE_TYPE_COLLATE = LOCALE_TYPE(1) -LOCALE_TYPE_CTYPE = LOCALE_TYPE(2) -LOCALE_TYPE_MESSAGES = LOCALE_TYPE(0) -LOCALE_TYPE_MONETARY = LOCALE_TYPE(3) -LOCALE_TYPE_NUMERIC = LOCALE_TYPE(4) -LOCALE_TYPE_TIME = LOCALE_TYPE(5) - -#------------------------------------------------------------------------------ - -class BoundingBox(list): - def __new__(cls, x, y, width, height): - return list.__new__(cls, (x, y, width, height)) - def __init__(self, x, y, width, height): - list.__init__(self, (x, y, width, height)) - - def __str__(self): - return ("(%d, %d, %d, %d)" % (self.x, self.y, self.width, self.height)) - - def _get_x(self): - return self[0] - def _set_x(self, val): - self[0] = val - x = property(fget=_get_x, fset=_set_x) - def _get_y(self): - return self[1] - def _set_y(self, val): - self[1] = val - y = property(fget=_get_y, fset=_set_y) - def _get_width(self): - return self[2] - def _set_width(self, val): - self[2] = val - width = property(fget=_get_width, fset=_set_width) - def _get_height(self): - return self[3] - def _set_height(self, val): - self[3] = val - height = property(fget=_get_height, fset=_set_height) - -#------------------------------------------------------------------------------ - -class Accessible(BaseProxy): - """ - The base interface which is implemented by all accessible objects. - All objects support interfaces for querying their contained - 'children' and position in the accessible-object hierarchy, - whether or not they actually have children. - """ - - _relation_set = None - - def __nonzero__(self): - return True - - def __len__(self): - return self.getChildCount() - - def __getitem__(self, index): - return self.getChildAtIndex(index) - - def getApplication(self): - """ - Get the containing Application for this object. - @return the Application instance to which this object belongs. - """ - return self._cache.create_application(self._app_name) - - def getAttributes(self): - """ - Get a list of properties applied to this object as a whole, as - an AttributeSet consisting of name-value pairs. As such these - attributes may be considered weakly-typed properties or annotations, - as distinct from the strongly-typed interface instance data declared - using the IDL "attribute" keyword. - Not all objects have explicit "name-value pair" AttributeSet - properties. - Attribute names and values may have any UTF-8 string value, however - where possible, in order to facilitate consistent use and exposure - of "attribute" properties by applications and AT clients, attribute - names and values should chosen from a publicly-specified namespace - where appropriate. - Where possible, the names and values in the name-value pairs - should be chosen from well-established attribute namespaces using - standard semantics. For example, attributes of Accessible objects - corresponding to XHTML content elements should correspond to - attribute names and values specified in the w3c XHTML specification, - at http://www.w3.org/TR/xhtml2, where such values are not already - exposed via a more strongly-typed aspect of the AT-SPI API. Metadata - names and values should be chosen from the 'Dublin Core' Metadata - namespace using Dublin Core semantics: http://dublincore.org/dcregistry/ - Similarly, relevant structural metadata should be exposed using - attribute names and values chosen from the CSS2 and WICD specification: - http://www.w3.org/TR/1998/REC-CSS2-19980512 WICD (http://www.w3.org/TR/2005/WD-WICD-20051121/). - - @return : An AttributeSet encapsulating any "attribute values" - currently defined for the object. An attribute set is a list of strings - with each string comprising an name-value pair format 'name:value'. - """ - func = self.get_dbus_method("getAttributes", dbus_interface=ATSPI_ACCESSIBLE) - return [key + ':' + value for key, value in func().iteritems()] - - def getChildAtIndex(self, index): - """ - Get the accessible child of this object at index. - @param : index - an in parameter indicating which child is requested (zero-indexed). - @return : the 'nth' Accessible child of this object. - """ - path = self.cached_data.children[index] - return self._cache.create_accessible(self._app_name, path, ATSPI_ACCESSIBLE) - - def getIndexInParent(self): - """ - Get the index of this object in its parent's child list. - @return : a long integer indicating this object's index in the - parent's list. - """ - if self.parent == None: - return -1 - for i in range(0, self.parent.childCount): - child = self.parent.getChildAtIndex(i) - if self.isEqual(child): - return i - raise AccessibleObjectNoLongerExists("Child not found within parent") - - def getLocalizedRoleName(self): - """ - Get a string indicating the type of UI role played by this object, - translated to the current locale. - @return : a UTF-8 string indicating the type of UI role played - by this object. - """ - func = self.get_dbus_method("getLocalizedRoleName", dbus_interface=ATSPI_ACCESSIBLE) - return func() - - def getRelationSet(self): - """ - Get a set defining this object's relationship to other accessible - objects. - @return : a RelationSet defining this object's relationships. - """ - if self._relation_set: - return self._relation_set - else: - func = self.get_dbus_method("getRelationSet", dbus_interface=ATSPI_ACCESSIBLE) - relation_set = func() - self._relation_set = _marshal_relation_set(self._cache, self._app_name, relation_set) - return self._relation_set - - def getRole(self): - """ - Get the Role indicating the type of UI role played by this object. - @return : a Role indicating the type of UI role played by this - object. - """ - return Role(self.cached_data.role) - - def getRoleName(self): - """ - Get a string indicating the type of UI role played by this object. - @return : a UTF-8 string indicating the type of UI role played - by this object. - """ - """ - func = self.get_dbus_method("getRoleName", dbus_interface=ATSPI_ACCESSIBLE) - return func() - """ - return ROLE_NAMES[self.cached_data.role] - - def getState(self): - """ - Get the current state of the object as a StateSet. - @return : a StateSet encapsulating the currently true states - of the object. - """ - return _marshal_state_set(self.cached_data.state) - - def isEqual(self, accessible): - """ - Determine whether an Accessible refers to the same object as - another. This method should be used rather than brute-force comparison - of object references (i.e. "by-value" comparison), as two object - references may have different apparent values yet refer to the - same object. - @param : obj - an Accessible object reference to compare to - @return : a boolean indicating whether the two object references - point to the same object. - """ - return (self._app_name == accessible._app_name) and \ - (self._acc_path == accessible._acc_path) - - - def get_childCount(self): - return len(self.cached_data.children) - _childCountDoc = \ - """ - childCount: the number of children contained by this object. - """ - childCount = property(fget=get_childCount, doc=_childCountDoc) - - getChildCount = get_childCount - - def get_description(self): - return self.cached_data.description - _descriptionDoc = \ - """ - a string describing the object in more detail than name. - """ - description = property(fget=get_description, doc=_descriptionDoc) - - def get_name(self): - return self.cached_data.name - _nameDoc = \ - """ - a (short) string representing the object's name. - """ - name = property(fget=get_name, doc=_nameDoc) - - def get_parent(self): - return self._cache.create_accessible(self._app_name, - self.cached_data.parent, - ATSPI_ACCESSIBLE) - - _parentDoc = \ - """ - an Accessible object which is this object's containing object. - """ - parent = property(fget=get_parent, doc=_parentDoc) - - def refresh(self): - self._relation_set = None - self._cache.application_cache[self._app_name]._refresh() - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_ACCESSIBLE, Accessible) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/accessiblecache.py b/pyatspi/accessiblecache.py deleted file mode 100644 index b190793..0000000 --- a/pyatspi/accessiblecache.py +++ /dev/null @@ -1,196 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -import dbus as _dbus - -from event import Event as _Event - -#------------------------------------------------------------------------------ - -class _CacheData(object): - __slots__ = [ - 'path', - 'parent', - 'interfaces', - 'children', - 'role', - 'name', - 'description', - 'state', - ] - - def __init__(self, data): - self._update(data) - - def _update(self, data): - (self.path, - self.parent, - self.children, - self.interfaces, - self.name, - self.role, - self.description, - self.state) = data - -#------------------------------------------------------------------------------ - -def _list_items_added_removed (l1, l2): - """ - Returns a tuple (boolean, boolean). - The first value indicates if, when - moving from l1 to l2, any items have been added. - The second value indicates whether any items have - been removed. - """ - l1notl2 = [item for item in l1 if item not in l2] - l2notl1 = [item for item in l2 if item not in l1] - return ((len(l1notl2) > 0), (len(l2notl1) > 0)) - -#------------------------------------------------------------------------------ - -class AccessibleCache(object): - """ - There is one accessible cache per application. - For each application the accessible cache stores - data on every accessible object within the app. - - It also acts as the factory for creating client - side proxies for these accessible objects. - - connection - DBus connection. - busName - Name of DBus connection where cache interface resides. - """ - - _PATH = '/org/freedesktop/atspi/tree' - _INTERFACE = 'org.freedesktop.atspi.Tree' - _GET_METHOD = 'getTree' - _UPDATE_SIGNAL = 'updateAccessible' - _REMOVE_SIGNAL = 'removeAccessible' - - def __init__(self, registry, connection, bus_name): - """ - Creates a cache. - - connection - DBus connection. - busName - Name of DBus connection where cache interface resides. - """ - self._registry = registry - self._connection = connection - self._bus_name = bus_name - - obj = connection.get_object(bus_name, self._PATH, introspect=False) - self._tree_itf = _dbus.Interface(obj, self._INTERFACE) - - self._objects = {} - - get_method = self._tree_itf.get_dbus_method(self._GET_METHOD) - self._update_objects(get_method()) - - self._updateMatch = self._tree_itf.connect_to_signal(self._UPDATE_SIGNAL, self._update_single) - self._removeMatch = self._tree_itf.connect_to_signal(self._REMOVE_SIGNAL, self._remove_object) - - self._root = self._tree_itf.getRoot() - - def __getitem__(self, key): - return self._objects[key] - - def __contains__(self, key): - return key in self._objects - - def _dispatch_event(self, olddata, newdata): - if olddata.name != newdata.name: - event = _Event(self._registry.cache, - newdata.path, - self._bus_name, - "org.freedesktop.atspi.Event.Object", - "property-change", - ("accessible-name", 0, 0, newdata.name)) - self._registry._notifyNameChange(event) - - if olddata.description != newdata.description: - event = _Event(self._registry.cache, - newdata.path, - self._bus_name, - "org.freedesktop.atspi.Event.Object", - "property-change", - ("accessible-description", 0, 0, newdata.description)) - self._registry._notifyDescriptionChange(event) - - if olddata.parent != newdata.parent: - event = _Event(self._registry.cache, - newdata.path, - self._bus_name, - "org.freedesktop.atspi.Event.Object", - "property-change", - ("accessible-parent", 0, 0, "")) - self._registry._notifyParentChange(event) - - removed, added = _list_items_added_removed (olddata.children, newdata.children) - - if added: - event = _Event(self._registry.cache, - newdata.path, - self._bus_name, - "org.freedesktop.atspi.Event.Object", - "children-changed", - ("add", 0, 0, "")) - self._registry._notifyChildrenChange(event) - - if removed: - event = _Event(self._registry.cache, - newdata.path, - self._bus_name, - "org.freedesktop.atspi.Event.Object", - "children-changed", - ("remove", 0, 0, "")) - self._registry._notifyChildrenChange(event) - - # TODO This should be the other way around. Single is more common than many. - def _update_single(self, object): - self._update_objects ([object]) - - def _update_objects(self, objects): - cache_update_objects = [] - for data in objects: - #First element is the object path. - path = data[0] - if path in self._objects: - olddata = self._objects[path] - newdata = _CacheData(data) - cache_update_objects.append((olddata, newdata)) - self._objects[path] = newdata - else: - self._objects[path] = _CacheData(data) - for old, new in cache_update_objects: - self._dispatch_event(old, new) - - def _remove_object(self, path): - # TODO I'm squashing a possible error here - # I've seen things appear to be deleted twice - # which needs investigation - try: - del(self._objects[path]) - except KeyError: - pass - - def _get_root(self): - return self._root - - def _refresh(self): - get_method = self._tree_itf.get_dbus_method(self._GET_METHOD) - self._update_objects(get_method()) - - root = property(fget=_get_root) - -#END--------------------------------------------------------------------------- diff --git a/pyatspi/action.py b/pyatspi/action.py deleted file mode 100644 index 5ac2262..0000000 --- a/pyatspi/action.py +++ /dev/null @@ -1,111 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from accessible import Accessible -from factory import accessible_factory - -import dbus - -__all__ = [ - "Action", - ] - -#------------------------------------------------------------------------------ - -class Action(Accessible): - """ - An interface through which a user-actionable user interface component - can be manipulated. Components which react to mouse or keyboard - input from the user, (with the exception of pure text entry fields - with no other function), should implement this interface. Typical - actions include "click", "press", "release" (for instance for - buttons), "menu" (for objects which have context menus invokable - from mouse or keyboard), "open" for icons representing files - folders, and others. - """ - - def getActions(self): - """ - getActions: - Retrieves all the actions at once. - @return : an array of an array of strings in the form - [[name, description, keybinding], ...] - """ - func = self.get_dbus_method("getActions", dbus_interface=ATSPI_ACTION) - return func() - - def doAction(self, index): - """ - doAction: - @param : index - the 0-based index of the action to perform. - Causes the object to perform the specified action. - @return : a boolean indicating success or failure. - """ - func = self.get_dbus_method("doAction", dbus_interface=ATSPI_ACTION) - return func(index) - - def getDescription(self, index): - """ - getDescription: - @param : index - the index of the action for which a description is desired. - Get the description of the specified action. The description - of an action may provide information about the result of action - invocation, unlike the action name. - @return : a string containing the description of the specified - action. - """ - func = self.get_dbus_method("getDescription", dbus_interface=ATSPI_ACTION) - return func(index) - - def getKeyBinding(self, index): - """ - getKeyBinding: - @param : index - the 0-based index of the action for which a key binding is requested. - Get the key binding associated with a specific action. - @return : a string containing the key binding for the specified - action, or an empty string ("") if none exists. - """ - func = self.get_dbus_method("getKeyBinding", dbus_interface=ATSPI_ACTION) - return func(index) - - def getName(self, index): - """ - getName: - @param : index - the index of the action whose name is requested. - Get the name of the specified action. Action names generally - describe the user action, i.e. "click" or "press", rather then - the result of invoking the action. - @return : a string containing the name of the specified action. - """ - func = self.get_dbus_method("getName", dbus_interface=ATSPI_ACTION) - return func(index) - - def get_nActions(self): - return dbus.Int32(self._pgetter(self._dbus_interface, "nActions")) - _nActionsDoc = \ - """ - nActions: a long containing the number of actions this object - supports. - """ - nActions = property(fget=get_nActions, doc=_nActionsDoc) - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_ACTION, Action) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/application.py b/pyatspi/application.py deleted file mode 100644 index ca126fe..0000000 --- a/pyatspi/application.py +++ /dev/null @@ -1,68 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from factory import accessible_factory -from accessible import Accessible - -import dbus - -__all__ = [ - "Application", - ] - -#------------------------------------------------------------------------------ - -class Application(Accessible): - """ - An interface identifying an object which is the root of the user - interface Accessible hierarchy associated with a running application. - Children of Application are typically, but not exclusively, top-level - windows. - """ - - def getLocale(self, locale_type): - """ - Gets the locale in which the application is currently operating. - For the current message locale, use lctype LOCALE_TYPE_MESSAGES. - @param : lctype - The LocaleType for which the locale is queried. - @return a string compliant with the POSIX standard for locale - description. - """ - func = self.get_dbus_method("getLocale", dbus_interface=ATSPI_APPLICATION) - return func(local_type) - - def get_toolkitName(self): - return dbus.String(self._pgetter(self._dbus_interface, "toolkitName")) - _toolkitNameDoc = \ - """ - A string indicating the type of user interface toolkit which - is used by the application. - """ - toolkitName = property(fget=get_toolkitName, doc=_toolkitNameDoc) - - def get_version(self): - return dbus.String(self._pgetter(self._dbus_interface, "version")) - _versionDoc = \ - """ - A string indicating the version number of the application's accessibility - bridge implementation. - """ - version = property(fget=get_version, doc=_versionDoc) - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_APPLICATION, Application) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/applicationcache.py b/pyatspi/applicationcache.py deleted file mode 100644 index 68fa65a..0000000 --- a/pyatspi/applicationcache.py +++ /dev/null @@ -1,248 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -import dbus - -from accessiblecache import AccessibleCache -from desktop import Desktop, DESKTOP_PATH -from factory import accessible_factory -from event import Event as _Event -from base import AccessibleObjectNotAvailable - -from interfaces import * - -__all__ = [ - "ApplicationCache", - "TestApplicationCache", - ] - -#------------------------------------------------------------------------------ - -ROOT_PATH = '/org/freedesktop/atspi/accessible/root' - -#------------------------------------------------------------------------------ - -class TestApplicationCache(object): - - """ - Test application store, accesses a single application. - - The store object acts as a central class for creating accessible objects. - It interfaces with the ATSPI registry to keep account of all accessible - applications. It contains the accessible cache objects from each application. - - @registry: Each accessible cache object must have a reference to the registry - object to send update events. - - @connection: D-Bus connection used to access applications. - - @bus_name: The test store only accesses one accessible application, this is its - D-Bus path. - """ - - def __init__(self, registry, connection, bus_name): - self._connection = connection - - self.application_list = [bus_name] - self.application_cache = {bus_name:AccessibleCache(registry, connection, bus_name)} - - def get_cache_data(self, app_name, acc_path): - """ - Returns the cache tuple for the given application and accessible - object path. Throws an IndexError if the cache data is not found. - """ - return self.application_cache[app_name][acc_path] - - def create_application(self, app_name): - """ - Creates an accessible object for the root of the application - available at the given D-Bus name. - """ - cls = accessible_factory.get_accessible_class(ATSPI_APPLICATION) - try: - return cls(app_name, self.application_cache[app_name].root, self, ATSPI_APPLICATION) - except KeyError: - raise AccessibleObjectNotAvailable () - - def create_accessible(self, app_name, acc_path, interface, dbus_object=None): - """ - Creates an accessible object. - - @app_name: D-Bus name of the application where the accessible object resides. - - @acc_path: D-Bus path of the object within the application. - - @interface: D-Bus interface of the requested object. A different accessible object - class will be created depending on this. Making the function much like - an accessible object factory. - - @dbus_object: If a D-Bus object already exists for the accessible object it can be - provided here so that another one is not created. - """ - # An acc_path of '/' implies the desktop object, whatever the app_name. - if acc_path == DESKTOP_PATH: - return Desktop(self) - if acc_path == ROOT_PATH: - return None - else: - cls = accessible_factory.get_accessible_class(interface) - try: - return cls(app_name, acc_path, self, interface, dbus_object=dbus_object) - except KeyError: - raise AccessibleObjectNotAvailable () - - @property - def connection(self): - """ - D-Bus connection used by the store. - """ - return self._connection - -#------------------------------------------------------------------------------ - -class ApplicationCache(object): - """ - Test application store, accesses a single application. - - The store object acts as a central class for creating accessible objects. - It interfaces with the ATSPI registry to keep account of all accessible - applications. It contains the accessible cache objects from each application. - - @registry: Each accessible cache object must have a reference to the registry - object to send update events. - - @connection: D-Bus connection used to access applications. - - @bus_name: The test store only accesses one accessible application, this is its - D-Bus path. - """ - - _APPLICATIONS_ADD = 1 - _APPLICATIONS_REMOVE = 0 - - def __init__(self, registry, connection): - self._connection = connection - self._registry = registry - - self.application_list = [] - self.application_cache = {} - - self._regsig = connection.add_signal_receiver(self.update_handler, - dbus_interface=ATSPI_REGISTRY_INTERFACE, - signal_name="updateApplications") - - obj = connection.get_object(ATSPI_REGISTRY_NAME, - ATSPI_REGISTRY_PATH, - introspect=False) - self._app_register = dbus.Interface(obj, ATSPI_REGISTRY_INTERFACE) - - self.application_list.extend(self._app_register.getApplications()) - for bus_name in self.application_list: - self.application_cache[bus_name] = AccessibleCache(self._registry, self._connection, bus_name) - - def update_handler (self, update_type, bus_name): - if update_type == ApplicationCache._APPLICATIONS_ADD: - #TODO Check that app does not already exist - #TODO Excuding this app is a hack, need to have re-entrant method calls. - if bus_name != self._connection.get_unique_name (): - self.application_list.append(bus_name) - self.application_cache[bus_name] = AccessibleCache(self._registry, - self._connection, - bus_name) - event = _Event(self, - DESKTOP_PATH, - ATSPI_REGISTRY_NAME, - "org.freedesktop.atspi.Event.Object", - "children-changed", - ("add", 0, 0, "")) - elif update_type == ApplicationCache._APPLICATIONS_REMOVE: - #TODO Fail safely if app does not exist - self.application_list.remove(bus_name) - del(self.application_cache[bus_name]) - event = _Event(self, - DESKTOP_PATH, - ATSPI_REGISTRY_NAME, - "org.freedesktop.atspi.Event.Object", - "children-changed", - ("remove", 0, 0, "")) - - self._registry._notifyChildrenChange(event) - - def get_cache_data(self, app_name, acc_path): - """ - Returns the cache tuple for the given application and accessible - object path. Throws an IndexError if the cache data is not found. - """ - return self.application_cache[app_name][acc_path] - - def create_application(self, app_name): - """ - Creates an accessible object for the root of the application - available at the given D-Bus name. - """ - if app_name == ATSPI_REGISTRY_NAME: - return Desktop(self) - else: - cls = accessible_factory.get_accessible_class(ATSPI_APPLICATION) - try: - return cls(app_name, self.application_cache[app_name].root, self, ATSPI_APPLICATION) - except KeyError: - raise AccessibleObjectNotAvailable () - - def create_accessible(self, app_name, acc_path, interface, dbus_object=None): - """ - Creates an accessible object. - - @app_name: D-Bus name of the application where the accessible object resides. - - @acc_path: D-Bus path of the object within the application. - - @interface: D-Bus interface of the requested object. A different accessible object - class will be created depending on this. Making the function much like - an accessible object factory. - - @dbus_object: If a D-Bus object already exists for the accessible object it can be - provided here so that another one is not created. - """ - if acc_path == DESKTOP_PATH: - return Desktop(self) - if acc_path == ROOT_PATH: - return None - else: - cls = accessible_factory.get_accessible_class(interface) - try: - return cls(app_name, acc_path, self, interface, dbus_object=dbus_object) - except KeyError: - raise AccessibleObjectNotAvailable () - - @property - def connection(self): - """ - D-Bus connection used by the store. - """ - return self._connection - - def _refresh(self): - new = self._app_register.getApplications() - removed = [item for item in self.application_list if item not in new] - added = [item for item in new if item not in self.application_list] - for item in added: - self.update_handler (self._APPLICATIONS_ADD, item) - for item in removed: - self.update_handler (self._APPLICATIONS_REMOVE, item) - - for item in self.application_cache.values(): - item._refresh() - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/base.py b/pyatspi/base.py deleted file mode 100644 index 7096d1b..0000000 --- a/pyatspi/base.py +++ /dev/null @@ -1,203 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -import dbus -from dbus.proxies import Interface -from dbus.exceptions import * - -import interfaces - -__all__ = [ - "AccessibleObjectNoLongerExists", - "AccessibleObjectNotAvailable", - "Enum", - "BaseProxy", - "_repack_tuple", - ] - -class AccessibleObjectNoLongerExists(Exception): - pass - -class AccessibleObjectNotAvailable(Exception): - pass - -#------------------------------------------------------------------------------ - -def _repack_tuple (tup): - """ - Re-packs a tuple moving the last element to the beginning. - """ - return (tup[-1] ,) + tup[:-1] - -#------------------------------------------------------------------------------ - -class Enum(dbus.UInt32): - def __str__(self): - return self._enum_lookup[int(self)] - - def __eq__(self, other): - if other is None: - return False - if int(self) == int(other): - return True - else: - return False - - def __hash__(self): - return int(self) - -#------------------------------------------------------------------------------ - - -class BaseProxyMeta(type): - def __new__(meta, *args, **kwargs): - cls = type.__new__(meta, *args, **kwargs) - - queryable_interfaces = { - 'Accessible':interfaces.ATSPI_ACCESSIBLE, - 'Action':interfaces.ATSPI_ACTION, - 'Application':interfaces.ATSPI_APPLICATION, - 'Collection':interfaces.ATSPI_COLLECTION, - 'Component':interfaces.ATSPI_COMPONENT, - 'Desktop':interfaces.ATSPI_DESKTOP, - 'Document':interfaces.ATSPI_DOCUMENT, - 'EditableText':interfaces.ATSPI_EDITABLE_TEXT, - 'Hypertext':interfaces.ATSPI_HYPERTEXT, - 'Hyperlink':interfaces.ATSPI_HYPERLINK, - 'Image':interfaces.ATSPI_IMAGE, - 'Selection':interfaces.ATSPI_SELECTION, - 'StreamableContent':interfaces.ATSPI_STREAMABLE_CONTENT, - 'Table':interfaces.ATSPI_TABLE, - 'Text':interfaces.ATSPI_TEXT, - 'Value':interfaces.ATSPI_VALUE, - } - - def return_query(interface): - def new_query(self): - return self.queryInterface(interface) - return new_query - - for interface in queryable_interfaces.keys(): - name = 'query%s' % interface - setattr(cls, name, return_query(queryable_interfaces[interface])) - - return cls - -#------------------------------------------------------------------------------ - -class BaseProxy(object): - """ - The base D-Bus proxy for a remote object that implements one or more - of the AT-SPI interfaces. - """ - - __metaclass__ = BaseProxyMeta - - def __init__(self, app_name, acc_path, cache, interface, dbus_object=None): - """ - Create a D-Bus Proxy for an ATSPI interface. - - cache - ApplicationCache, where the cached data for the accessible can be obtained. - app_name - D-Bus bus name of the application this accessible belongs to. - acc_path - D-Bus object path of the server side accessible object. - parent - Parent accessible. - dbus_object(kwarg) - The D-Bus proxy object used by the accessible for D-Bus method calls. - """ - self._cache = cache - self._app_name = app_name - self._acc_path = acc_path - self._dbus_interface = interface - - if not dbus_object: - dbus_object = cache.connection.get_object(self._app_name, - self._acc_path, - introspect=False) - self._dbus_object = dbus_object - - self._pgetter = self.get_dbus_method("Get", - dbus_interface="org.freedesktop.DBus.Properties") - self._psetter = self.get_dbus_method("Set", - dbus_interface="org.freedesktop.DBus.Properties") - - def __str__(self): - try: - return '[%s | %s]' % (self.getRoleName(), self.name) - except Exception: - return '[DEAD]' - - def __eq__(self, other): - if other is None: - return False - try: - if self._app_name == other._app_name and \ - self._acc_path == other._acc_path: - return True - else: - return False - except AttributeError: - return False - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(self._app_name + self._acc_path) - - def get_dbus_method(self, *args, **kwargs): - method = self._dbus_object.get_dbus_method(*args, **kwargs) - - def dbus_method_func(*iargs, **ikwargs): - # TODO Need to throw an AccessibleObjectNoLongerExists exception - # on D-Bus error of the same type. - try: - return method(*iargs, **ikwargs) - except UnknownMethodException, e: - raise NotImplementedError(e) - except DBusException, e: - raise LookupError(e) - - return dbus_method_func - - @property - def cached_data(self): - try: - return self._cache.get_cache_data(self._app_name, self._acc_path) - except KeyError: - raise AccessibleObjectNoLongerExists, \ - 'Cache data cannot be found for path %s in app %s' % (self._acc_path, self._app_name) - - @property - def interfaces(self): - return self.cached_data.interfaces - - def queryInterface(self, interface): - """ - Gets a different accessible interface for this object - or raises a NotImplemented error if the given interface - is not supported. - """ - if interface in self.interfaces: - return self._cache.create_accessible(self._app_name, - self._acc_path, - interface, - dbus_object=self._dbus_object) - else: - raise NotImplementedError( - "%s not supported by accessible object at path %s" - % (interface, self._acc_path)) - - def flushCache(self): - pass - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/collection.py b/pyatspi/collection.py deleted file mode 100644 index a5be820..0000000 --- a/pyatspi/collection.py +++ /dev/null @@ -1,110 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from base import Enum -from accessible import Accessible -from factory import accessible_factory - -__all__ = [ - "Collection", - ] - -#------------------------------------------------------------------------------ - -class Collection(Accessible): - - def createMatchRule(self, *args, **kwargs): - func = self.get_dbus_method("createMatchRule", dbus_interface=ATSPI_COLLECTION) - return func(*args, **kwargs) - - def freeMatchRule(self, *args, **kwargs): - func = self.get_dbus_method("freeMatchRule", dbus_interface=ATSPI_COLLECTION) - return func(*args, **kwargs) - - def getActiveDescendant(self, *args, **kwargs): - func = self.get_dbus_method("getActiveDescendant", dbus_interface=ATSPI_COLLECTION) - return func(*args, **kwargs) - - def getMatches(self, *args, **kwargs): - func = self.get_dbus_method("getMatches", dbus_interface=ATSPI_COLLECTION) - return func(*args, **kwargs) - - def getMatchesFrom(self, *args, **kwargs): - func = self.get_dbus_method("getMatchesFrom", dbus_interface=ATSPI_COLLECTION) - return func(*args, **kwargs) - - def getMatchesTo(self, *args, **kwargs): - func = self.get_dbus_method("getMatchesTo", dbus_interface=ATSPI_COLLECTION) - return func(*args, **kwargs) - - def isAncestorOf(self, *args, **kwargs): - func = self.get_dbus_method("isAncestorOf", dbus_interface=ATSPI_COLLECTION) - return func(*args, **kwargs) - - class MatchType(Enum): - _enum_lookup = { - 0:'MATCH_INVALID', - 1:'MATCH_ALL', - 2:'MATCH_ANY', - 3:'MATCH_NONE', - 4:'MATCH_EMPTY', - 5:'MATCH_LAST_DEFINED', - } - - MATCH_ALL = MatchType(1) - MATCH_ANY = MatchType(2) - MATCH_EMPTY = MatchType(4) - MATCH_INVALID = MatchType(0) - MATCH_LAST_DEFINED = MatchType(5) - MATCH_NONE = MatchType(3) - - class SortOrder(Enum): - _enum_lookup = { - 0:'SORT_ORDER_INVALID', - 1:'SORT_ORDER_CANONICAL', - 2:'SORT_ORDER_FLOW', - 3:'SORT_ORDER_TAB', - 4:'SORT_ORDER_REVERSE_CANONICAL', - 5:'SORT_ORDER_REVERSE_FLOW', - 6:'SORT_ORDER_REVERSE_TAB', - 7:'SORT_ORDER_LAST_DEFINED', - } - - SORT_ORDER_CANONICAL = SortOrder(1) - SORT_ORDER_FLOW = SortOrder(2) - SORT_ORDER_INVALID = SortOrder(0) - SORT_ORDER_LAST_DEFINED = SortOrder(7) - SORT_ORDER_REVERSE_CANONICAL = SortOrder(4) - SORT_ORDER_REVERSE_FLOW = SortOrder(5) - SORT_ORDER_REVERSE_TAB = SortOrder(6) - SORT_ORDER_TAB = SortOrder(3) - - class TreeTraversalType(Enum): - _enum_lookup = { - 0:'TREE_RESTRICT_CHILDREN', - 1:'TREE_RESTRICT_SIBLING', - 2:'TREE_INORDER', - 3:'TREE_LAST_DEFINED', - } - - TREE_INORDER = TreeTraversalType(2) - TREE_LAST_DEFINED = TreeTraversalType(3) - TREE_RESTRICT_CHILDREN = TreeTraversalType(0) - TREE_RESTRICT_SIBLING = TreeTraversalType(1) - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_COLLECTION, Collection) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/component.py b/pyatspi/component.py deleted file mode 100644 index 9e7b36f..0000000 --- a/pyatspi/component.py +++ /dev/null @@ -1,189 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from base import Enum -from factory import accessible_factory -from accessible import BoundingBox, Accessible - -from dbus.types import UInt32 - -__all__ = [ - "CoordType", - "XY_SCREEN", - "XY_WINDOW", - "ComponentLayer", - "Component", - "LAYER_BACKGROUND", - "LAYER_CANVAS", - "LAYER_INVALID", - "LAYER_LAST_DEFINED", - "LAYER_MDI", - "LAYER_OVERLAY", - "LAYER_POPUP", - "LAYER_WIDGET", - "LAYER_WINDOW", - ] - -#------------------------------------------------------------------------------ - -class CoordType(Enum): - _enum_lookup = { - 0:'XY_SCREEN', - 1:'XY_WINDOW', - } - -XY_SCREEN = CoordType(0) -XY_WINDOW = CoordType(1) - -#------------------------------------------------------------------------------ - -class ComponentLayer(Enum): - _enum_lookup = { - 0:'LAYER_INVALID', - 1:'LAYER_BACKGROUND', - 2:'LAYER_CANVAS', - 3:'LAYER_WIDGET', - 4:'LAYER_MDI', - 5:'LAYER_POPUP', - 6:'LAYER_OVERLAY', - 7:'LAYER_WINDOW', - 8:'LAYER_LAST_DEFINED', - } - -LAYER_BACKGROUND = ComponentLayer(1) -LAYER_CANVAS = ComponentLayer(2) -LAYER_INVALID = ComponentLayer(0) -LAYER_LAST_DEFINED = ComponentLayer(8) -LAYER_MDI = ComponentLayer(4) -LAYER_OVERLAY = ComponentLayer(6) -LAYER_POPUP = ComponentLayer(5) -LAYER_WIDGET = ComponentLayer(3) -LAYER_WINDOW = ComponentLayer(7) - -#------------------------------------------------------------------------------ - -class Component(Accessible): - """ - The Component interface is implemented by objects which occupy - on-screen space, e.g. objects which have onscreen visual representations. - The methods in Component allow clients to identify where the - objects lie in the onscreen coordinate system, their relative - size, stacking order, and position. It also provides a mechanism - whereby keyboard focus may be transferred to specific user interface - elements programmatically. This is a 2D API, coordinates of 3D - objects are projected into the 2-dimensional screen view for - purposes of this interface. - """ - - def contains(self, x, y, coord_type): - """ - @return True if the specified point lies within the Component's - bounding box, False otherwise. - """ - func = self.get_dbus_method("contains", dbus_interface=ATSPI_COMPONENT) - return func(x, y, UInt32(coord_type)) - - def getAccessibleAtPoint(self, x, y, coord_type): - """ - @return the Accessible child whose bounding box contains the - specified point. - """ - func = self.get_dbus_method("getAccessibleAtPoint", dbus_interface=ATSPI_COMPONENT) - return self._cache.create_accessible(self._app_name, - func(x, y, UInt32(coord_type)), - interfaces.ATSPI_COMPONENT) - - def getAlpha(self): - """ - Obtain the alpha value of the component. An alpha value of 1.0 - or greater indicates that the object is fully opaque, and an - alpha value of 0.0 indicates that the object is fully transparent. - Negative alpha values have no defined meaning at this time. - """ - func = self.get_dbus_method("getAlpha", dbus_interface=ATSPI_COMPONENT) - return func() - - def getExtents(self, coord_type): - """ - Obtain the Component's bounding box, in pixels, relative to the - specified coordinate system. - @param coord_type - @return a BoundingBox which entirely contains the object's onscreen - visual representation. - """ - func = self.get_dbus_method("getExtents", dbus_interface=ATSPI_COMPONENT) - extents = func(UInt32(coord_type)) - return BoundingBox(*extents) - - def getLayer(self): - """ - @return the ComponentLayer in which this object resides. - """ - func = self.get_dbus_method("getLayer", dbus_interface=ATSPI_COMPONENT) - return ComponentLayer(func()) - - def getMDIZOrder(self): - """ - Obtain the relative stacking order (i.e. 'Z' order) of an object. - Larger values indicate that an object is on "top" of the stack, - therefore objects with smaller MDIZOrder may be obscured by objects - with a larger MDIZOrder, but not vice-versa. - @return an integer indicating the object's place in the stacking - order. - """ - func = self.get_dbus_method("getMDIZOrder", dbus_interface=ATSPI_COMPONENT) - return func() - - def getPosition(self, coord_type): - """ - Obtain the position of the current component in the coordinate - system specified by coord_type. - @param : coord_type - @param : x - an out parameter which will be back-filled with the returned - x coordinate. - @param : y - an out parameter which will be back-filled with the returned - y coordinate. - """ - func = self.get_dbus_method("getPosition", dbus_interface=ATSPI_COMPONENT) - return func(UInt32(coord_type)) - - def getSize(self): - """ - Obtain the size, in the coordinate system specified by coord_type, - of the rectangular area which fully contains the object's visual - representation, without accounting for viewport clipping. - @param : width - the object's horizontal extents in the specified coordinate system. - @param : height - the object's vertical extents in the specified coordinate system. - """ - func = self.get_dbus_method("getSize", dbus_interface=ATSPI_COMPONENT) - return func() - - def grabFocus(self): - """ - Request that the object obtain keyboard focus. - @return True if keyboard focus was successfully transferred to - the Component. - """ - func = self.get_dbus_method("grabFocus", dbus_interface=ATSPI_COMPONENT) - return func() - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_COMPONENT, Component) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/constants.py b/pyatspi/constants.py deleted file mode 100644 index b6c694a..0000000 --- a/pyatspi/constants.py +++ /dev/null @@ -1,144 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd -#copyright: Copyright (c) 2005, 2007 IBM Corporation - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -#Portions of this code originally licensed and copyright (c) 2005, 2007 -#IBM Corporation under the BSD license, available at -#U{http://www.opensource.org/licenses/bsd-license.php} - -#authors: Peter Parente, Mark Doffman - -# Constants used in the Component interface to get screen coordinates -DESKTOP_COORDS = 0 -WINDOW_COORDS = 1 - -# Constants used to synthesize mouse events -MOUSE_B1P = 'b1p' -MOUSE_B1R = 'b1r' -MOUSE_B1C = 'b1c' -MOUSE_B1D = 'b1d' -MOUSE_B2P = 'b2p' -MOUSE_B2R = 'b2r' -MOUSE_B2C = 'b2c' -MOUSE_B2D = 'b2d' -MOUSE_B3P = 'b3p' -MOUSE_B3R = 'b3r' -MOUSE_B3C = 'b3c' -MOUSE_B3D = 'b3d' -MOUSE_ABS = 'abs' -MOUSE_REL = 'rel' - -# events that clear cached properties -CACHE_EVENTS = ['object:property-change:accessible-name', - 'object:property-change:accessible-description', - 'object:property-change:accessible-role', - 'object:property-change:accessible-parent'] - -CACHE_PROPERTIES = '' - -# Dictionary used to correct the bug of not being able to register for all the -# subevents given only an AT-SPI event class (i.e. first part of the event -# name) keys are event names having subevents and values are the subevents -# under the key event; handlers *can* be registered for events not in this tree -EVENT_TREE = { - 'terminal': - ['terminal:line-changed', - 'terminal:columncount-changed', - 'terminal:linecount-changed', - 'terminal:application-changed', - 'terminal:charwidth-changed' - ], - 'document': - ['document:load-complete', - 'document:reload', - 'document:load-stopped', - 'document:content-changed', - 'document:attributes-changed' - ], - 'object': - ['object:property-change', - 'object:bounds-changed', - 'object:link-selected', - 'object:state-changed', - 'object:children-changed', - 'object:visible-data-changed', - 'object:selection-changed', - 'object:model-changed', - 'object:active-descendant-changed', - 'object:row-inserted', - 'object:row-reordered', - 'object:row-deleted', - 'object:column-inserted', - 'object:column-reordered', - 'object:column-deleted', - 'object:text-bounds-changed', - 'object:text-selection-changed', - 'object:text-changed', - 'object:text-attributes-changed', - 'object:text-caret-moved', - 'object:attributes-changed'], - 'object:text-changed' : - ['object:text-changed:insert', - 'object:text-changed:delete'], - 'object:property-change' : - ['object:property-change:accessible-parent', - 'object:property-change:accessible-name', - 'object:property-change:accessible-description', - 'object:property-change:accessible-value', - 'object:property-change:accessible-role', - 'object:property-change:accessible-table-caption', - 'object:property-change:accessible-table-column-description', - 'object:property-change:accessible-table-column-header', - 'object:property-change:accessible-table-row-description', - 'object:property-change:accessible-table-row-header', - 'object:property-change:accessible-table-summary'], - 'object:children-changed' : - ['object:children-changed:add', - 'object:children-changed:remove'], - 'object:state-changed' : - ['object:state-changed:'], - 'mouse' : - ['mouse:abs', - 'mouse:rel', - 'mouse:button'], - 'mouse:button' : - ['mouse:button:1p', - 'mouse:button:1r', - 'mouse:button:2p', - 'mouse:button:2r', - 'mouse:button:3p', - 'mouse:button:3r'], - 'window' : - ['window:minimize', - 'window:maximize', - 'window:restore', - 'window:close', - 'window:create', - 'window:reparent', - 'window:desktop-create', - 'window:desktop-destroy', - 'window:activate', - 'window:deactivate', - 'window:raise', - 'window:lower', - 'window:move', - 'window:resize', - 'window:shade', - 'window:unshade', - 'window:restyle'], - 'focus' : - ['focus:'] -} - -from Accessibility import * diff --git a/pyatspi/desktop.py b/pyatspi/desktop.py deleted file mode 100644 index ed6a9ee..0000000 --- a/pyatspi/desktop.py +++ /dev/null @@ -1,364 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from base import BaseProxyMeta -from accessible import BoundingBox -from state import StateSet - -from role import ROLE_UNKNOWN -from component import LAYER_WIDGET - -__all__ = [ - "Desktop", - "DESKTOP_PATH", - ] - -#------------------------------------------------------------------------------ - -DESKTOP_PATH = '/org/freedesktop/atspi/accessible/desktop' - -#------------------------------------------------------------------------------ - -class DesktopComponent(object): - """ - The Component interface is implemented by objects which occupy - on-screen space, e.g. objects which have onscreen visual representations. - The methods in Component allow clients to identify where the - objects lie in the onscreen coordinate system, their relative - size, stacking order, and position. It also provides a mechanism - whereby keyboard focus may be transferred to specific user interface - elements programmatically. This is a 2D API, coordinates of 3D - objects are projected into the 2-dimensional screen view for - purposes of this interface. - """ - - def contains(self, *args, **kwargs): - """ - @return True if the specified point lies within the Component's - bounding box, False otherwise. - """ - return False - - def getAccessibleAtPoint(self, *args, **kwargs): - """ - @return the Accessible child whose bounding box contains the - specified point. - """ - return None - - def getAlpha(self, *args, **kwargs): - """ - Obtain the alpha value of the component. An alpha value of 1.0 - or greater indicates that the object is fully opaque, and an - alpha value of 0.0 indicates that the object is fully transparent. - Negative alpha values have no defined meaning at this time. - """ - return 1.0 - - def getExtents(self, coord_type): - """ - Obtain the Component's bounding box, in pixels, relative to the - specified coordinate system. - @param coord_type - @return a BoundingBox which entirely contains the object's onscreen - visual representation. - """ - #TODO This needs to return the window size - return BoundingBox(*(0,0,1024,768)) - - def getLayer(self, *args, **kwargs): - """ - @return the ComponentLayer in which this object resides. - """ - return LAYER_WIDGET - - def getMDIZOrder(self): - """ - Obtain the relative stacking order (i.e. 'Z' order) of an object. - Larger values indicate that an object is on "top" of the stack, - therefore objects with smaller MDIZOrder may be obscured by objects - with a larger MDIZOrder, but not vice-versa. - @return an integer indicating the object's place in the stacking - order. - """ - return 0 - - def getPosition(self, coord_type): - """ - Obtain the position of the current component in the coordinate - system specified by coord_type. - @param : coord_type - @param : x - an out parameter which will be back-filled with the returned - x coordinate. - @param : y - an out parameter which will be back-filled with the returned - y coordinate. - """ - return (0,0) - - def getSize(self, *args, **kwargs): - """ - Obtain the size, in the coordinate system specified by coord_type, - of the rectangular area which fully contains the object's visual - representation, without accounting for viewport clipping. - @param : width - the object's horizontal extents in the specified coordinate system. - @param : height - the object's vertical extents in the specified coordinate system. - """ - #TODO Need to return window size - return (1024, 768) - - def grabFocus(self, *args, **kwargs): - """ - Request that the object obtain keyboard focus. - @return True if keyboard focus was successfully transferred to - the Component. - """ - return False - -#------------------------------------------------------------------------------ - -class Desktop(object): - """ - The base interface which is implemented by all accessible objects. - All objects support interfaces for querying their contained - 'children' and position in the accessible-object hierarchy, - whether or not they actually have children. - """ - - __metaclass__ = BaseProxyMeta - - def __init__(self, cache): - """ - Creates a desktop object. There should be one single desktop - object for the Registry object. - - @param cache - The application cache. - @kwarf application - The application D-Bus name - - If the application name is provided the Desktop is being used for - test and will only report the application provided as its single child. - """ - self._appcache = cache - self._app_name = ':' - self._acc_path = DESKTOP_PATH - - def __str__(self): - try: - return '[%s | %s]' % (self.getRoleName(), self.name) - except Exception: - return '[DEAD]' - - def __nonzero__(self): - return True - - def __len__(self): - return self.getChildCount() - - def __getitem__(self, index): - # IndexError thrown by getChildAtIndex - return self.getChildAtIndex(index) - - def __eq__(self, other): - if other is None: - return False - try: - if self._app_name == other._app_name and \ - self._acc_path == other._acc_path: - return True - else: - return False - except AttributeError: - return False - - def __ne__(self, other): - return not self.__eq__(other) - - def __hash__(self): - return hash(self._app_name + self._acc_path) - - def getApplication(self): - """ - Get the containing Application for this object. - @return the Application instance to which this object belongs. - """ - return None - - def getAttributes(self): - """ - Get a list of properties applied to this object as a whole, as - an AttributeSet consisting of name-value pairs. As such these - attributes may be considered weakly-typed properties or annotations, - as distinct from the strongly-typed interface instance data declared - using the IDL "attribute" keyword. - Not all objects have explicit "name-value pair" AttributeSet - properties. - Attribute names and values may have any UTF-8 string value, however - where possible, in order to facilitate consistent use and exposure - of "attribute" properties by applications and AT clients, attribute - names and values should chosen from a publicly-specified namespace - where appropriate. - Where possible, the names and values in the name-value pairs - should be chosen from well-established attribute namespaces using - standard semantics. For example, attributes of Accessible objects - corresponding to XHTML content elements should correspond to - attribute names and values specified in the w3c XHTML specification, - at http://www.w3.org/TR/xhtml2, where such values are not already - exposed via a more strongly-typed aspect of the AT-SPI API. Metadata - names and values should be chosen from the 'Dublin Core' Metadata - namespace using Dublin Core semantics: http://dublincore.org/dcregistry/ - Similarly, relevant structural metadata should be exposed using - attribute names and values chosen from the CSS2 and WICD specification: - http://www.w3.org/TR/1998/REC-CSS2-19980512 WICD (http://www.w3.org/TR/2005/WD-WICD-20051121/). - - @return : An AttributeSet encapsulating any "attribute values" - currently defined for the object. An attribute set is a list of strings - with each string comprising an name-value pair format 'name:value'. - """ - return [] - - def getChildAtIndex(self, index): - """ - Get the accessible child of this object at index. - @param : index - an in parameter indicating which child is requested (zero-indexed). - @return : the 'nth' Accessible child of this object. - """ - return self._appcache.create_application(self._appcache.application_list[index]) - - def getIndexInParent(self): - """ - Get the index of this object in its parent's child list. - @return : a long integer indicating this object's index in the - parent's list. - """ - return -1 - - def getLocalizedRoleName(self): - """ - Get a string indicating the type of UI role played by this object, - translated to the current locale. - @return : a UTF-8 string indicating the type of UI role played - by this object. - """ - #TODO Need to localize this somehow. Hmmmmm - return 'unknown' - - def getRelationSet(self): - """ - Get a set defining this object's relationship to other accessible - objects. - @return : a RelationSet defining this object's relationships. - """ - return [] - - def getRole(self): - """ - Get the Role indicating the type of UI role played by this object. - @return : a Role indicating the type of UI role played by this - object. - """ - return ROLE_UNKNOWN - - def getRoleName(self): - """ - Get a string indicating the type of UI role played by this object. - @return : a UTF-8 string indicating the type of UI role played - by this object. - """ - return 'unknown' - - def getState(self): - """ - Get the current state of the object as a StateSet. - @return : a StateSet encapsulating the currently true states - of the object. - """ - return StateSet() - - def isEqual(self, accessible): - """ - Determine whether an Accessible refers to the same object as - another. This method should be used rather than brute-force comparison - of object references (i.e. "by-value" comparison), as two object - references may have different apparent values yet refer to the - same object. - @param : obj - an Accessible object reference to compare to - @return : a boolean indicating whether the two object references - point to the same object. - """ - #TODO Fix this method - return self == accessible - - def get_childCount(self): - return len(self._appcache.application_list) - _childCountDoc = \ - """ - childCount: the number of children contained by this object. - """ - childCount = property(fget=get_childCount, doc=_childCountDoc) - - getChildCount = get_childCount - - def get_description(self): - return '' - _descriptionDoc = \ - """ - a string describing the object in more detail than name. - """ - description = property(fget=get_description, doc=_descriptionDoc) - - def get_name(self): - return 'main' - _nameDoc = \ - """ - a (short) string representing the object's name. - """ - name = property(fget=get_name, doc=_nameDoc) - - def get_parent(self): - return None - _parentDoc = \ - """ - An Accessible object which is this object's containing object. - """ - parent = property(fget=get_parent, doc=_parentDoc) - - @property - def interfaces(self): - return [ATSPI_ACCESSIBLE, ATSPI_COMPONENT] - - def queryInterface(self, interface): - """ - Gets a different accessible interface for this object - or raises a NotImplemented error if the given interface - is not supported. - """ - if interface == ATSPI_ACCESSIBLE: - return self - elif interface == ATSPI_COMPONENT: - return DesktopComponent() - else: - raise NotImplementedError( - "%s not supported by accessible object at path %s" - % (interface, self._acc_path)) - - def refresh(self): - self._appcache._refresh() - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/deviceevent.py b/pyatspi/deviceevent.py deleted file mode 100644 index 5e4e3bb..0000000 --- a/pyatspi/deviceevent.py +++ /dev/null @@ -1,549 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -import dbus as _dbus -import dbus.service as _service -import interfaces - -from base import Enum as _Enum - -#------------------------------------------------------------------------------ - -class PressedEventType(_Enum): - _enum_lookup = { - 0:'KEY_PRESSED_EVENT', - 1:'KEY_RELEASED_EVENT', - 2:'BUTTON_PRESSED_EVENT', - 3:'BUTTON_RELEASED_EVENT', - } - -KEY_PRESSED_EVENT = PressedEventType(0) -KEY_RELEASED_EVENT = PressedEventType(1) -BUTTON_PRESSED_EVENT = PressedEventType(2) -BUTTON_RELEASED_EVENT = PressedEventType(3) - -#------------------------------------------------------------------------------ - -class ControllerEventMask(_Enum): - _enum_lookup = { - 1:'KEY_PRESSED_EVENT_MASK', - 2:'KEY_RELEASED_EVENT_MASK', - 4:'BUTTON_PRESSED_EVENT_MASK', - 8:'BUTTON_RELEASED_EVENT_MASK', - } - -KEY_PRESSED_EVENT_MASK = ControllerEventMask(1) -KEY_RELEASED_EVENT_MASK = ControllerEventMask(2) -BUTTON_PRESSED_EVENT_MASK = ControllerEventMask(4) -BUTTON_RELEASED_EVENT_MASK = ControllerEventMask(8) - -#------------------------------------------------------------------------------ - -class KeyEventType(_Enum): - _enum_lookup = { - 0:'KEY_PRESSED', - 1:'KEY_RELEASED', - } -KEY_PRESSED = KeyEventType(0) -KEY_RELEASED = KeyEventType(1) - -#------------------------------------------------------------------------------ - -class KeySynthType(_Enum): - _enum_lookup = { - 0:'KEY_PRESS', - 1:'KEY_RELEASE', - 2:'KEY_PRESSRELEASE', - 3:'KEY_SYM', - 4:'KEY_STRING', - } - -KEY_PRESS = KeySynthType(0) -KEY_PRESSRELEASE = KeySynthType(2) -KEY_RELEASE = KeySynthType(1) -KEY_STRING = KeySynthType(4) -KEY_SYM = KeySynthType(3) - -#------------------------------------------------------------------------------ - -class ModifierType(_Enum): - _enum_lookup = { - 0:'MODIFIER_SHIFT', - 1:'MODIFIER_SHIFTLOCK', - 2:'MODIFIER_CONTROL', - 3:'MODIFIER_ALT', - 4:'MODIFIER_META', - 5:'MODIFIER_META2', - 6:'MODIFIER_META3', - 7:'MODIFIER_NUMLOCK', - } - -MODIFIER_ALT = ModifierType(3) -MODIFIER_CONTROL = ModifierType(2) -MODIFIER_META = ModifierType(4) -MODIFIER_META2 = ModifierType(5) -MODIFIER_META3 = ModifierType(6) -MODIFIER_NUMLOCK = ModifierType(7) -MODIFIER_SHIFT = ModifierType(0) -MODIFIER_SHIFTLOCK = ModifierType(1) - -#------------------------------------------------------------------------------ - -class DeviceEvent(list): - """ - Wraps an AT-SPI device event with a more Pythonic interface. Primarily adds - a consume attribute which can be used to cease propagation of a device event. - - @ivar consume: Should this event be consumed and not allowed to pass on to - observers further down the dispatch chain in this process or possibly - system wide? - @type consume: boolean - @ivar type: Kind of event, KEY_PRESSED_EVENT or KEY_RELEASED_EVENT - @type type: Accessibility.EventType - @ivar id: Serial identifier for this key event - @type id: integer - @ivar hw_code: Hardware scan code for the key - @type hw_code: integer - @ivar modifiers: Modifiers held at the time of the key event - @type modifiers: integer - @ivar timestamp: Time at which the event occurred relative to some platform - dependent starting point (e.g. XWindows start time) - @type timestamp: integer - @ivar event_string: String describing the key pressed (e.g. keysym) - @type event_string: string - @ivar is_text: Is the event representative of text to be inserted (True), or - of a control key (False)? - @type is_text: boolean - """ - def __new__(cls, type, id, hw_code, modifiers, timestamp, event_string, is_text): - return list.__new__(cls, (type, id, hw_code, modifiers, timestamp, event_string, is_text)) - def __init__(self, type, id, hw_code, modifiers, timestamp, event_string, is_text): - list.__init__(self, (type, id, hw_code, modifiers, timestamp, event_string, is_text)) - self.consume = False - def _get_type(self): - return self[0] - def _set_type(self, val): - self[0] = val - type = property(fget=_get_type, fset=_set_type) - def _get_id(self): - return self[1] - def _set_id(self, val): - self[1] = val - id = property(fget=_get_id, fset=_set_id) - def _get_hw_code(self): - return self[2] - def _set_hw_code(self, val): - self[2] = val - hw_code = property(fget=_get_hw_code, fset=_set_hw_code) - def _get_modifiers(self): - return self[3] - def _set_modifiers(self, val): - self[3] = val - modifiers = property(fget=_get_modifiers, fset=_set_modifiers) - def _get_timestamp(self): - return self[4] - def _set_timestamp(self, val): - self[4] = val - timestamp = property(fget=_get_timestamp, fset=_set_timestamp) - def _get_event_string(self): - return self[5] - def _set_event_string(self, val): - self[5] = val - event_string = property(fget=_get_event_string, fset=_set_event_string) - def _get_is_text(self): - return self[6] - def _set_is_text(self, val): - self[6] = val - is_text = property(fget=_get_is_text, fset=_set_is_text) - - def __str__(self): - """ - Builds a human readable representation of the event. - - @return: Event description - @rtype: string - """ - import constants - if self.type == constants.KEY_PRESSED_EVENT: - kind = 'pressed' - elif self.type == constants.KEY_RELEASED_EVENT: - kind = 'released' - return """\ -%s -\thw_code: %d -\tevent_string: %s -\tmodifiers: %d -\tid: %d -\ttimestamp: %d -\tis_text: %s""" % (kind, self.hw_code, self.event_string, self.modifiers, - self.id, self.timestamp, self.is_text) - -#------------------------------------------------------------------------------ - -class EventListenerMode(list): - def __new__(cls, synchronous, preemptive, global_): - return list.__new__(cls, (synchronous, preemptive, global_)) - def __init__(self, synchronous, preemptive, global_): - list.__init__(self, (synchronous, preemptive, global_)) - def _get_synchronous(self): - return self[0] - def _set_synchronous(self, val): - self[0] = val - synchronous = property(fget=_get_synchronous, fset=_set_synchronous) - def _get_preemptive(self): - return self[1] - def _set_preemptive(self, val): - self[1] = val - preemptive = property(fget=_get_preemptive, fset=_set_preemptive) - def _get_global_(self): - return self[2] - def _set_global_(self, val): - self[2] = val - global_ = property(fget=_get_global_, fset=_set_global_) - -#------------------------------------------------------------------------------ - -class KeyDefinition(list): - def __new__(cls, keycode, keysym, keystring, unused): - return list.__new__(cls, (keycode, keysym, keystring, unused)) - def __init__(self, keycode, keysym, keystring, unused): - list.__init__(self, (keycode, keysym, keystring, unused)) - def _get_keycode(self): - return self[0] - def _set_keycode(self, val): - self[0] = val - keycode = property(fget=_get_keycode, fset=_set_keycode) - def _get_keysym(self): - return self[1] - def _set_keysym(self, val): - self[1] = val - keysym = property(fget=_get_keysym, fset=_set_keysym) - def _get_keystring(self): - return self[2] - def _set_keystring(self, val): - self[2] = val - keystring = property(fget=_get_keystring, fset=_set_keystring) - def _get_unused(self): - return self[3] - def _set_unused(self, val): - self[3] = val - unused = property(fget=_get_unused, fset=_set_unused) - -#------------------------------------------------------------------------------ - -class DeviceEventController(object): - """ - The interface via which clients request notification of device - events, and through which device events may be simulated. - """ - - def __init__ (self, connection): - dec_object = connection.get_object(interfaces.ATSPI_REGISTRY_NAME, - interfaces.ATSPI_DEVICE_EVENT_CONTROLLER_PATH, - introspect=True) - self._dec = _dbus.Interface(dec_object, interfaces.ATSPI_DEVICE_EVENT_CONTROLLER_INTERFACE) - - def registerKeystrokeListener(self, - event_listener, - keys, - event_mask, - key_event_types, - event_listener_mode): - """ - Register to intercept keyboard events, and either pass them on - or consume them. - @param : listener - A DeviceEventListener which will intercept key events. - @param : keys - A list of KeyDefinition indicating which keys to intercept, or KEYSET_ALL_KEYS. - @param : mask - A ControllerEventMask bitmask for filtering the intercepted key events. - @param : type - A list of KeyEventType - @param : mode - An EventListenerMode indicating whether the listener should receive - the events synchronously, potentially consuming them, or just - be notified asynchronously of those events that have been generated. - - @return True if the DeviceEventListener was successfully registered - for the requested KeySet, ControllerEventMask, event types, and - EventListenerMode; otherwise returns False. - """ - func = self._dec.get_dbus_method("registerKeystrokeListener") - return func(event_listener, - _dbus.Array(keys, signature="(iisi)"), - event_mask, - key_event_types, - event_listener_mode) - - def deregisterKeystrokeListener(self, - event_listener, - keys, - event_mask, - key_event_types): - """ - De-register a previously registered keyboard eventlistener. - @param : listener - A DeviceEventListener which will intercept key events. - @param : keys - A list of KeyDefinition indicating which keys to intercept, or KEYSET_ALL_KEYS. - @param : mask - A ControllerEventMask filtering the intercepted key events. - @param : type - A list of KeyEventType - """ - func = self._dec.get_dbus_method("deregisterKeystrokeListener") - return func(event_listener, - keys, - event_mask, - key_event_types) - - def registerDeviceEventListener(self, - event_listener, - event_types): - """ - Register to intercept events, and either pass them on or consume - them. To listen to keyboard events use registerKeystrokeListener - instead. - @param : listener - A DeviceEventListener which will intercept events. - @param : typeseq - A list of EventType indicating which event types to listen for. - @return True if successful, False if not - """ - func = self._dec.get_dbus_method("registerDeviceEventListener") - return func(event_listener, event_types) - - def deregisterDeviceEventListener(self, - event_listener, - event_types): - """ - De-register a previously registered keyboard eventlistener. - @param : listener - A DeviceEventListener which will intercept events. - @param : typeseq - A List of EventType indicating which event types to stop listening - for. - """ - func = self._dec.get_dbus_method("deregisterDeviceEventListener") - return func(event_listener, event_types) - - def notifyListenersSync(self, event): - """ - Notify the Registry instance that a device event has taken place, - and allow pre-emptive listeners the opportunity to 'consume' - the event and thus prevent its further issuance/forwarding. This - is the method used by accessibility bridges to forward "toolkit - dependent" device events to the Registry from the application's - process space. - @return True if the event was consumed by a (pre-emptive) listener, - False if not (in which case the device event will be forwarded - as normal to any application which would normally receive it, - e.g. the currently active application in the case of mouse or - keyboard events). - """ - func = self._dec.get_dbus_method("notifyListenersSync") - return func(event) - - def notifyListenersAsync(self, event): - """ - Notify the Registry instance that a device event has taken place - in an asynchronous manner. This is the method used by accessibility - bridges to forward "toolkit dependent" device events to the Registry - from the application's process space. If the event in question - is potentially pre-emptible. notifyListenersSync should be used - instead. - """ - func = self._dec.get_dbus_method("notifyListenersAsync") - return func(event) - - def generateKeyboardEvent(self, keycode, keystring, type): - """ - Synthesize a keyboard event. - @param : keycode - A long integer indicating the keycode of the keypress to be synthesized. - @param : keystring - an optional UTF-8 string indicating a complex keyboard input - event. - @param : type - A KeySynthType indicating the type of event(s) to be synthesized: - a key press, release, press-release pair, or a complex input - string (for instance from an internationalized or complex text - input method, or a composed character). - """ - func = self._dec.get_dbus_method("generateKeyboardEvent") - return func(keycode, keystring, type) - - def generateMouseEvent(self, x, y, name): - """ - Synthesize a mouse event. - @param : x - A long integer indicating the screen x coord for the mouse event. - @param : y - A long integer indicating the screen y coord for the mouse event. - @param : name - A string indicating the type of mouse event, e.g. "button1up" - """ - func = self._dec.get_dbus_method("generateMouseEvent") - return func(x, y, name) - -#------------------------------------------------------------------------------ - -class _TestDeviceEventController(object): - """ - Used for testing when no Registry daemon is present. - """ - - def registerKeystrokeListener(self, event_listener, keys, event_mask, key_event_types, event_listener_mode): - return True - - def deregisterKeystrokeListener(self, event_listener, keys, event_mask, key_event_types): - pass - - def registerDeviceEventListener(self, event_listener, event_types): - return True - - def deregisterDeviceEventListener(self, event_listener, event_types): - pass - - def notifyListenersSync(self, event): - return False - - def notifyListenersAsync(self, event): - pass - - def generateKeyboardEvent(self, keycode, keystring, type): - pass - - def generateMouseEvent(self, x, y, name): - pass - -#------------------------------------------------------------------------------ - -class KeyboardDeviceEventListener(_service.Object): - """ - Observes keyboard press and release events. - - @ivar registry: The L{Registry} that created this observer - @type registry: L{Registry} - @ivar key_set: Set of keys to monitor - @type key_set: list of integer - @ivar mask: Watch for key events while these modifiers are held - @type mask: integer - @ivar kind: Kind of events to monitor - @type kind: integer - @ivar mode: Keyboard event mode - @type mode: Accessibility.EventListenerMode - """ - - _next_listener_id = 0 - - def _get_unique_path (self): - KeyboardDeviceEventListener._next_listener_id += 1 - return "/org/freedesktop/atspi/keyeventlistener/%d" % (KeyboardDeviceEventListener._next_listener_id,) - - def __init__(self, registry, synchronous, preemptive, global_): - """ - Creates a mode object that defines when key events will be received from - the system. Stores all other information for later registration. - - @param registry: The L{Registry} that created this observer - @type registry: L{Registry} - @param synchronous: Handle the key event synchronously? - @type synchronous: boolean - @param preemptive: Allow event to be consumed? - @type preemptive: boolean - @param global_: Watch for events on inaccessible applications too? - @type global_: boolean - """ - self._upath = self._get_unique_path() - _service.Object.__init__(self, registry._bus, self._upath) - self.mode = EventListenerMode(synchronous, preemptive, global_) - self._registry = registry - - def register(self, dc, key_set, mask, kind): - """ - Starts keyboard event monitoring. - - @param dc: Reference to a device controller - @type dc: Accessibility.DeviceEventController - @param key_set: Set of keys to monitor - @type key_set: list of integer - @param mask: Integer modifier mask or an iterable over multiple masks to - unapply all at once - @type mask: integer, iterable, or None - @param kind: Kind of events to monitor - @type kind: integer - """ - try: - # check if the mask is iterable - iter(mask) - except TypeError: - # register a single integer if not - dc.registerKeystrokeListener(self._upath, key_set, mask, kind, self.mode) - else: - for m in mask: - dc.registerKeystrokeListener(self._upath, key_set, m, kind, self.mode) - - def unregister(self, dc, key_set, mask, kind): - """ - Stops keyboard event monitoring. - - @param dc: Reference to a device controller - @type dc: Accessibility.DeviceEventController - @param key_set: Set of keys to monitor - @type key_set: list of integer - @param mask: Integer modifier mask or an iterable over multiple masks to - unapply all at once - @type mask: integer, iterable, or None - @param kind: Kind of events to monitor - @type kind: integer - """ - try: - # check if the mask is iterable - iter(mask) - except TypeError: - # unregister a single integer if not - dc.deregisterKeystrokeListener(self._upath, key_set, mask, kind) - else: - for m in mask: - dc.deregisterKeystrokeListener(self._upath, key_set, m, kind) - - @_service.method(dbus_interface=interfaces.ATSPI_DEVICE_EVENT_LISTENER_INTERFACE, - in_signature="(uinnisb)", - out_signature="b") - def notifyEvent(self, ev): - """ - Notifies the L{Registry} that an event has occurred. Wraps the raw event - object in our L{Event} class to support automatic ref and unref calls. An - observer can return True to indicate this event should not be allowed to pass - to other AT-SPI observers or the underlying application. - - @param ev: Keyboard event - @type ev: Accessibility.DeviceEvent - @return: Should the event be consumed (True) or allowed to pass on to other - AT-SPI observers (False)? - @rtype: boolean - """ - # TODO Find out where the exceptions are falling in to. - try: - # wrap the device event - event = DeviceEvent(*ev) - return self._registry.handleDeviceEvent(event, self) - except Exception, e: - import traceback - traceback.print_exc() - return False - -#END--------------------------------------------------------------------------- diff --git a/pyatspi/document.py b/pyatspi/document.py deleted file mode 100644 index 038b1fd..0000000 --- a/pyatspi/document.py +++ /dev/null @@ -1,74 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from accessible import Accessible -from factory import accessible_factory - -__all__ = [ - "Document", - ] - -#------------------------------------------------------------------------------ - -class Document(Accessible): - """ - Primarily a 'tagging' interface which indicates the start of - document content in the Accessibility hierarchy. Accessible objects - below the node implementing Document are normally assumed to - be part of the document content. Attributes of Document are those - attributes associated with the document as a whole. Objects that - implement Document are normally expected to implement Collection - as well. - """ - - def getAttributeValue(self, key): - """ - Gets the value of a single attribute, if specified for the document - as a whole. - @param : attributename - a string indicating the name of a specific attribute (name-value - pair) being queried. - @return a string corresponding to the value of the specified - attribute, or an empty string if the attribute is unspecified - for the object. - """ - func = self.get_dbus_method("getAttributeValue", dbus_interface=ATSPI_DOCUMENT) - return func(key) - - def getAttributes(self): - """ - Gets all attributes specified for a document as a whole. For - attributes which change within the document content, see Accessibility::Text::getAttributes - instead. - @return an AttributeSet containing the attributes of the document, - as name-value pairs. - """ - func = self.get_dbus_method("getAttributes", dbus_interface=ATSPI_DOCUMENT) - return [key + ':' + value for key, value in func().values()] - - def getLocale(self): - """ - Gets the locale associated with the document's content. e.g. - the locale for LOCALE_TYPE_MESSAGES. - @return a string compliant with the POSIX standard for locale - description. - """ - func = self.get_dbus_method("getLocale", dbus_interface=ATSPI_DOCUMENT) - return func() - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_DOCUMENT, Document) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/editabletext.py b/pyatspi/editabletext.py deleted file mode 100644 index 23cdf48..0000000 --- a/pyatspi/editabletext.py +++ /dev/null @@ -1,124 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from factory import accessible_factory -from text import * - -__all__ = [ - "EditableText", - ] - -#------------------------------------------------------------------------------ - -class EditableText(Text): - """ - Derived from interface Text, EditableText provides methods for - modifying textual content of components which support editing. - EditableText also interacts with the system clipboard via copyText, - cutText, and pasteText. - """ - - def copyText(self, start, end): - """ - Copy a range of text into the system clipboard. - @param : startPos - the character offset of the first character in the range of text - being copied. - @param : endPos - the offset of the first character past the end of the range of - text being copied. - """ - func = self.get_dbus_method("copyText", dbus_interface=ATSPI_EDITABLE_TEXT) - return func(start, end) - - def cutText(self, start, end): - """ - Excise a range of text from a Text object, copying it into the - system clipboard. - @param : startPos - the character offset of the first character in the range of text - being cut. - @param : endPos - the offset of the first character past the end of the range of - text being cut. - @return True if the text was successfully cut, False otherwise. - """ - func = self.get_dbus_method("cutText", dbus_interface=ATSPI_EDITABLE_TEXT) - return func(start, end) - - def deleteText(self, start, end): - """ - Excise a range of text from a Text object without copying it - into the system clipboard. - @param : startPos - the character offset of the first character in the range of text - being deleted. - @param : endPos - the offset of the first character past the end of the range of - text being deleted. - @return True if the text was successfully deleted, False otherwise. - """ - func = self.get_dbus_method("deleteText", dbus_interface=ATSPI_EDITABLE_TEXT) - return func(start, end) - - def insertText(self, position, text, length): - """ - Insert new text contents into an existing text object at a given - location, while retaining the old contents. - @param : position - the character offset into the Text implementor's content at which - the new content will be inserted. - @param : text - a UTF-8 string of which length characters will be inserted into - the text object's text buffer. - @param : length - the number of characters of text to insert. If the character - count of text is less than or equal to length, the entire contents - of text will be inserted. - @return True if the text content was successfully inserted, False - otherwise. - """ - func = self.get_dbus_method("insertText", dbus_interface=ATSPI_EDITABLE_TEXT) - return func(position, text, length) - - def pasteText(self, position): - """ - Copy the text contents of the system clipboard, if any, into - a Text object, inserting it at a particular character offset. - @param : position - the character offset before which the text will be inserted. - @return True if the text was successfully pasted into the Text - object, False otherwise. - """ - func = self.get_dbus_method("pasteText", dbus_interface=ATSPI_EDITABLE_TEXT) - return func(position) - - def setTextContents(self, contents): - """ - Replace the text contents with a new string, discarding the old - contents. - @param : newContents - a UTF-8 string with which the text object's contents will be - replaced. - @return True if the text content was successfully changed, False - otherwise. - """ - func = self.get_dbus_method("setTextContents", dbus_interface=ATSPI_EDITABLE_TEXT) - return func(contents) - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_EDITABLE_TEXT, EditableText) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/event.py b/pyatspi/event.py deleted file mode 100644 index 948535f..0000000 --- a/pyatspi/event.py +++ /dev/null @@ -1,262 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -import interfaces -from accessible import BoundingBox -from base import AccessibleObjectNotAvailable - -__all__ = [ - "Event", - "EventType", - "event_type_to_signal_reciever", - ] - -#------------------------------------------------------------------------------ - -_interface_to_klass = { - "org.freedesktop.atspi.Event.Object":"object", - "org.freedesktop.atspi.Event.Window":"window", - "org.freedesktop.atspi.Event.Mouse":"mouse", - "org.freedesktop.atspi.Event.Keyboard":"keyboard", - "org.freedesktop.atspi.Event.Terminal":"terminal", - "org.freedesktop.atspi.Event.Document":"document", - "org.freedesktop.atspi.Event.Focus":"focus", - } - -_klass_to_interface = { - "object":"org.freedesktop.atspi.Event.Object", - "window":"org.freedesktop.atspi.Event.Window", - "mouse":"org.freedesktop.atspi.Event.Mouse", - "keyboard":"org.freedesktop.atspi.Event.Keyboard", - "terminal":"org.freedesktop.atspi.Event.Terminal", - "document":"org.freedesktop.atspi.Event.Document", - "focus":"org.freedesktop.atspi.Event.Focus", - } - -#------------------------------------------------------------------------------ - -class _ELessList(list): - def __getitem__(self, index): - try: - return list.__getitem__(self, index) - except IndexError: - return None - -class EventType(str): - """ - Wraps the AT-SPI event type string so its components can be accessed - individually as klass (can't use the keyword class), major, minor, and detail - (klass_major_minor_detail). - - @note: All attributes of an instance of this class should be considered - public readable as it is acting a a struct. - @ivar klass: Most general event type identifier (object, window, mouse, etc.) - @type klass: string - @ivar major: Second level event type description - @type major: string - @ivar minor: Third level event type description - @type minor: string - @ivar detail: Lowest level event type description - @type detail: string - @ivar name: Full, unparsed event name as received from AT-SPI - @type name: string - @cvar format: Names of the event string components - @type format: 4-tuple of string - """ - - _SEPARATOR = ':' - - def __init__(self, name): - """ - Parses the full AT-SPI event name into its components - (klass:major:minor:detail). If the provided event name is an integer - instead of a string, then the event is really a device event. - - @param name: Full AT-SPI event name - @type name: string - @raise AttributeError: When the given event name is not a valid string - """ - stripped = name.strip(self._SEPARATOR) - separated = stripped.split(self._SEPARATOR, 3) - self._separated = _ELessList(separated) - - self.klass = self._separated[0] - self.major = self._separated[1] - self.minor = self._separated[2] - self.detail = self._separated[3] - - def is_subtype(self, event_type): - """ - Determines if the passed event type is a subtype - of this event. - """ - if event_type.klass and event_type.klass != self.klass: - return False - else: - if event_type.major and event_type.major != self.major: - return False - else: - if event_type.minor and event_type.minor != self.minor: - return False - return True - - @property - def name(self): - return str(self) - - @property - def value(self): - return str(self) - -#------------------------------------------------------------------------------ - -def event_type_to_signal_reciever(bus, cache, event_handler, event_type): - kwargs = { - 'sender_keyword':'sender', - 'interface_keyword':'interface', - 'member_keyword':'member', - 'path_keyword':'path', - } - if event_type.major: - major = event_type.major.replace('-', '_') - if event_type.klass: - kwargs['dbus_interface'] = _klass_to_interface[event_type.klass] - if event_type.major: - kwargs['signal_name'] = major - if event_type.minor: - kwargs['arg0'] = event_type.minor - - def handler_wrapper(minor, detail1, detail2, any_data, - sender=None, interface=None, member=None, path=None): - event = Event(cache, path, sender, interface, member, (minor, detail1, detail2, any_data)) - return event_handler(event) - - return bus.add_signal_receiver(handler_wrapper, **kwargs) - -#------------------------------------------------------------------------------ - -def signal_spec_to_event_string (interface, name, minor): - interface = _interface_to_klass[interface] - name = name.replace('_', '-') - - if interface == "focus": - return "focus:" - - result = interface + ':' - if name: - result += name + ':' - if minor: - result += minor - return result - -#------------------------------------------------------------------------------ - -class Event(object): - """ - Wraps an AT-SPI event with a more Pythonic interface managing exceptions, - the differences in any_data across versions, and the reference counting of - accessibles provided with the event. - - @note: All unmarked attributes of this class should be considered public - readable and writable as the class is acting as a record object. - - @ivar type: The type of the AT-SPI event - @type type: L{EventType} - @ivar detail1: First AT-SPI event parameter - @type detail1: integer - @ivar detail2: Second AT-SPI event parameter - @type detail2: integer - @ivar any_data: Extra AT-SPI data payload - @type any_data: object - @ivar host_application: Application owning the event source - @type host_application: Accessibility.Application - @ivar source_name: Name of the event source at the time of event dispatch - @type source_name: string - @ivar source_role: Role of the event source at the time of event dispatch - @type source_role: Accessibility.Role - @ivar source: Source of the event - @type source: Accessibility.Accessible - """ - def __init__(self, cache, source_path, source_application, interface, name, event): - """ - Extracts information from the provided event. If the event is a "normal" - event, pulls the detail1, detail2, any_data, and source values out of the - given object and stores it in this object. If the event is a device event, - key ID is stored in detail1, scan code is stored in detail2, key name, - key modifiers (e.g. ALT, CTRL, etc.), is text flag, and timestamp are - stored as a 4-tuple in any_data, and source is None (since key events are - global). - - @param event: Event from an AT-SPI callback - @type event: Accessibility.Event or Accessibility.DeviceEvent - """ - self._cache = cache - self._source_path = source_path - self._source_application = source_application - - self._source = None - self._application = None - - self.type = EventType(signal_spec_to_event_string(interface, name, event[0])) - - self.detail1 = event[1] - self.detail2 = event[2] - - data = event[3] - if name == "object_bounds_changed": - self.any_data = BoundingBox(*data) - else: - self.any_data = data - - @property - def host_application(self): - if not self._application: - try: - return self._cache.create_application(self._source_application) - except AccessibleObjectNotAvailable: - pass - return self._application - - @property - def source(self): - if not self._source: - try: - self._source = self._cache.create_accessible(self._source_application, - self._source_path, - interfaces.ATSPI_ACCESSIBLE) - except AccessibleObjectNotAvailable: - pass - return self._source - - @property - def source_name(self): - return source.name - - @property - def source_role(self): - return source.getRole() - - def __str__(self): - """ - Builds a human readable representation of the event including event type, - parameters, and source info. - - @return: Event description - @rtype: string - """ - return '%s(%s, %s, %s)\n\tsource: %s\n\thost_application: %s' % \ - (self.type, self.detail1, self.detail2, self.any_data, - self.source, self.host_application) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/factory.py b/pyatspi/factory.py deleted file mode 100644 index 4b02320..0000000 --- a/pyatspi/factory.py +++ /dev/null @@ -1,28 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -#------------------------------------------------------------------------------ - -class AccessibleFactory(object): - __accessible_interfaces = {} - - def register_accessible_class(self, name, cls): - self.__accessible_interfaces[name] = cls - - def get_accessible_class(self, name): - return self.__accessible_interfaces[name] - -accessible_factory = AccessibleFactory() - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/hyperlink.py b/pyatspi/hyperlink.py deleted file mode 100644 index de7a6db..0000000 --- a/pyatspi/hyperlink.py +++ /dev/null @@ -1,109 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from accessible import Accessible -from factory import accessible_factory - -import dbus - -__all__ = [ - "Hyperlink", - ] - -#------------------------------------------------------------------------------ - -class Hyperlink(Accessible): - """ - Instances of Hyperlink are returned by Hypertext objects, and - are the means by which end users and clients interact with linked, - and in some cases embedded, content. Hyperlinks may have multiple - "anchors", where an anchor corresponds to a reference to a particular - resource with a corresponding resource identified (URI). Hyperlinks - may be queried for their URIs, or queried for the objects corresponding - to their anchors. The objects thus obtained are instances of - Accessible, and may be queried, and manipulated via the Action - interface. - """ - - def getObject(self, index): - """ - Gets the i'th object, (where i is an integer between 0 and Hyperlink::numAnchors - - 1, inclusive) associated with a Hyperlink. The objects returned - are usually actionable (i.e. they should implement Accessibility::Action), - and the available actions often include "open", "bookmark", "save - link as", etc. They may also implement Accessibility::StreamableContent, - although clients can normally use getURI to obtain a resource - locator via which the object's data may be accessed. - @return an Accessible object instance representing the Hyperlink's - ith anchor, or through which the content associated with the - ith anchor can be accessed. - """ - func = self.get_dbus_method("getObject", dbus_interface=ATSPI_HYPERLINK) - return self._cache.create_accessible(self._app_name, func(index), - interfaces.ATSPI_HYPERLINK) - - def getURI(self, index): - """ - Obtain a resource locator ('URI') which can be used to access - the content to which this link "points" or is connected. - @return a string corresponding to the URI of the Hyperlink's - 'ith' anchor, if one exists, or a NIL string otherwise. - """ - func = self.get_dbus_method("getURI", dbus_interface=ATSPI_HYPERLINK) - return func(index) - - def isValid(self): - """ - Check the hyperlink to see if a connection to its backing content - can be established, or if its URI is valid. - @return True if the object's content is available, or False if - the hyperlink's URI is invalid, or a connection to the resource - can not be established. - """ - func = self.get_dbus_method("isValid", dbus_interface=ATSPI_HYPERLINK) - return func() - - def get_endIndex(self): - return dbus.Int32(self._pgetter(self._dbus_interface, "endIndex")) - _endIndexDoc = \ - """ - the ending offset within the containing Hypertext content with - which this Hyperlink is associated; that is, the offset of the - first element past the range within the Hypertext associated - with this Hyperlink. - """ - endIndex = property(fget=get_endIndex, doc=_endIndexDoc) - - def get_nAnchors(self): - return dbus.Int16(self._pgetter(self._dbus_interface, "nAnchors")) - _nAnchorsDoc = \ - """ - the number of separate anchors associated with this Hyperlink - """ - nAnchors = property(fget=get_nAnchors, doc=_nAnchorsDoc) - - def get_startIndex(self): - return dbus.Int32(self._pgetter(self._dbus_interface, "startIndex")) - _startIndexDoc = \ - """ - the starting offset within the containing Hypertext content with - which this Hyperlink is associated - """ - startIndex = property(fget=get_startIndex, doc=_startIndexDoc) - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_HYPERLINK, Hyperlink) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/hypertext.py b/pyatspi/hypertext.py deleted file mode 100644 index 6e7332f..0000000 --- a/pyatspi/hypertext.py +++ /dev/null @@ -1,71 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from accessible import Accessible -from factory import accessible_factory - -__all__ = [ - "Hypertext", - ] - -#------------------------------------------------------------------------------ - -class Hypertext(Accessible): - """ - An interface used for objects which implement linking between - multiple resource or content locations, or multiple 'markers' - within a single document. A Hypertext instance is associated - with one or more Hyperlinks, which are associated with particular - offsets within the Hypertext's included content. - """ - - def getLink(self, index): - """ - Get one of the Hyperlinks associated with this Hypertext object, - by index. - @param : linkIndex - an integer from 0 to getNLinks() - 1. - @return the Hyperlink in this Hypertext object. - """ - func = self.get_dbus_method("getLink", dbus_interface=ATSPI_HYPERTEXT) - return self._cache.create_accessible(self._app_name, func(index), - interfaces.ATSPI_HYPERTEXT) - - def getLinkIndex(self, character_index): - """ - Get the hyperlink index, if any, associated with a particular - character offset in the Hypertext object. For Hypertext implementors - without textual content, all hyperlinks are associated with character - offset '0'. - @return the index of the Hyperlink associated with character - offset characterIndex, or -1 if no Hyperlink is associated with - that character offset. - """ - func = self.get_dbus_method("getLinkIndex", dbus_interface=ATSPI_HYPERTEXT) - return func(character_index) - - def getNLinks(self): - """ - Query the hypertext object for the number of Hyperlinks it contains. - @return the number of Hyperlinks associated with this Hypertext - object, as a long integer. - """ - func = self.get_dbus_method("getNLinks", dbus_interface=ATSPI_HYPERTEXT) - return func() - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_HYPERTEXT, Hypertext) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/image.py b/pyatspi/image.py deleted file mode 100644 index b2b595a..0000000 --- a/pyatspi/image.py +++ /dev/null @@ -1,110 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -import dbus -from interfaces import * -from accessible import Accessible -from factory import accessible_factory -from accessible import BoundingBox - -from dbus.types import UInt32 - -__all__ = [ - "Image", - ] - -#------------------------------------------------------------------------------ - -class Image(Accessible): - """ - An interface implemented by objects which render image data or - pictorial information to the screen. When onscreen components - include graphical information that is not purely intended to - enhance "3d effect" or visual layout, but which conveys some - semantic or informational content to the sighted user, they should - implement Image, and that semantic content should be conveyed - textually to the extent possible via the image description, as - well as the Accessible::name and Accessible::description properties. - """ - - def getImageExtents(self, coordType): - """ - Obtain a bounding box which entirely contains the image contents, - as displayed on screen. The bounds returned do not account for - any viewport clipping or the fact that the image may be partially - or wholly obscured by other onscreen content. - @param : coordType - If 0, the returned bounding box position is returned relative - to the screen; if 1, the bounding box position is returned relative - to the containing window. - @return a BoundingBox enclosing the image's onscreen representation. - """ - func = self.get_dbus_method("getImageExtents", dbus_interface=ATSPI_IMAGE) - return BoundingBox(*func(UInt32(coordType))) - - def getImagePosition(self, coord_type): - """ - Get the coordinates of the current image position on screen. - @param : x - Back-filled with the x coordinate of the onscreen image (i.e. - the minimum x coordinate) - @param : y - Back-filled with the y coordinate of the onscreen image (i.e. - the minimum y coordinate) - @param : coordType - If 0, the returned x and y coordinates are returned relative - to the screen; if 1, they are returned relative to the containing - window. - """ - func = self.get_dbus_method("getImagePosition", dbus_interface=ATSPI_IMAGE) - return func(UInt32(coord_type)) - - def getImageSize(self): - """ - Obtain the width and height of the current onscreen view of the - image. The extents returned do not account for any viewport clipping - or the fact that the image may be partially or wholly obscured - by other onscreen content. - @param : width - Back-filled with the x extents of the onscreen image (i.e. the - image width in pixels) - @param : height - Back-filled with the y extents of the onscreen image (i.e. the - image height in pixels) - """ - func = self.get_dbus_method("getImageSize", dbus_interface=ATSPI_IMAGE) - return func() - - def get_imageDescription(self): - return dbus.String(self._pgetter(self._dbus_interface, "imageDescription")) - _imageDescriptionDoc = \ - """ - A UTF-8 string providing a textual description of what is visually - depicted in the image. - """ - imageDescription = property(fget=get_imageDescription, doc=_imageDescriptionDoc) - - def get_imageLocale(self): - return dbus.String(self._pgetter(self._dbus_interface, "imageLocale")) - _imageLocaleDoc = \ - """ - A string corresponding to the POSIX LC_MESSAGES locale used by - the imageDescription. - """ - imageLocale = property(fget=get_imageLocale, doc=_imageLocaleDoc) - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_IMAGE, Image) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/interfaces.py b/pyatspi/interfaces.py deleted file mode 100644 index 0883fb9..0000000 --- a/pyatspi/interfaces.py +++ /dev/null @@ -1,40 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -ATSPI_ACCESSIBLE = 'org.freedesktop.atspi.Accessible' -ATSPI_ACTION = 'org.freedesktop.atspi.Action' -ATSPI_APPLICATION = 'org.freedesktop.atspi.Application' -ATSPI_COMPONENT = 'org.freedesktop.atspi.Component' -ATSPI_COLLECTION = 'org.freedesktop.atspi.Collection' -ATSPI_DESKTOP = 'org.freedesktop.atspi.Desktop' -ATSPI_DOCUMENT = 'org.freedesktop.atspi.Document' -ATSPI_EDITABLE_TEXT = 'org.freedesktop.atspi.EditableText' -ATSPI_HYPERLINK = 'org.freedesktop.atspi.Hyperlink' -ATSPI_HYPERTEXT = 'org.freedesktop.atspi.Hypertext' -ATSPI_IMAGE = 'org.freedesktop.atspi.Image' -ATSPI_LOGIN_HELPER = 'org.freedesktop.atspi.LoginHelper' -ATSPI_SELECTION = 'org.freedesktop.atspi.Selection' -ATSPI_SELECTOR = 'org.freedesktop.atspi.Selector' -ATSPI_STREAMABLE_CONTENT = 'org.freedesktop.atspi.Content' -ATSPI_TABLE = 'org.freedesktop.atspi.Table' -ATSPI_TEXT = 'org.freedesktop.atspi.Text' -ATSPI_VALUE = 'org.freedesktop.atspi.Value' - -ATSPI_REGISTRY_INTERFACE = 'org.freedesktop.atspi.Registry' -ATSPI_REGISTRY_PATH = '/org/freedesktop/atspi/registry' -ATSPI_REGISTRY_NAME = 'org.freedesktop.atspi.Registry' - -ATSPI_DEVICE_EVENT_CONTROLLER_INTERFACE = 'org.freedesktop.atspi.DeviceEventController' -ATSPI_DEVICE_EVENT_CONTROLLER_PATH = '/org/freedesktop/atspi/registry/deviceeventcontroller' -ATSPI_DEVICE_EVENT_LISTENER_INTERFACE = 'org.freedesktop.atspi.DeviceEventListener' diff --git a/pyatspi/loginhelper.py b/pyatspi/loginhelper.py deleted file mode 100644 index a8b5183..0000000 --- a/pyatspi/loginhelper.py +++ /dev/null @@ -1,147 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from base import Enum -from accessible import Accessible -from factory import accessible_factory - -__all__ = [ - "LoginHelper", - ] - -#------------------------------------------------------------------------------ - -class LoginHelper(Accessible): - """ - An interface for use by assistive technologies by which they - can access system information and services on a 'need to know' - basis while the screen is locked, during user authentication, - or during other sensitive operations. - This interface is intended for use by assistive technologies - and related user-enabling services, and by applications and utilities - which may wish to restrict access to certain system devices and - services during security-sensitive states, e.g. when the screen - is locked or during authentication into some secure service. - Such 'applications' (for instance, screen lock dialogs and security-enabled - web browsers) use the LoginHelper client interfaces, and the - bonobo-activation query service, to query for assistive technologies - which advertise the LoginHelper service. The client then queries - these assistive technologies for their device I/O requirements, - via the getDeviceReqs call. The client may then issue the advisory - request setSafe (TRUE), which requests that the LoginHelper -implementing - service make a best-effort attempt to make itself more secure - (for instance, an onscreen keyboard might turn off word prediction, - and a screenreader may turn off keyboard echo via speech). The - return value of setSafe is an advisory indication of whether - this attempt was successful (no specific guarantees are implied). - Once the 'security sensitive' state is exited, the client should - call setSafe (FALSE). - The return values from getDeviceReqs inform the client of which - services the LoginHelper service (e. g. assistive technology) - needs in order to do its job. The client may use this information - to loosen any restrictions on access which it may currently have - in place (for instance, keyboard grabs, etc.). If it does not - do so, the likely outcome is that the end-user will experience - loss of access to the system. - """ - - def getDeviceReqs(self, *args, **kwargs): - """ - getDeviceReqs: - Query a LoginHelper for the types of device I/O it requires, - in order to do its job. For instance, a LoginHelper which needs - to receive keyboard events will include Accessibility_LoginHelper_CORE_KEYBOARD - in this list. - @return : A sequence of LoginHelper_DeviceReq indicating the - device I/O required in order to facilitate end-user access to - the system. - """ - func = self.get_dbus_method("getDeviceReqs", dbus_interface=ATSPI_LOGIN_HELPER) - return func(*args, **kwargs) - - def getRaiseWindows(self, *args, **kwargs): - """ - getRaiseWindows: - Get a list of window IDs that need raising on login. - @return : a sequence containing window IDS for toplevels which - need to be raised/made visible during user authentication, in - order for the LoginHelper to facilitate end-user access to the - system. - """ - func = self.get_dbus_method("getRaiseWindows", dbus_interface=ATSPI_LOGIN_HELPER) - return func(*args, **kwargs) - - def setSafe(self, *args, **kwargs): - """ - setSafe: - @param : safe_mode - TRUE if the client is requesting that 'safe mode' be initiated, - FALSE if the client is advising that 'safe mode' may be exited, - i.e. normal operation may be resumed. - Request a LoginHelper to enter "safe" mode, or inform LoginHelper - that "safe" mode may be exited. If safe_mode is TRUE, but the - return value is FALSE, the requesting client may wish to deny - services to the LoginHelper, for instance avoid raising its toplevels. - The return value is purely advisory, and no guarantees are intended - about what the implementing LoginHelper will do to improve security - when in "safe" mode. - @return : whether the LoginHelper is now "safe" or not. - """ - func = self.get_dbus_method("setSafe", dbus_interface=ATSPI_LOGIN_HELPER) - return func(*args, **kwargs) - - class DeviceReq(Enum): - _enum_lookup = { - 0:'GUI_EVENTS', - 1:'CORE_KEYBOARD', - 2:'CORE_POINTER', - 3:'EXT_INPUT', - 4:'POST_WINDOWS', - 5:'AUDIO_OUT', - 6:'AUDIO_IN', - 7:'NETWORK', - 8:'LOCALHOST', - 9:'SERIAL_OUT', - 10:'SERIAL_IN', - } - - AUDIO_IN = DeviceReq(6) - AUDIO_OUT = DeviceReq(5) - CORE_KEYBOARD = DeviceReq(1) - CORE_POINTER = DeviceReq(2) - EXT_INPUT = DeviceReq(3) - GUI_EVENTS = DeviceReq(0) - LOCALHOST = DeviceReq(8) - NETWORK = DeviceReq(7) - POST_WINDOWS = DeviceReq(4) - SERIAL_IN = DeviceReq(10) - SERIAL_OUT = DeviceReq(9) - - class WindowInfo(list): - def __new__(cls, winID): - list.__new__(cls, (winID)) - def __init__(self, winID): - list.__init__(self, (winID)) - - def _get_winID(self): - return self[0] - def _set_winID(self, val): - self[0] = val - winID = property(fget=_get_winID, fset=_set_winID) - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_LOGIN_HELPER, LoginHelper) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/registry.py b/pyatspi/registry.py deleted file mode 100644 index ab22053..0000000 --- a/pyatspi/registry.py +++ /dev/null @@ -1,482 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd -#copyright: Copyright (c) 2005, 2007 IBM Corporation - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -#Portions of this code originally licensed and copyright (c) 2005, 2007 -#IBM Corporation under the BSD license, available at -#U{http://www.opensource.org/licenses/bsd-license.php} - -#authors: Peter Parente, Mark Doffman - -import os as _os -import dbus as _dbus -import gobject as _gobject - -from desktop import Desktop as _Desktop - -from event import EventType as _EventType -from event import event_type_to_signal_reciever as _event_type_to_signal_reciever - -from applicationcache import TestApplicationCache, ApplicationCache - -from dbus.mainloop.glib import DBusGMainLoop as _DBusGMainLoop - -from Queue import Queue -from deviceevent import * -from deviceevent import _TestDeviceEventController - -_DBusGMainLoop(set_as_default=True) - -#------------------------------------------------------------------------------ - -class _Registry(object): - """ - Wraps the Accessibility.Registry to provide more Pythonic registration for - events. - - This object should be treated as a singleton, but such treatment is not - enforced. You can construct another instance of this object and give it a - reference to the Accessibility.Registry singleton. Doing so is harmless and - has no point. - - @ivar async: Should event dispatch to local listeners be decoupled from event - receiving from the registry? - @type async: boolean - @ivar reg: Reference to the real, wrapped registry object - @type reg: Accessibility.Registry - @ivar dev: Reference to the device controller - @type dev: Accessibility.DeviceEventController - @ivar queue: Queue of events awaiting local dispatch - @type queue: Queue.Queue - @ivar clients: Map of event names to client listeners - @type clients: dictionary - @ivar observers: Map of event names to AT-SPI L{_Observer} objects - @type observers: dictionary - """ - - def __init__(self): - """ - Stores a reference to the AT-SPI registry. Gets and stores a reference - to the DeviceEventController. - - @param reg: Reference to the AT-SPI registry daemon - @type reg: Accessibility.Registry - """ - self._bus = _dbus.SessionBus() - - app_name = None - if "ATSPI_TEST_APP_NAME" in _os.environ.keys(): - app_name = _os.environ["ATSPI_TEST_APP_NAME"] - - if app_name: - self._app_cache = TestApplicationCache(self, self._bus, app_name) - self.dev = _TestDeviceEventController() - else: - self._app_cache = ApplicationCache(self, self._bus) - self.dev = DeviceEventController(self._bus) - - self._event_listeners = {} - - # All of this special casing is for the 'faked' - # events caused by cache updates. - - self._name_type = _EventType("object:property-change:name") - self._name_listeners = {} - self._description_type = _EventType("object:property-change:description") - self._description_listeners = {} - self._parent_type = _EventType("object:property-change:parent") - self._parent_listeners = {} - self._children_changed_type = _EventType("object:children-changed") - self._children_changed_listeners = {} - - self.clients = {} - self.deviceClients = {} - - def __call__(self): - """ - @return: This instance of the registry - @rtype: L{Registry} - """ - return self - - @property - def cache (self): - """ - This is the accessible application cache through which - all accessible objects are accessed. - """ - return self._app_cache - - def start(self, async=False, gil=True): - """ - Enter the main loop to start receiving and dispatching events. - - @param async: Should event dispatch be asynchronous (decoupled) from - event receiving from the AT-SPI registry? - @type async: boolean - @param gil: Add an idle callback which releases the Python GIL for a few - milliseconds to allow other threads to run? Necessary if other threads - will be used in this process. - Note - No Longer used. - @type gil: boolean - """ - self._loop = _gobject.MainLoop() - try: - self._loop.run() - except KeyboardInterrupt: - pass - - def stop(self, *args): - """Quits the main loop.""" - self._loop.quit() - self.flushEvents() - - def getDesktopCount(self): - """ - Gets the number of available desktops. - - @return: Number of desktops - @rtype: integer - """ - return 1 - - def getDesktop(self, i): - """ - Gets a reference to the i-th desktop. - - @param i: Which desktop to get - @type i: integer - @return: Desktop reference - @rtype: Accessibility.Desktop - """ - return _Desktop(self._app_cache) - - # ------------------------------------------------------------------------------- - - def _callClients(self, register, event): - for client in register.keys(): - client(event) - - def _notifyNameChange(self, event): - self._callClients(self._name_listeners, event) - - def _notifyDescriptionChange(self, event): - self._callClients(self._description_listeners, event) - - def _notifyParentChange(self, event): - self._callClients(self._parent_listeners, event) - - def _notifyChildrenChange(self, event): - self._callClients(self._children_changed_listeners, event) - - def _registerFake(self, type, register, client, *names): - """ - Registers a client from a register of clients - for 'Fake' events emitted by the cache. - """ - try: - registered = register[client] - except KeyError: - registered = [] - register[client] = registered - - for name in names: - new_type = _EventType(name) - if new_type.is_subtype(type): - registered.append(new_type.name) - - if registered == []: - del(register[client]) - - def _deregisterFake(self, type, register, client, *names): - """ - Deregisters a client from a register of clients - for 'Fake' events emitted by the cache. - """ - try: - registered = register[client] - except KeyError: - return True - - for name in names: - remove_type = _EventType(name) - - copy = registered[:] - for i in range(0, len(copy)): - type_name = copy[i] - registered_type = _EventType(type_name) - - if remove_type.is_subtype(registered_type): - del(registered[i]) - - if registered == []: - del(register[client]) - - # ------------------------------------------------------------------------------- - - def registerEventListener(self, client, *names): - """ - Registers a new client callback for the given event names. Supports - registration for all subevents if only partial event name is specified. - Do not include a trailing colon. - - For example, 'object' will register for all object events, - 'object:property-change' will register for all property change events, - and 'object:property-change:accessible-parent' will register only for the - parent property change event. - - Registered clients will not be automatically removed when the client dies. - To ensure the client is properly garbage collected, call - L{deregisterEventListener}. - - @param client: Callable to be invoked when the event occurs - @type client: callable - @param names: List of full or partial event names - @type names: list of string - """ - try: - registered = self._event_listeners[client] - except KeyError: - registered = [] - self._event_listeners[client] = registered - - for name in names: - new_type = _EventType(name) - registered.append((new_type.name, - _event_type_to_signal_reciever(self._bus, self._app_cache, client, new_type))) - - self._registerFake(self._name_type, self._name_listeners, client, *names) - self._registerFake(self._description_type, self._description_listeners, client, *names) - self._registerFake(self._parent_type, self._parent_listeners, client, *names) - self._registerFake(self._children_changed_type, self._children_changed_listeners, client, *names) - - def deregisterEventListener(self, client, *names): - """ - Unregisters an existing client callback for the given event names. Supports - unregistration for all subevents if only partial event name is specified. - Do not include a trailing colon. - - This method must be called to ensure a client registered by - L{registerEventListener} is properly garbage collected. - - @param client: Client callback to remove - @type client: callable - @param names: List of full or partial event names - @type names: list of string - @return: Were event names specified for which the given client was not - registered? - @rtype: boolean - """ - try: - registered = self._event_listeners[client] - except KeyError: - # Presumably if were trying to deregister a client with - # no names then the return type is always true. - return True - - missing = False - - for name in names: - remove_type = _EventType(name) - copy = registered[:] - for i in range (0, len(copy)): - type_name, signal_match = copy[i] - registered_type = _EventType(type_name) - - if remove_type.is_subtype(registered_type): - signal_match.remove() - del(registered[i]) - else: - missing = True - - if registered == []: - del(self._event_listeners[client]) - - #TODO Do these account for missing also? - self._deregisterFake(self._name_type, self._name_listeners, client, *names) - self._deregisterFake(self._description_type, self._description_listeners, client, *names) - self._deregisterFake(self._parent_type, self._parent_listeners, client, *names) - self._deregisterFake(self._children_changed_type, self._children_changed_listeners, client, *names) - - return missing - - # ------------------------------------------------------------------------------- - - def registerKeystrokeListener(self, - client, - key_set=[], - mask=0, - kind=(KEY_PRESSED_EVENT, KEY_RELEASED_EVENT), - synchronous=True, - preemptive=True, - global_=False): - """ - Registers a listener for key stroke events. - - @param client: Callable to be invoked when the event occurs - @type client: callable - @param key_set: Set of hardware key codes to stop monitoring. Leave empty - to indicate all keys. - @type key_set: list of integer - @param mask: When the mask is None, the codes in the key_set will be - monitored only when no modifier is held. When the mask is an - integer, keys in the key_set will be monitored only when the modifiers in - the mask are held. When the mask is an iterable over more than one - integer, keys in the key_set will be monitored when any of the modifier - combinations in the set are held. - @type mask: integer, iterable, None - @param kind: Kind of events to watch, KEY_PRESSED_EVENT or - KEY_RELEASED_EVENT. - @type kind: list - @param synchronous: Should the callback notification be synchronous, giving - the client the chance to consume the event? - @type synchronous: boolean - @param preemptive: Should the callback be allowed to preempt / consume the - event? - @type preemptive: boolean - @param global_: Should callback occur even if an application not supporting - AT-SPI is in the foreground? (requires xevie) - @type global_: boolean - """ - try: - # see if we already have an observer for this client - ob = self.deviceClients[client] - except KeyError: - # create a new device observer for this client - ob = KeyboardDeviceEventListener(self, synchronous, preemptive, global_) - # store the observer to client mapping, and the inverse - self.deviceClients[ob] = client - self.deviceClients[client] = ob - if mask is None: - # None means all modifier combinations - mask = utils.allModifiers() - # register for new keystrokes on the observer - ob.register(self.dev, key_set, mask, kind) - - def deregisterKeystrokeListener(self, - client, - key_set=[], - mask=0, - kind=(KEY_PRESSED_EVENT, KEY_RELEASED_EVENT)): - """ - Deregisters a listener for key stroke events. - - @param client: Callable to be invoked when the event occurs - @type client: callable - @param key_set: Set of hardware key codes to stop monitoring. Leave empty - to indicate all keys. - @type key_set: list of integer - @param mask: When the mask is None, the codes in the key_set will be - monitored only when no modifier is held. When the mask is an - integer, keys in the key_set will be monitored only when the modifiers in - the mask are held. When the mask is an iterable over more than one - integer, keys in the key_set will be monitored when any of the modifier - combinations in the set are held. - @type mask: integer, iterable, None - @param kind: Kind of events to stop watching, KEY_PRESSED_EVENT or - KEY_RELEASED_EVENT. - @type kind: list - @raise KeyError: When the client isn't already registered for events - """ - # see if we already have an observer for this client - ob = self.deviceClients[client] - if mask is None: - # None means all modifier combinations - mask = utils.allModifiers() - # register for new keystrokes on the observer - ob.unregister(self.dev, key_set, mask, kind) - - def handleDeviceEvent(self, event, ob): - """ - Dispatches L{event.DeviceEvent}s to registered clients. Clients are called - in the order they were registered for the given AT-SPI event. If any - client returns True, callbacks cease for the event for clients of this registry - instance. Clients of other registry instances and clients in other processes may - be affected depending on the values of synchronous and preemptive used when invoking - L{registerKeystrokeListener}. - - @note: Asynchronous dispatch of device events is not supported. - - @param event: AT-SPI device event - @type event: L{event.DeviceEvent} - @param ob: Observer that received the event - @type ob: L{KeyboardDeviceEventListener} - - @return: Should the event be consumed (True) or allowed to pass on to other - AT-SPI observers (False)? - @rtype: boolean - """ - try: - # try to get the client registered for this event type - client = self.deviceClients[ob] - except KeyError: - # client may have unregistered recently, ignore event - return False - # make the call to the client - try: - return client(event) or event.consume - except Exception: - # print the exception, but don't let it stop notification - traceback.print_exc() - - # ------------------------------------------------------------------------------- - - def pumpQueuedEvents (self): - """ - No Longer needed all application events are asyncronous. - """ - pass - - def flushEvents (self): - """ - No Longer needed all application events are asyncronous. - """ - pass - - # ------------------------------------------------------------------------------- - - def generateKeyboardEvent(self, keycode, keysym, kind): - """ - Generates a keyboard event. One of the keycode or the keysym parameters - should be specified and the other should be None. The kind parameter is - required and should be one of the KEY_PRESS, KEY_RELEASE, KEY_PRESSRELEASE, - KEY_SYM, or KEY_STRING. - - @param keycode: Hardware keycode or None - @type keycode: integer - @param keysym: Symbolic key string or None - @type keysym: string - @param kind: Kind of event to synthesize - @type kind: integer - """ - if keysym is None: - self.dev.generateKeyboardEvent(keycode, '', kind) - else: - self.dev.generateKeyboardEvent(None, keysym, kind) - - def generateMouseEvent(self, x, y, name): - """ - Generates a mouse event at the given absolute x and y coordinate. The kind - of event generated is specified by the name. For example, MOUSE_B1P - (button 1 press), MOUSE_REL (relative motion), MOUSE_B3D (butten 3 - double-click). - - @param x: Horizontal coordinate, usually left-hand oriented - @type x: integer - @param y: Vertical coordinate, usually left-hand oriented - @type y: integer - @param name: Name of the event to generate - @type name: string - """ - self.dev.generateMouseEvent(_dbus.Int32(x), _dbus.Int32(y), name) diff --git a/pyatspi/relation.py b/pyatspi/relation.py deleted file mode 100644 index ef952c2..0000000 --- a/pyatspi/relation.py +++ /dev/null @@ -1,137 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd -#copyright: Copyright (c) 2005, 2007 IBM Corporation - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -#Portions of this code originally licensed and copyright (c) 2005, 2007 -#IBM Corporation under the BSD license, available at -#U{http://www.opensource.org/licenses/bsd-license.php} - -#authors: Peter Parente, Mark Doffman - -import interfaces -from base import Enum as _Enum - -#------------------------------------------------------------------------------ - -class RelationType(_Enum): - _enum_lookup = { - 0:'RELATION_NULL', - 1:'RELATION_LABEL_FOR', - 2:'RELATION_LABELLED_BY', - 3:'RELATION_CONTROLLER_FOR', - 4:'RELATION_CONTROLLED_BY', - 5:'RELATION_MEMBER_OF', - 6:'RELATION_TOOLTIP_FOR', - 7:'RELATION_NODE_CHILD_OF', - 8:'RELATION_EXTENDED', - 9:'RELATION_FLOWS_TO', - 10:'RELATION_FLOWS_FROM', - 11:'RELATION_SUBWINDOW_OF', - 12:'RELATION_EMBEDS', - 13:'RELATION_EMBEDDED_BY', - 14:'RELATION_POPUP_FOR', - 15:'RELATION_PARENT_WINDOW_OF', - 16:'RELATION_DESCRIPTION_FOR', - 17:'RELATION_DESCRIBED_BY', - 18:'RELATION_LAST_DEFINED', - } - -#------------------------------------------------------------------------------ - -RELATION_CONTROLLED_BY = RelationType(4) -RELATION_CONTROLLER_FOR = RelationType(3) -RELATION_DESCRIBED_BY = RelationType(17) -RELATION_DESCRIPTION_FOR = RelationType(16) -RELATION_EMBEDDED_BY = RelationType(13) -RELATION_EMBEDS = RelationType(12) -RELATION_EXTENDED = RelationType(8) -RELATION_FLOWS_FROM = RelationType(10) -RELATION_FLOWS_TO = RelationType(9) -RELATION_LABELLED_BY = RelationType(2) -RELATION_LABEL_FOR = RelationType(1) -RELATION_LAST_DEFINED = RelationType(18) -RELATION_MEMBER_OF = RelationType(5) -RELATION_NODE_CHILD_OF = RelationType(7) -RELATION_NULL = RelationType(0) -RELATION_PARENT_WINDOW_OF = RelationType(15) -RELATION_POPUP_FOR = RelationType(14) -RELATION_SUBWINDOW_OF = RelationType(11) -RELATION_TOOLTIP_FOR = RelationType(6) - -#------------------------------------------------------------------------------ - -# Build a dictionary mapping relation values to names based on the prefix of the enum constants. - -RELATION_VALUE_TO_NAME = dict(((value, name[9:].lower().replace('_', ' ')) - for name, value - in globals().items() - if name.startswith('RELATION_'))) - -#------------------------------------------------------------------------------ - -def _marshal_relation_set(cache, app_name, relation_set): - """ - The D-Bus protocol has a relation set passed as an array of - relation types and object arrays. - - This function marshals the D-Bus message into a list of relation - objects. - """ - return [Relation(cache, app_name, *relation) for relation in relation_set] - -#------------------------------------------------------------------------------ - -class Relation(object): - """ - An interface via which objects' non-hierarchical relationships - to one another are indicated. An instance of Relations represents - a "one-to-many" correspondance. - """ - - def __init__(self, cache, app_name, type, objects): - self._type = type - self._objects = objects - - self._cache = cache - self._app_name = app_name - - def getNTargets(self): - """ - @return the number of objects to which this relationship applies. - """ - return len(self._objects) - - def getRelationType(self): - """ - @return the RelationType of this Relation. - """ - return RelationType(self._type) - - def getRelationTypeName(self): - """ - @return an unlocalized string representing the relation type. - """ - return RELATION_VALUE_TO_NAME[self._type] - - def getTarget(self, index): - """ - @return an Object which is the 'nth'target of this Relation, - e.g. the Object at index i in the list of Objects having the - specified relationship to this Accessible. - """ - return self._cache.create_accessible(self._app_name, - self._objects[index], - interfaces.ATSPI_ACCESSIBLE) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/role.py b/pyatspi/role.py deleted file mode 100644 index a7dac27..0000000 --- a/pyatspi/role.py +++ /dev/null @@ -1,297 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from base import Enum as _Enum - -#------------------------------------------------------------------------------ - -class Role(_Enum): - _enum_lookup = { - 0:'ROLE_INVALID', - 1:'ROLE_ACCELERATOR_LABEL', - 2:'ROLE_ALERT', - 3:'ROLE_ANIMATION', - 4:'ROLE_ARROW', - 5:'ROLE_CALENDAR', - 6:'ROLE_CANVAS', - 7:'ROLE_CHECK_BOX', - 8:'ROLE_CHECK_MENU_ITEM', - 9:'ROLE_COLOR_CHOOSER', - 10:'ROLE_COLUMN_HEADER', - 11:'ROLE_COMBO_BOX', - 12:'ROLE_DATE_EDITOR', - 13:'ROLE_DESKTOP_ICON', - 14:'ROLE_DESKTOP_FRAME', - 15:'ROLE_DIAL', - 16:'ROLE_DIALOG', - 17:'ROLE_DIRECTORY_PANE', - 18:'ROLE_DRAWING_AREA', - 19:'ROLE_FILE_CHOOSER', - 20:'ROLE_FILLER', - 21:'ROLE_FOCUS_TRAVERSABLE', - 22:'ROLE_FONT_CHOOSER', - 23:'ROLE_FRAME', - 24:'ROLE_GLASS_PANE', - 25:'ROLE_HTML_CONTAINER', - 26:'ROLE_ICON', - 27:'ROLE_IMAGE', - 28:'ROLE_INTERNAL_FRAME', - 29:'ROLE_LABEL', - 30:'ROLE_LAYERED_PANE', - 31:'ROLE_LIST', - 32:'ROLE_LIST_ITEM', - 33:'ROLE_MENU', - 34:'ROLE_MENU_BAR', - 35:'ROLE_MENU_ITEM', - 36:'ROLE_OPTION_PANE', - 37:'ROLE_PAGE_TAB', - 38:'ROLE_PAGE_TAB_LIST', - 39:'ROLE_PANEL', - 40:'ROLE_PASSWORD_TEXT', - 41:'ROLE_POPUP_MENU', - 42:'ROLE_PROGRESS_BAR', - 43:'ROLE_PUSH_BUTTON', - 44:'ROLE_RADIO_BUTTON', - 45:'ROLE_RADIO_MENU_ITEM', - 46:'ROLE_ROOT_PANE', - 47:'ROLE_ROW_HEADER', - 48:'ROLE_SCROLL_BAR', - 49:'ROLE_SCROLL_PANE', - 50:'ROLE_SEPARATOR', - 51:'ROLE_SLIDER', - 52:'ROLE_SPIN_BUTTON', - 53:'ROLE_SPLIT_PANE', - 54:'ROLE_STATUS_BAR', - 55:'ROLE_TABLE', - 56:'ROLE_TABLE_CELL', - 57:'ROLE_TABLE_COLUMN_HEADER', - 58:'ROLE_TABLE_ROW_HEADER', - 59:'ROLE_TEAROFF_MENU_ITEM', - 60:'ROLE_TERMINAL', - 61:'ROLE_TEXT', - 62:'ROLE_TOGGLE_BUTTON', - 63:'ROLE_TOOL_BAR', - 64:'ROLE_TOOL_TIP', - 65:'ROLE_TREE', - 66:'ROLE_TREE_TABLE', - 67:'ROLE_UNKNOWN', - 68:'ROLE_VIEWPORT', - 69:'ROLE_WINDOW', - 70:'ROLE_EXTENDED', - 71:'ROLE_HEADER', - 72:'ROLE_FOOTER', - 73:'ROLE_PARAGRAPH', - 74:'ROLE_RULER', - 75:'ROLE_APPLICATION', - 76:'ROLE_AUTOCOMPLETE', - 77:'ROLE_EDITBAR', - 78:'ROLE_EMBEDDED', - 79:'ROLE_ENTRY', - 80:'ROLE_CHART', - 81:'ROLE_CAPTION', - 82:'ROLE_DOCUMENT_FRAME', - 83:'ROLE_HEADING', - 84:'ROLE_PAGE', - 85:'ROLE_SECTION', - 86:'ROLE_REDUNDANT_OBJECT', - 87:'ROLE_FORM', - 88:'ROLE_LINK', - 89:'ROLE_INPUT_METHOD_WINDOW', - 90:'ROLE_LAST_DEFINED', - } - -ROLE_ACCELERATOR_LABEL = Role(1) -ROLE_ALERT = Role(2) -ROLE_ANIMATION = Role(3) -ROLE_APPLICATION = Role(75) -ROLE_ARROW = Role(4) -ROLE_AUTOCOMPLETE = Role(76) -ROLE_CALENDAR = Role(5) -ROLE_CANVAS = Role(6) -ROLE_CAPTION = Role(81) -ROLE_CHART = Role(80) -ROLE_CHECK_BOX = Role(7) -ROLE_CHECK_MENU_ITEM = Role(8) -ROLE_COLOR_CHOOSER = Role(9) -ROLE_COLUMN_HEADER = Role(10) -ROLE_COMBO_BOX = Role(11) -ROLE_DATE_EDITOR = Role(12) -ROLE_DESKTOP_FRAME = Role(14) -ROLE_DESKTOP_ICON = Role(13) -ROLE_DIAL = Role(15) -ROLE_DIALOG = Role(16) -ROLE_DIRECTORY_PANE = Role(17) -ROLE_DOCUMENT_FRAME = Role(82) -ROLE_DRAWING_AREA = Role(18) -ROLE_EDITBAR = Role(77) -ROLE_EMBEDDED = Role(78) -ROLE_ENTRY = Role(79) -ROLE_EXTENDED = Role(70) -ROLE_FILE_CHOOSER = Role(19) -ROLE_FILLER = Role(20) -ROLE_FOCUS_TRAVERSABLE = Role(21) -ROLE_FONT_CHOOSER = Role(22) -ROLE_FOOTER = Role(72) -ROLE_FORM = Role(87) -ROLE_FRAME = Role(23) -ROLE_GLASS_PANE = Role(24) -ROLE_HEADER = Role(71) -ROLE_HEADING = Role(83) -ROLE_HTML_CONTAINER = Role(25) -ROLE_ICON = Role(26) -ROLE_IMAGE = Role(27) -ROLE_INPUT_METHOD_WINDOW = Role(89) -ROLE_INTERNAL_FRAME = Role(28) -ROLE_INVALID = Role(0) -ROLE_LABEL = Role(29) -ROLE_LAST_DEFINED = Role(90) -ROLE_LAYERED_PANE = Role(30) -ROLE_LINK = Role(88) -ROLE_LIST = Role(31) -ROLE_LIST_ITEM = Role(32) -ROLE_MENU = Role(33) -ROLE_MENU_BAR = Role(34) -ROLE_MENU_ITEM = Role(35) -ROLE_OPTION_PANE = Role(36) -ROLE_PAGE = Role(84) -ROLE_PAGE_TAB = Role(37) -ROLE_PAGE_TAB_LIST = Role(38) -ROLE_PANEL = Role(39) -ROLE_PARAGRAPH = Role(73) -ROLE_PASSWORD_TEXT = Role(40) -ROLE_POPUP_MENU = Role(41) -ROLE_PROGRESS_BAR = Role(42) -ROLE_PUSH_BUTTON = Role(43) -ROLE_RADIO_BUTTON = Role(44) -ROLE_RADIO_MENU_ITEM = Role(45) -ROLE_REDUNDANT_OBJECT = Role(86) -ROLE_ROOT_PANE = Role(46) -ROLE_ROW_HEADER = Role(47) -ROLE_RULER = Role(74) -ROLE_SCROLL_BAR = Role(48) -ROLE_SCROLL_PANE = Role(49) -ROLE_SECTION = Role(85) -ROLE_SEPARATOR = Role(50) -ROLE_SLIDER = Role(51) -ROLE_SPIN_BUTTON = Role(52) -ROLE_SPLIT_PANE = Role(53) -ROLE_STATUS_BAR = Role(54) -ROLE_TABLE = Role(55) -ROLE_TABLE_CELL = Role(56) -ROLE_TABLE_COLUMN_HEADER = Role(57) -ROLE_TABLE_ROW_HEADER = Role(58) -ROLE_TEAROFF_MENU_ITEM = Role(59) -ROLE_TERMINAL = Role(60) -ROLE_TEXT = Role(61) -ROLE_TOGGLE_BUTTON = Role(62) -ROLE_TOOL_BAR = Role(63) -ROLE_TOOL_TIP = Role(64) -ROLE_TREE = Role(65) -ROLE_TREE_TABLE = Role(66) -ROLE_UNKNOWN = Role(67) -ROLE_VIEWPORT = Role(68) -ROLE_WINDOW = Role(69) - -ROLE_NAMES = { - ROLE_INVALID:'invalid', - ROLE_ACCELERATOR_LABEL:'accelerator label', - ROLE_ALERT:'alert', - ROLE_ANIMATION:'animation', - ROLE_ARROW:'arrow', - ROLE_CALENDAR:'calendar', - ROLE_CANVAS:'canvas', - ROLE_CHECK_BOX:'check box', - ROLE_CHECK_MENU_ITEM:'check menu item', - ROLE_COLOR_CHOOSER:'color chooser', - ROLE_COLUMN_HEADER:'column header', - ROLE_COMBO_BOX:'combo box', - ROLE_DATE_EDITOR:'dateeditor', - ROLE_DESKTOP_ICON:'desktop icon', - ROLE_DESKTOP_FRAME:'desktop frame', - ROLE_DIAL:'dial', - ROLE_DIALOG:'dialog', - ROLE_DIRECTORY_PANE:'directory pane', - ROLE_DRAWING_AREA:'drawing area', - ROLE_FILE_CHOOSER:'file chooser', - ROLE_FILLER:'filler', - ROLE_FONT_CHOOSER:'font chooser', - ROLE_FRAME:'frame', - ROLE_GLASS_PANE:'glass pane', - ROLE_HTML_CONTAINER:'html container', - ROLE_ICON:'icon', - ROLE_IMAGE:'image', - ROLE_INTERNAL_FRAME:'internal frame', - ROLE_LABEL:'label', - ROLE_LAYERED_PANE:'layered pane', - ROLE_LIST:'list', - ROLE_LIST_ITEM:'list item', - ROLE_MENU:'menu', - ROLE_MENU_BAR:'menu bar', - ROLE_MENU_ITEM:'menu item', - ROLE_OPTION_PANE:'option pane', - ROLE_PAGE_TAB:'page tab', - ROLE_PAGE_TAB_LIST:'page tab list', - ROLE_PANEL:'panel', - ROLE_PASSWORD_TEXT:'password text', - ROLE_POPUP_MENU:'popup menu', - ROLE_PROGRESS_BAR:'progress bar', - ROLE_PUSH_BUTTON:'push button', - ROLE_RADIO_BUTTON:'radio button', - ROLE_RADIO_MENU_ITEM:'radio menu item', - ROLE_ROOT_PANE:'root pane', - ROLE_ROW_HEADER:'row header', - ROLE_SCROLL_BAR:'scroll bar', - ROLE_SCROLL_PANE:'scroll pane', - ROLE_SEPARATOR:'separator', - ROLE_SLIDER:'slider', - ROLE_SPLIT_PANE:'split pane', - ROLE_SPIN_BUTTON:'spin button', - ROLE_STATUS_BAR:'status bar', - ROLE_TABLE:'table', - ROLE_TABLE_CELL:'table cell', - ROLE_TABLE_COLUMN_HEADER:'table column header', - ROLE_TABLE_ROW_HEADER:'table row header', - ROLE_TEAROFF_MENU_ITEM:'tear off menu item', - ROLE_TERMINAL:'terminal', - ROLE_TEXT:'text', - ROLE_TOGGLE_BUTTON:'toggle button', - ROLE_TOOL_BAR:'tool bar', - ROLE_TOOL_TIP:'tool tip', - ROLE_TREE:'tree', - ROLE_TREE_TABLE:'tree table', - ROLE_UNKNOWN:'unknown', - ROLE_VIEWPORT:'viewport', - ROLE_WINDOW:'window', - ROLE_HEADER:'header', - ROLE_FOOTER:'footer', - ROLE_PARAGRAPH:'paragraph', - ROLE_RULER:'ruler', - ROLE_APPLICATION:'application', - ROLE_AUTOCOMPLETE:'autocomplete', - ROLE_EDITBAR:'edit bar', - ROLE_EMBEDDED:'embedded component', - ROLE_ENTRY:'entry', - ROLE_CHART:'chart', - ROLE_CAPTION:'caption', - ROLE_DOCUMENT_FRAME:'document frame', - ROLE_HEADING:'heading', - ROLE_PAGE:'page', - ROLE_SECTION:'section', - ROLE_REDUNDANT_OBJECT:'redundant object', - ROLE_FORM:'form', - ROLE_LINK:'link', - ROLE_INPUT_METHOD_WINDOW:'input method window', -} - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/selection.py b/pyatspi/selection.py deleted file mode 100644 index 4751ba5..0000000 --- a/pyatspi/selection.py +++ /dev/null @@ -1,136 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from accessible import Accessible -from factory import accessible_factory - -import dbus - -__all__ = [ - "Selection", - ] - -#------------------------------------------------------------------------------ - -class Selection(Accessible): - """ - An interface which indicates that an object exposes a 'selection' - model, allowing the selection of one or more of its children. - Read-only Selection instances are possible, in which case the - interface is used to programmatically determine the selected-ness - of its children. A selected child has State::STATE_SELECTED, - and a child which may hypothetically be selected (though possibly - not programmatically selectable) has State::STATE_SELECTABLE. - """ - - def clearSelection(self): - """ - Attempt to clear all selections (i.e. deselect all children) - of a Selection. Not all Selection implementations allow the removal - of all selections. - @return True if the selections were successfully cleared, False - otherwise. - """ - func = self.get_dbus_method("clearSelection", dbus_interface=ATSPI_SELECTION) - return func() - - def deselectChild(self, childIndex): - """ - Remove a child from the selected children list of a Selection, - if the child is currently selected. - @param : childIndex - a long integer (the zero offset index into the Accessible object's - list of children) indicating which child of the Selection is - to be selected. - @return True if the child was successfully selected, False otherwise. - """ - func = self.get_dbus_method("deselectChild", dbus_interface=ATSPI_SELECTION) - return func(childIndex) - - def deselectSelectedChild(self, index): - """ - Remove a child to the selected children list of a Selection. - @param : selectedChildIndex - a long integer indicating which of the selected children of the - Selection is to be deselected. The index is a zero-offset index - into the 'selected child list', not a zero-offset index into - the list of all children of the Selection. - @return True if the child was successfully deselected, False - otherwise. - """ - func = self.get_dbus_method("deselectSelectedChild", dbus_interface=ATSPI_SELECTION) - return func(index) - - def getSelectedChild(self, index): - """ - Get the i-th selected Accessible child of a Selection. - @param : selectedChildIndex - a long integer indicating which of the selected children of an - object is being requested. - @return a pointer to a selected Accessible child object, specified - by selectedChildIndex. - """ - func = self.get_dbus_method("getSelectedChild", dbus_interface=ATSPI_SELECTION) - return self._cache.create_accessible(self._app_name, func(index), - interfaces.ATSPI_ACCESSIBLE) - - def isChildSelected(self, index): - """ - Determine whether a particular child of an Selection implementor - is currently selected. Note that childIndex is the zero-offset - index into the standard Accessible container's list of children. - @param : childIndex - an index into the Selection's list of children. - @return True if the specified child is currently selected, False - otherwise. - """ - func = self.get_dbus_method("isChildSelected", dbus_interface=ATSPI_SELECTION) - return func(index) - - def selectAll(self): - """ - Attempt to select all of the children of a Selection implementor. - Not all Selection implementors support this operation (for instance, - implementations which support only "single selection" do not - support this operation). - @return True if successful, False otherwise. - """ - func = self.get_dbus_method("selectAll", dbus_interface=ATSPI_SELECTION) - return func() - - def selectChild(self, index): - """ - Add a child to the selected children list of a Selection. - @param : childIndex - a long integer indicating which child of the Selection is to - be selected. - @return True if the child was successfully selected, False otherwise. - """ - func = self.get_dbus_method("selectChild", dbus_interface=ATSPI_SELECTION) - return func(index) - - def get_nSelectedChildren(self): - return dbus.Int32(self._pgetter(self._dbus_interface, "nSelectedChildren")) - _nSelectedChildrenDoc = \ - """ - The number of children of a Selection implementor which are currently - selected. - """ - nSelectedChildren = property(fget=get_nSelectedChildren, doc=_nSelectedChildrenDoc) - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_SELECTION, Selection) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/state.py b/pyatspi/state.py deleted file mode 100644 index fdfb284..0000000 --- a/pyatspi/state.py +++ /dev/null @@ -1,256 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd -#copyright: Copyright (c) 2005, 2007 IBM Corporation - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -#Portions of this code originally licensed and copyright (c) 2005, 2007 -#IBM Corporation under the BSD license, available at -#U{http://www.opensource.org/licenses/bsd-license.php} - -#authors: Peter Parente, Mark Doffman - -from base import Enum as _Enum - -#------------------------------------------------------------------------------ - -class StateType(_Enum): - _enum_lookup = { - 0:'STATE_INVALID', - 1:'STATE_ACTIVE', - 2:'STATE_ARMED', - 3:'STATE_BUSY', - 4:'STATE_CHECKED', - 5:'STATE_COLLAPSED', - 6:'STATE_DEFUNCT', - 7:'STATE_EDITABLE', - 8:'STATE_ENABLED', - 9:'STATE_EXPANDABLE', - 10:'STATE_EXPANDED', - 11:'STATE_FOCUSABLE', - 12:'STATE_FOCUSED', - 13:'STATE_HAS_TOOLTIP', - 14:'STATE_HORIZONTAL', - 15:'STATE_ICONIFIED', - 16:'STATE_MODAL', - 17:'STATE_MULTI_LINE', - 18:'STATE_MULTISELECTABLE', - 19:'STATE_OPAQUE', - 20:'STATE_PRESSED', - 21:'STATE_RESIZABLE', - 22:'STATE_SELECTABLE', - 23:'STATE_SELECTED', - 24:'STATE_SENSITIVE', - 25:'STATE_SHOWING', - 26:'STATE_SINGLE_LINE', - 27:'STATE_STALE', - 28:'STATE_TRANSIENT', - 29:'STATE_VERTICAL', - 30:'STATE_VISIBLE', - 31:'STATE_MANAGES_DESCENDANTS', - 32:'STATE_INDETERMINATE', - 33:'STATE_REQUIRED', - 34:'STATE_TRUNCATED', - 35:'STATE_ANIMATED', - 36:'STATE_INVALID_ENTRY', - 37:'STATE_SUPPORTS_AUTOCOMPLETION', - 38:'STATE_SELECTABLE_TEXT', - 39:'STATE_IS_DEFAULT', - 40:'STATE_VISITED', - 41:'STATE_LAST_DEFINED', - } - -#------------------------------------------------------------------------------ - -STATE_ACTIVE = StateType(1) -STATE_ANIMATED = StateType(35) -STATE_ARMED = StateType(2) -STATE_BUSY = StateType(3) -STATE_CHECKED = StateType(4) -STATE_COLLAPSED = StateType(5) -STATE_DEFUNCT = StateType(6) -STATE_EDITABLE = StateType(7) -STATE_ENABLED = StateType(8) -STATE_EXPANDABLE = StateType(9) -STATE_EXPANDED = StateType(10) -STATE_FOCUSABLE = StateType(11) -STATE_FOCUSED = StateType(12) -STATE_HAS_TOOLTIP = StateType(13) -STATE_HORIZONTAL = StateType(14) -STATE_ICONIFIED = StateType(15) -STATE_INDETERMINATE = StateType(32) -STATE_INVALID = StateType(0) -STATE_INVALID_ENTRY = StateType(36) -STATE_IS_DEFAULT = StateType(39) -STATE_LAST_DEFINED = StateType(41) -STATE_MANAGES_DESCENDANTS = StateType(31) -STATE_MODAL = StateType(16) -STATE_MULTISELECTABLE = StateType(18) -STATE_MULTI_LINE = StateType(17) -STATE_OPAQUE = StateType(19) -STATE_PRESSED = StateType(20) -STATE_REQUIRED = StateType(33) -STATE_RESIZABLE = StateType(21) -STATE_SELECTABLE = StateType(22) -STATE_SELECTABLE_TEXT = StateType(38) -STATE_SELECTED = StateType(23) -STATE_SENSITIVE = StateType(24) -STATE_SHOWING = StateType(25) -STATE_SINGLE_LINE = StateType(26) -STATE_STALE = StateType(27) -STATE_SUPPORTS_AUTOCOMPLETION = StateType(37) -STATE_TRANSIENT = StateType(28) -STATE_TRUNCATED = StateType(34) -STATE_VERTICAL = StateType(29) -STATE_VISIBLE = StateType(30) -STATE_VISITED = StateType(40) - -#------------------------------------------------------------------------------ - -# Build a dictionary mapping state values to names based on the prefix of the enum constants. - -STATE_VALUE_TO_NAME = dict(((value, name[6:].lower().replace('_', ' ')) - for name, value - in globals().items() - if name.startswith('STATE_'))) - -#------------------------------------------------------------------------------ - -def _marshal_state_set(bitfield): - """ - The D-Bus protocol has a stateset object passed - as a 64bit bitfield. The Bits are passed as two 32bit - integers. - - This function marshals the D-Bus message into a - StateSet object that corresponds to these states. - """ - (lower, upper) = bitfield - - states = [] - - pos = 0 - while (lower): - if (1L)&lower: - states.append(StateType(pos)) - pos+=1 - lower >>= 1 - - pos = 32 - while (upper): - if (1L)&upper: - states.append(StateType(pos)) - pos+=1 - upper >>= 1 - - return StateSet(*states) - -#------------------------------------------------------------------------------ - -class StateSet(object): - """ - The StateSet object implements a wrapper around a - bitmap of Accessible states. - - The StateSet object is the instantaneous state of - the Accessible object and is not updated with its - container Accessible. This behaviour is different - to the CORBA version of AT-SPI - """ - def __init__(self, *states): - """ - Initializes the state set with the given states. - - @param states: States to add immediately - @type states: list - """ - self.states = set() - map(self.add, states) - - def contains(self, state): - """ - Checks if this StateSet contains the given state. - - @param state: State to check - @type state: Accessibility.StateType - @return: True if the set contains the given state - @rtype: boolean - """ - return state in self.states - - def add(self, *states): - """ - Adds states to this set. - - @param states: State(s) to add - @type states: Accessibility.StateType - """ - for state in states: - self.states.add(state) - - def remove(self, state): - """ - Removes states from this set. - - @param states: State(s) to remove - @type states: Accessibility.StateType - """ - self.states.remove(state) - - def equals(self, state_set): - """ - Checks if this StateSet contains exactly the same members as the given - StateSet. - - @param state_set: Another set - @type state_set: Accessibility.StateSet - @return: Are the sets equivalent in terms of their contents? - @rtype: boolean - """ - return set(state_set.getStates()) == self.states - - def compare(self, state_set): - """ - Finds the symmetric difference between this state set andthe one provided, - and returns it as a new StateSet. - - @note: This does not use L{_StateSetImpl.compare} which cannot be - implemented at this time - @param state_set: Set to compare against - @type state_set: Accessibility.StateSet - @return: Proxy for the new set - @rtype: L{StateSet} - """ - a = set(self.getStates()) - b = set(state_set.getStates()) - diff = a.symmetric_difference(b) - return StateSet(*diff) - - def isEmpty(self): - """ - Checks if this StateSet is empty. - - @return: Is it empty? - @rtype: boolean - """ - return len(self.states) == 0 - - def getStates(self): - """ - Gets the sequence of all states in this set. - - @return: List of states - @rtype: list - """ - return list(self.states) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/table.py b/pyatspi/table.py deleted file mode 100644 index dd8879f..0000000 --- a/pyatspi/table.py +++ /dev/null @@ -1,376 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from accessible import Accessible -from factory import accessible_factory - -import dbus - -__all__ = [ - "Table", - ] - -#------------------------------------------------------------------------------ - -class Table(Accessible): - """ - An interface used by containers whose contained data is arranged - in a "tabular" (i.e. row-column) fashion. Tables may resemble - a two-dimensional grid, as in a spreadsheet, or may feature objects - which span multiple rows and/or columns, but whose bounds are - aligned on a row/column matrix. Thus, the Table interface may - be used to represent "spreadsheets" as well as "frames". - Objects within tables are children of the Table instance, and - they may be referenced either via a child index or via a row/column - pair. Their role may be ROLE_TABLE_CELL, but table 'cells' may - have other roles as well. These 'cells' may implement other interfaces, - such as Text, Action, Image, and Component, and should do so - as appropriate to their onscreen representation and/or behavior. - """ - - def addColumnSelection(self, column): - """ - Select the specified column, adding it to the current column - selection, if the table's selection model permits it. - @param : column - @return True if the specified column was successfully selected, - False if not. - """ - func = self.get_dbus_method("addColumnSelection", dbus_interface=ATSPI_TABLE) - return func(column) - - def addRowSelection(self, row): - """ - Select the specified row, adding it to the current row selection, - if the table's selection model permits it. - @param : row - @return True if the specified row was successfully selected, - False if not. - """ - func = self.get_dbus_method("addRowSelection", dbus_interface=ATSPI_TABLE) - return func(row) - - def getAccessibleAt(self, row, column): - """ - Get the table cell at the specified row and column indices. - @param : row - the specified table row, zero-indexed. - @param : column - the specified table column, zero-indexed. - @return an Accessible object representing the specified table - cell. - """ - func = self.get_dbus_method("getAccessibleAt", dbus_interface=ATSPI_TABLE) - return self._cache.create_accessible(self._app_name, func(row, column), - interfaces.ATSPI_ACCESSIBLE) - - def getColumnAtIndex(self, index): - """ - Get the table column index occupied by the child at a particular - 1-D child index. - @param : index - the specified child index, zero-indexed. - @return a long integer indicating the first column spanned by - the child of a table, at the specified 1-D (zero-offset) index. - """ - func = self.get_dbus_method("getColumnAtIndex", dbus_interface=ATSPI_TABLE) - return func(index) - - def getColumnDescription(self, column): - """ - Get a text description of a particular table column. This differs - from AccessibleTable_getColumnHeader, which returns an Accessible. - @param : column - the specified table column, zero-indexed. - @return a UTF-8 string describing the specified table column, - if available. - """ - func = self.get_dbus_method("getColumnDescription", dbus_interface=ATSPI_TABLE) - return func(column) - - def getColumnExtentAt(self, row, column): - """ - Get the number of columns spanned by the table cell at the specific - row and column. (some tables can have cells which span multiple - rows and/or columns). - @param : row - the specified table row, zero-indexed. - @param : column - the specified table column, zero-indexed. - @return a long integer indicating the number of columns spanned - by the specified cell. - """ - func = self.get_dbus_method("getColumnExtentAt", dbus_interface=ATSPI_TABLE) - return func(row, column) - - def getColumnHeader(self, index): - """ - Get the header associated with a table column, if available, - as an instance of Accessible. This differs from getColumnDescription, - which returns a string. - @param : column - the specified table column, zero-indexed. - @return an Accessible representatin of the specified table column, - if available. - """ - func = self.get_dbus_method("getColumnHeader", dbus_interface=ATSPI_TABLE) - return self._cache.create_accessible(self._app_name, func(index), - interfaces.ATSPI_ACCESSIBLE) - - def getIndexAt(self, row, column): - """ - Get the 1-D child index corresponding to the specified 2-D row - and column indices. - @param : row - the specified table row, zero-indexed. - @param : column - the specified table column, zero-indexed. - @return a long integer which serves as the index of a specified - cell in the table, in a form usable by Accessible::getChildAtIndex. - """ - func = self.get_dbus_method("getIndexAt", dbus_interface=ATSPI_TABLE) - return func(row, column) - - def getRowAtIndex(self, index): - """ - Get the table row index occupied by the child at a particular - 1-D child index. - @param : index - the specified child index, zero-indexed. - @return a long integer indicating the first row spanned by the - child of a table, at the specified 1-D (zero-offset) index. - """ - func = self.get_dbus_method("getRowAtIndex", dbus_interface=ATSPI_TABLE) - return func(index) - - def getRowColumnExtentsAtIndex(self, index): - """ - Given a child index, determine the row and column indices and - extents, and whether the cell is currently selected. If the child - at index is not a cell (for instance, if it is a summary, caption, - etc.), False is returned. - @param : index - the index of the Table child whose row/column extents are requested. - @param : row - back-filled with the first table row associated with the cell - with child index index. - @param : col - back-filled with the first table column associated with the cell - with child index index. - @param : row_extents - back-filled with the number of table rows across which child - i extends. - @param : col_extents - back-filled with the number of table columns across which child - i extends. - @param : is_selected - a boolean which is back-filled with True if the child at index - i corresponds to a selected table cell, False otherwise. - Example: If the Table child at index '6' extends across columns - 5 and 6 of row 2 of a Table instance, and is currently selected, - then retval=table::getRowColumnExtentsAtIndex(6,row,col, - row_extents, - col_extents, - is_selected); - will return True, and after the call row, col, row_extents, - col_extents, and is_selected will contain 2, 5, 1, 2, and True, - respectively. - @return True if the index is associated with a valid table cell, - False if the index does not correspond to a cell. If False is - returned, the values of the out parameters are undefined. - """ - func = self.get_dbus_method("getRowColumnExtentsAtIndex", dbus_interface=ATSPI_TABLE) - return func(index) - - def getRowDescription(self, index): - """ - Get a text description of a particular table row. This differs - from AccessibleTable_getRowHeader, which returns an Accessible. - @param : row - the specified table row, zero-indexed. - @return a UTF-8 string describing the specified table row, if - available. - """ - func = self.get_dbus_method("getRowDescription", dbus_interface=ATSPI_TABLE) - return func(index) - - def getRowExtentAt(self, row, column): - """ - Get the number of rows spanned by the table cell at the specific - row and column. (some tables can have cells which span multiple - rows and/or columns). - @param : row - the specified table row, zero-indexed. - @param : column - the specified table column, zero-indexed. - @return a long integer indicating the number of rows spanned - by the specified cell. - """ - func = self.get_dbus_method("getRowExtentAt", dbus_interface=ATSPI_TABLE) - return func(row, column) - - def getRowHeader(self, row): - """ - Get the header associated with a table row, if available. This - differs from getRowDescription, which returns a string. - @param : row - the specified table row, zero-indexed. - @return an Accessible representatin of the specified table row, - if available. - """ - func = self.get_dbus_method("getRowHeader", dbus_interface=ATSPI_TABLE) - return self._cache.create_accessible(self._app_name, func(row), - interfaces.ATSPI_ACCESSIBLE) - - def getSelectedColumns(self): - """ - Obtain the indices of all columns which are currently selected. - @return a sequence of integers comprising the indices of columns - currently selected. - """ - func = self.get_dbus_method("getSelectedColumns", dbus_interface=ATSPI_TABLE) - return func() - - def getSelectedRows(self): - """ - Obtain the indices of all rows which are currently selected. - @return a sequence of integers comprising the indices of rows - currently selected. - """ - func = self.get_dbus_method("getSelectedRows", dbus_interface=ATSPI_TABLE) - return func() - - def isColumnSelected(self, column): - """ - Determine whether a table column is selected. - @param : column - the column being queried. - @return True if the specified column is currently selected, False - if not. - """ - func = self.get_dbus_method("isColumnSelected", dbus_interface=ATSPI_TABLE) - return func(column) - - def isRowSelected(self, row): - """ - Determine whether a table row is selected. - @param : row - the row being queried. - @return True if the specified row is currently selected, False - if not. - """ - func = self.get_dbus_method("isRowSelected", dbus_interface=ATSPI_TABLE) - return func(row) - - def isSelected(self, row, column): - """ - Determine whether the cell at a specific row and column is selected. - @param : row - a row occupied by the cell whose state is being queried. - @param : column - a column occupied by the cell whose state is being queried. - @return True if the specified cell is currently selected, False - if not. - """ - func = self.get_dbus_method("isSelected", dbus_interface=ATSPI_TABLE) - return func(row, column) - - def removeColumnSelection(self, column): - """ - Remove the specified column from current column selection, if - the table's selection model permits it. - @param : column - @return True if the specified column was successfully de-selected, - False if not. - """ - func = self.get_dbus_method("removeColumnSelection", dbus_interface=ATSPI_TABLE) - return func(column) - - def removeRowSelection(self, row): - """ - Remove the specified row from current row selection, if the table's - selection model permits it. - @param : row - @return True if the specified row was successfully de-selected, - False if not. - """ - func = self.get_dbus_method("removeRowSelection", dbus_interface=ATSPI_TABLE) - return func(row) - - def get_caption(self): - accessible = self._pgetter(self._dbus_interface, "caption") - return self._cache.create_accessible(self._app_name, accessible, - interfaces.ATSPI_ACCESSIBLE) - _captionDoc = \ - """ - An Accessible which represents of a caption for a Table. - """ - caption = property(fget=get_caption, doc=_captionDoc) - - def get_nColumns(self): - return dbus.Int32(self._pgetter(self._dbus_interface, "nColumns")) - _nColumnsDoc = \ - """ - The total number of columns in this table (including empty columns), - exclusive of columns which are programmatically hidden. Columns - which are scrolled out of view or clipped by the current viewport - are included. - """ - nColumns = property(fget=get_nColumns, doc=_nColumnsDoc) - - def get_nRows(self): - return dbus.Int32(self._pgetter(self._dbus_interface, "nRows")) - _nRowsDoc = \ - """ - The total number of rows in this table (including empty rows), - exclusive of any rows which are programmatically hidden. Rows - which are merely scrolled out of view are included. - """ - nRows = property(fget=get_nRows, doc=_nRowsDoc) - - def get_nSelectedColumns(self): - return dbus.Int32(self._pgetter(self._dbus_interface, "nSelectedColumns")) - _nSelectedColumnsDoc = \ - """ - The number of columns currently selected. A selected column is - one in which all included cells are selected. - """ - nSelectedColumns = property(fget=get_nSelectedColumns, doc=_nSelectedColumnsDoc) - - def get_nSelectedRows(self): - return dbus.Int32(self._pgetter(self._dbus_interface, "nSelectedRows")) - _nSelectedRowsDoc = \ - """ - The number of rows currently selected. A selected row is one - in which all included cells are selected. - """ - nSelectedRows = property(fget=get_nSelectedRows, doc=_nSelectedRowsDoc) - - def get_summary(self): - accessible = self._pgetter(self._dbus_interface, "summary") - return self._cache.create_accessible(self._app_name, accessible, - interfaces.ATSPI_ACCESSIBLE) - _summaryDoc = \ - """ - An accessible object which summarizes the contents of a Table. - This object is frequently itself a Table instance, albeit a simplified - one. - """ - summary = property(fget=get_summary, doc=_summaryDoc) - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_TABLE, Table) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/text.py b/pyatspi/text.py deleted file mode 100644 index 7b55ef7..0000000 --- a/pyatspi/text.py +++ /dev/null @@ -1,592 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -import dbus - -from interfaces import * -from accessible import Accessible -from base import Enum -from factory import accessible_factory - -from dbus.types import UInt32 - -__all__ = [ - "Text", - "TEXT_BOUNDARY_TYPE", - "TEXT_BOUNDARY_CHAR", - "TEXT_BOUNDARY_WORD_START", - "TEXT_BOUNDARY_WORD_END", - "TEXT_BOUNDARY_SENTENCE_START", - "TEXT_BOUNDARY_SENTENCE_END", - "TEXT_BOUNDARY_LINE_START", - "TEXT_BOUNDARY_LINE_END", - "TEXT_CLIP_TYPE", - "TEXT_CLIP_NONE", - "TEXT_CLIP_MIN", - "TEXT_CLIP_MAX", - "TEXT_CLIP_BOTH", - ] - -#------------------------------------------------------------------------------ - -class TEXT_BOUNDARY_TYPE(Enum): - _enum_lookup = { - 0:'TEXT_BOUNDARY_CHAR', - 1:'TEXT_BOUNDARY_WORD_START', - 2:'TEXT_BOUNDARY_WORD_END', - 3:'TEXT_BOUNDARY_SENTENCE_START', - 4:'TEXT_BOUNDARY_SENTENCE_END', - 5:'TEXT_BOUNDARY_LINE_START', - 6:'TEXT_BOUNDARY_LINE_END', - } - -TEXT_BOUNDARY_CHAR = TEXT_BOUNDARY_TYPE(0) -TEXT_BOUNDARY_LINE_END = TEXT_BOUNDARY_TYPE(6) -TEXT_BOUNDARY_LINE_START = TEXT_BOUNDARY_TYPE(5) -TEXT_BOUNDARY_SENTENCE_END = TEXT_BOUNDARY_TYPE(4) -TEXT_BOUNDARY_SENTENCE_START = TEXT_BOUNDARY_TYPE(3) -TEXT_BOUNDARY_WORD_END = TEXT_BOUNDARY_TYPE(2) -TEXT_BOUNDARY_WORD_START = TEXT_BOUNDARY_TYPE(1) - -#------------------------------------------------------------------------------ - -class TEXT_CLIP_TYPE(Enum): - _enum_lookup = { - 0:'TEXT_CLIP_NONE', - 1:'TEXT_CLIP_MIN', - 2:'TEXT_CLIP_MAX', - 3:'TEXT_CLIP_BOTH', - } - -TEXT_CLIP_BOTH = TEXT_CLIP_TYPE(3) -TEXT_CLIP_MAX = TEXT_CLIP_TYPE(2) -TEXT_CLIP_MIN = TEXT_CLIP_TYPE(1) -TEXT_CLIP_NONE = TEXT_CLIP_TYPE(0) - -#------------------------------------------------------------------------------ - -class Text(Accessible): - """ - The text interface should be implemented by objects which place - textual information onscreen as character strings or glyphs. - The text interface allows access to textual content, including - display attributes and semantic hints associated with runs of - text, and access to bounding box information for glyphs and substrings. - It also allows portions of textual content to be selected, if - the object's StateSet includes STATE_SELECTABLE_TEXT. - In some cases a Text object may have, as its content, an empty - string. In particular this can occur in the case of Hypertext - objects which do not display explicitly textual information onscreen, - as Hypertext is derived from the Text interface. - Typographic and semantic attributes of onscreen textual content, - for instance typeface, weight, language, and such qualities as - 'emphasis' or 'blockquote', are represented as text attributes. - Contiguous sequences of characters over which these attributes - are unchanged are referred to as "attribute runs", and are available - via Text::getAttributeRun. Where possible, implementing clients - will report textual attributes which are the same over the entire - text object, for instance those inherited from a default or document-scope - style, via getDefaultAttributes instead of reporting them explicitly - for each character. Therefore, for any span of text, the attributes - in effect are the union of the set returned by Text::getDefaultAttributes, - and the set returned at a particular character offset via Text::getAttributeRun. - """ - - def addSelection(self, index): - """ - The result of calling addSelection on objects which already have - one selection present, and which do not include STATE_MULTISELECTABLE, - is undefined, other than the return value. - @return True of the selection was successfully added, False otherwise. - Selection may fail if the object does not support selection of - text (see STATE_SELECTABLE_TEXT), if the object does not support - multiple selections and a selection is already defined, or for - other reasons (for instance if the user does not have permission - to copy the text into the relevant selection buffer). - """ - func = self.get_dbus_method("addSelection", dbus_interface=ATSPI_TEXT) - return func(index) - - def getAttributeRun(self, offset): - """ - Query a particular text object for the text attributes defined - at a given offset, obtaining the start and end of the "attribute - run" over which these attributes are currently invariant. Text - attributes are those presentational, typographic, or semantic - attributes or qualitites which apply to a range of text specifyable - by starting and ending offsets. Attributes relevant to localization - should be provided in accordance with the w3c "Internationalization - and Localization Markup Requirements", http://www.w3.org/TR/2005/WD-itsreq-20051122/ - Other text attributes should choose their names and value semantics - in accordance with relevant standards such as CSS level 2 (http://www.w3.org/TR/1998/REC-CSS2-19980512), - XHTML 1.0 (http://www.w3.org/TR/2002/REC-xhtml1-20020801), and - WICD (http://www.w3.org/TR/2005/WD-WICD-20051121/). Those attributes - from the aforementioned specifications and recommendations which - do not concern typographic, presentational, or semantic aspects - of text should be exposed via the more general Accessible::getAttributes() - API (if at all). - For example, CSS attributes which should be exposed on text (either - as default attributes, or as explicitly-set attributes when non-default - values are specified in the content view) include the Font attributes - (i.e. "css2:font-weight", "css2:font-style"), the "css2:color" - and "css2:background-color" attributes, and "css2:text-decoration" - attribute. - If includeDefaults is TRUE, then this AttributeSet should include - the default attributes as well as those which are explicitly - assigned to the attribute run in question. startOffset and endOffset - will be back-filled to indicate the start and end of the attribute - run which contains 'offset' - an attribute run is a contiguous - section of text whose attributes are homogeneous. - @param : offset - the offset of the character whose attributes will be reported. - @param : startOffset - backfilled with the starting offset of the character range over - which all text attributes match those of offset, i.e. the start - of the homogeneous attribute run including offset. - @param : endOffset - backfilled with the offset of the first character past the character - range over which all text attributes match those of offset, i.e. - the character immediately after the homogeneous attribute run - including offset. - @param : includeDefaults - if False, the call should only return those attributes which - are explicitly set on the current attribute run, omitting any - attributes which are inherited from the default values. See also - Text::getDefaultAttributes. - @return the AttributeSet defined at offset, optionally including - the 'default' attributes. - """ - func = self.get_dbus_method("getAttributeRun", dbus_interface=ATSPI_TEXT) - [attrs, startOffset, endOffset] = func(offset, includeDefaults) - dict = [key + ':' + value for key, value in attrs.values()] - return [dict, startOffset, endOffset] - - def getAttributeValue(self, offset, attributeName): - """ - Get the string value of a named attribute at a given offset, - if defined. - @param : offset - the offset of the character for which the attribute run is to - be obtained. - @param : attributeName - the name of the attribute for which the value is to be returned, - if defined. - @param : startOffset - back-filled with the offset of the first character in the attribute - run containing the character at offset. - @param : endOffset - back-filled with the offset of the first character past the end - of the attribute run containing the character at offset. - @param : defined - back-filled with True if the attributeName has a defined value - at offset, False otherwise. - @return the value of attribute (name-value pair) corresponding - to "name", if defined. - """ - func = self.get_dbus_method("getAttributeValue", dbus_interface=ATSPI_TEXT) - return func(offset, attributeName) - - def getAttributes(self, offset): - """ - getAttributes is deprecated in favor of getAttributeRun. - @return the attributes at offset, as a semicolon-delimited set - of colon-delimited name-value pairs. - """ - func = self.get_dbus_method("getAttributes", dbus_interface=ATSPI_TEXT) - [attrs, startOffset, endOffset] = func(dbus.Int32(offset)) - dict = [key + ':' + value for key, value in attrs] - return [dict, startOffset, endOffset] - - def getBoundedRanges(self, x, y, width, height, coordType, xClipType, yClipType): - #TODO Return a list of range structures - """ - Return the text content within a bounding box, as a list of Range - structures. Depending on the TEXT_CLIP_TYPE parameters, glyphs - which are clipped by the bounding box (i.e. which lie partially - inside and partially outside it) may or may not be included in - the ranges returned. - @param : x - the minimum x ( i.e. leftmost) coordinate of the bounding box. - @param : y - the minimum y coordinate of the bounding box. - @param : width - the horizontal size of the bounding box. The rightmost bound - of the bounding box is (x + width); - @param : height - the vertical size of the bounding box. The maximum y value of - the bounding box is (y + height); - @param : coordType - If 0, the above coordinates are interpreted as pixels relative - to corner of the screen; if 1, the coordinates are interpreted - as pixels relative to the corner of the containing toplevel window. - @param : xClipType - determines whether text which intersects the bounding box in - the x direction is included. - @param : yClipType - determines whether text which intersects the bounding box in - the y direction is included. - """ - func = self.get_dbus_method("getBoundedRanges", dbus_interface=ATSPI_TEXT) - return func(x, y, width, height, UInt32(coordType), xClipType, yClipType) - - def getCharacterAtOffset(self, offset): - """ - @param : offset - position - @return an unsigned long integer whose value corresponds to the - UCS-4 representation of the character at the specified text offset, - or 0 if offset is out of range. - """ - func = self.get_dbus_method("getCharacterAtOffset", dbus_interface=ATSPI_TEXT) - return func(offset) - - def getCharacterExtents(self, offset, x, y, width, height, coordType): - """ - Obtain a the bounding box, as x, y, width, and height, of the - character or glyph at a particular character offset in this object's - text content. The coordinate system in which the results are - reported is specified by coordType. If an onscreen glyph corresponds - to multiple character offsets, for instance if the glyph is a - ligature, the bounding box reported will include the entire glyph - and therefore may apply to more than one character offset. - @param : offset - the character offset of the character or glyph being queried. - @param : x - the minimum horizontal coordinate of the bounding box of the - glyph representing the character at offset. - @param : y - the minimum vertical coordinate of the bounding box of the glyph - representing the character at offset. - @param : width - the horizontal extent of the bounding box of the glyph representing - the character at offset. - @param : height - the vertical extent of the bounding box of the glyph representing - the character at offset. - @param : coordType - If 0, the results will be reported in screen coordinates, i.e. - in pixels relative to the upper-left corner of the screen, with - the x axis pointing right and the y axis pointing down. If 1, - the results will be reported relative to the containing toplevel - window, with the x axis pointing right and the y axis pointing - down. - """ - func = self.get_dbus_method("getCharacterExtents", dbus_interface=ATSPI_TEXT) - return func(offset, x, y, width, height, UInt32(coordType)) - - def getDefaultAttributeSet(self): - """ - Return an AttributeSet containing the text attributes which apply - to all text in the object by virtue of the default settings of - the document, view, or user agent; e.g. those attributes which - are implied rather than explicitly applied to the text object. - For instance, an object whose entire text content has been explicitly - marked as 'bold' will report the 'bold' attribute via getAttributeRun(), - whereas an object whose text weight is inspecified may report - the default or implied text weight in the default AttributeSet. - """ - func = self.get_dbus_method("getDefaultAttributeSet", dbus_interface=ATSPI_TEXT) - return [key + ':' + value for key, value in func().values()] - - def getDefaultAttributes(self): - """ - Deprecated in favor of getDefaultAttributeSet. - @return the attributes which apply to the entire text content, - but which were not explicitly specified by the content creator. - """ - func = self.get_dbus_method("getDefaultAttributes", dbus_interface=ATSPI_TEXT) - return ';'.join([key + ':' + value for key, value in func().iteritems()]) - - def getNSelections(self): - """ - Obtain the number of separate, contiguous selections in the current - Text object. Text objects which do not implement selection of - discontiguous text regions will always return '0' or '1'. Note - that "contiguous" is defined by continuity of the offsets, i.e. - a text 'selection' is defined by a start/end offset pair. In - the case of bidirectional text, this means that a continguous - selection may appear visually discontiguous, and vice-versa. - @return the number of contiguous selections in the current Text - object. - """ - func = self.get_dbus_method("getNSelections", dbus_interface=ATSPI_TEXT) - return func() - - def getOffsetAtPoint(self, x, y, coordType): - """ - Get the offset of the character at a given onscreen coordinate. - The coordinate system used to interpret x and y is determined - by parameter coordType. - @param : x - @param : y - @param : coordType - if 0, the input coordinates are interpreted relative to the entire - screen, if 1, they are relative to the toplevel window containing - this Text object. - @return the text offset (as an offset into the character array) - of the glyph whose onscreen bounds contain the point x,y, or - -1 if the point is outside the bounds of any glyph. - """ - func = self.get_dbus_method("getOffsetAtPoint", dbus_interface=ATSPI_TEXT) - return func(x, y, UInt32(coordType)) - - def getRangeExtents(self, startOffset, endOffset, coordType): - """ - Obtain the bounding box which entirely contains a given text - range. Negative values may be returned for the bounding box parameters - in the event that all or part of the text range is offscreen - or not mapped to the screen. - @param : startOffset - the offset of the first character in the specified range. - @param : endOffset - the offset of the character immediately after the last character - in the specified range. - @param : x - an integer parameter which is back-filled with the minimum horizontal - coordinate of the resulting bounding box. - @param : y - an integer parameter which is back-filled with the minimum vertical - coordinate of the resulting bounding box. - @param : width - an integer parameter which is back-filled with the horizontal - extent of the bounding box. - @param : height - an integer parameter which is back-filled with the vertical extent - of the bounding box. - @param : coordType - If 0, the above coordinates are reported in pixels relative to - corner of the screen; if 1, the coordinates are reported relative - to the corner of the containing toplevel window. - """ - func = self.get_dbus_method("getRangeExtents", dbus_interface=ATSPI_TEXT) - return func(startOffset, endOffset, UInt32(coordType)) - - def getSelection(self, selectionNum): - """ - The result of calling getSelection with an out-of-range selectionNum - (i.e. for a selection which does not exist) is not strictly defined, - but should set endOffset equal to startOffset. - @param : selectionNum - indicates which of a set of non-contiguous selections to modify. - @param : startOffset - back-filled with the starting offset of the resulting substring, - if one exists. - @param : endOffset - back-filled with the offset of the character immediately following - the resulting substring, if one exists. - """ - func = self.get_dbus_method("getSelection", dbus_interface=ATSPI_TEXT) - return func(selectionNum) - - def getText(self, startOffset, endOffset): - """ - Obtain all or part of the onscreen textual content of a Text - object. If endOffset is specified as "-1", then this method will - return the entire onscreen textual contents of the Text object. - @param : startOffset - back-filled with the starting offset of the resulting substring, - if one exists. - @param : endOffset - back-filled with the offset of the character immediately following - the resulting substring, if one exists. - @return the textual content of the current Text object beginning - startOffset (inclusive) up to but not including the character - at endOffset. - """ - func = self.get_dbus_method("getText", dbus_interface=ATSPI_TEXT) - if not endOffset: - endOffset = -1 - return func(dbus.Int32(startOffset), dbus.Int32(endOffset)) - - def getTextAfterOffset(self, offset, type): - """ - Obtain a subset of the text content of an object which entirely - follows offset, delimited by character, word, line, or sentence - boundaries as specified by type. The starting and ending offsets - of the resulting substring are returned in startOffset and endOffset. - By definition, if such a substring exists, startOffset must be - greater than offset. - @param : offset - the offset from which the substring search begins, and which - must lie before the returned substring. - @param : type - the text-boundary delimiter which determines whether the returned - text constitures a character, word, line, or sentence (and possibly - attendant whitespace), and whether the start or ending of such - a substring forms the boundary condition. - @param : startOffset - back-filled with the starting offset of the resulting substring, - if one exists. - @param : endOffset - back-filled with the offset of the character immediately following - the resulting substring, if one exists. - @return a string which is a substring of the text content of - the object, delimited by the specified boundary condition. - """ - func = self.get_dbus_method("getTextAfterOffset", dbus_interface=ATSPI_TEXT) - return func(offset, type) - - def getTextAtOffset(self, offset, type): - """ - Obtain a subset of the text content of an object which includes - the specified offset, delimited by character, word, line, or - sentence boundaries as specified by type. The starting and ending - offsets of the resulting substring are returned in startOffset - and endOffset. - @param : offset - the offset from which the substring search begins, and which - must lie within the returned substring. - @param : type - the text-boundary delimiter which determines whether the returned - text constitures a character, word, line, or sentence (and possibly - attendant whitespace), and whether the start or ending of such - a substring forms the boundary condition. - @param : startOffset - back-filled with the starting offset of the resulting substring, - if one exists. - @param : endOffset - back-filled with the offset of the character immediately following - the resulting substring, if one exists. - @return a string which is a substring of the text content of - the object, delimited by the specified boundary condition. - """ - func = self.get_dbus_method("getTextAtOffset", dbus_interface=ATSPI_TEXT) - return func(offset, type) - - def getTextBeforeOffset(self, offset, type): - """ - Obtain a subset of the text content of an object which entirely - precedes offset, delimited by character, word, line, or sentence - boundaries as specified by type. The starting and ending offsets - of the resulting substring are returned in startOffset and endOffset. - By definition, if such a substring exists, endOffset is less - than or equal to offset. - @param : offset - the offset from which the substring search begins. - @param : type - the text-boundary delimiter which determines whether the returned - text constitures a character, word, line, or sentence (and possibly - attendant whitespace), and whether the start or ending of such - a substring forms the boundary condition. - @param : startOffset - back-filled with the starting offset of the resulting substring, - if one exists. - @param : endOffset - back-filled with the offset of the character immediately following - the resulting substring, if one exists. - @return a string which is a substring of the text content of - the object, delimited by the specified boundary condition. - """ - func = self.get_dbus_method("getTextBeforeOffset", dbus_interface=ATSPI_TEXT) - return func(offset, type) - - def removeSelection(self, selectionNum): - """ - Deselect the text contained in the specified selectionNum, if - such a selection exists, otherwise do nothing. Removal of a non-existant - selectionNum has no effect. - @param : selectionNum - indicates which of a set of non-contiguous selections to modify. - @return True if the selection was successfully removed, False - otherwise. - """ - func = self.get_dbus_method("removeSelection", dbus_interface=ATSPI_TEXT) - return func(selectionNum) - - def setCaretOffset(self, offset): - """ - Programmatically move the text caret (visible or virtual, as - above) to a given position. - @param : offset - a long int indicating the desired character offset. Not all implementations - of Text will honor setCaretOffset requests, so the return value - below should be checked by the client. - @return TRUE if the request was carried out, or FALSE if the - caret could not be moved to the requested position. - """ - func = self.get_dbus_method("setCaretOffset", dbus_interface=ATSPI_TEXT) - return func(offset) - - def setSelection(self, selectionNum, startOffset, endOffset): - """ - Modify an existing selection's start or ending offset. - Calling setSelection for a selectionNum that is not already defined - has no effect. The result of calling setSelection with a selectionNum - greater than 0 for objects that do not include STATE_MULTISELECTABLE - is undefined. - @param : selectionNum - indicates which of a set of non-contiguous selections to modify. - @param : startOffset - the new starting offset for the selection - @param : endOffset - the new ending offset for the selection - @return True if the selection corresponding to selectionNum is - successfully modified, False otherwise. - """ - func = self.get_dbus_method("setSelection", dbus_interface=ATSPI_TEXT) - return func(selectionNum, startOffset, endOffset) - - def get_caretOffset(self): - return dbus.Int32(self._pgetter(self._dbus_interface, "caretOffset")) - _caretOffsetDoc = \ - """ - The current offset of the text caret in the Text object. This - caret may be virtual, e.g. non-visual and notional-only, but - if an onscreen representation of the caret position is visible, - it will correspond to this offset. The caret offset is given - as a character offset, as opposed to a byte offset into a text - buffer or a column offset. - """ - caretOffset = property(fget=get_caretOffset, doc=_caretOffsetDoc) - - def get_characterCount(self): - return dbus.Int32(self._pgetter(self._dbus_interface, "characterCount")) - _characterCountDoc = \ - """ - The total current number of characters in the Text object, including - whitespace and non-spacing characters. - """ - characterCount = property(fget=get_characterCount, doc=_characterCountDoc) - - class Range(list): - def __new__(cls, startOffset, endOffset, content, data): - list.__new__(cls, (startOffset, endOffset, content, data)) - def __init__(self, startOffset, endOffset, content, data): - list.__init__(self, (startOffset, endOffset, content, data)) - - def _get_startOffset(self): - return self[0] - def _set_startOffset(self, val): - self[0] = val - startOffset = property(fget=_get_startOffset, fset=_set_startOffset) - def _get_endOffset(self): - return self[1] - def _set_endOffset(self, val): - self[1] = val - endOffset = property(fget=_get_endOffset, fset=_set_endOffset) - def _get_content(self): - return self[2] - def _set_content(self, val): - self[2] = val - content = property(fget=_get_content, fset=_set_content) - def _get_data(self): - return self[3] - def _set_data(self, val): - self[3] = val - data = property(fget=_get_data, fset=_set_data) - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_TEXT, Text) - -#END---------------------------------------------------------------------------- diff --git a/pyatspi/utils.py b/pyatspi/utils.py deleted file mode 100644 index 61cad1e..0000000 --- a/pyatspi/utils.py +++ /dev/null @@ -1,331 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd -#copyright: Copyright (c) 2005, 2007 IBM Corporation - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -#Portions of this code originally licensed and copyright (c) 2005, 2007 -#IBM Corporation under the BSD license, available at -#U{http://www.opensource.org/licenses/bsd-license.php} - -#authors: Peter Parente, Mark Doffman - -import relation -import state -import registry - -__all__ = [ - "setCacheLevel", - "getCacheLevel", - "clearCache", - "printCache", - "getInterfaceIID", - "getInterfaceName", - "listInterfaces", - "stringToConst", - "stateToString", - "relationToString", - "allModifiers", - "findDescendant", - "findAllDescendants", - "findAncestor", - "getPath", - ] - -def setCacheLevel(level): - pass - -def getCacheLevel(): - return None - -def clearCache(): - pass - -def printCache(): - print "Print cache function is deprecated"; - -def getInterfaceIID(obj): - """ - Gets the ID of an interface class or object in string format for use in - queryInterface. - - @param obj: Class representing an AT-SPI interface or instance - @type obj: object - @return: IID for the interface - @rtype: string - @raise AttributeError: When the parameter does not provide typecode info - - WARNING!! DEPRECATED!! - - In current D-Bus version of pyatspi this simply returns a null string. - """ - return "" - -def getInterfaceName(obj): - """ - Gets the human readable name of an interface class or object in string - format. - - @param obj: Class representing an AT-SPI interface or instance - @type obj: class - @return: Name of the interface - @rtype: string - @raise AttributeError: When the parameter does not provide typecode info - """ - return obj._dbus_interface.lstrip("org.freedesktop.atspi.") - -def listInterfaces(obj): - """ - Gets a list of the names of all interfaces supported by this object. The - names are the short-hand interface names like "Accessible" and "Component", - not the full interface identifiers. - - @param obj: Arbitrary object to query for all accessibility related - interfaces. Must provide a queryInterface method. - @type obj: object - @return: Set of supported interface names - @rtype: set - @raise AttributeError: If the object provide does not implement - queryInterface - """ - return [itf.lstrip("org.freedesktop.atspi.") for itf in obj.interfaces] - -def stringToConst(prefix, suffix): - """ - Maps a string name to an AT-SPI constant. The rules for the mapping are as - follows: - - The prefix is captalized and has an _ appended to it. - - All spaces in the suffix are mapped to the _ character. - - All alpha characters in the suffix are mapped to their uppercase. - - The resulting name is used with getattr to look up a constant with that name - in the L{constants} module. If such a constant does not exist, the string - suffix is returned instead. - - This method allows strings to be used to refer to roles, relations, etc. - without direct access to the constants. It also supports the future expansion - of roles, relations, etc. by allowing arbitrary strings which may or may not - map to the current standard set of roles, relations, etc., but may still - match some non-standard role, relation, etc. being reported by an - application. - - @param prefix: Prefix of the constant name such as role, relation, state, - text, modifier, key - @type prefix: string - @param suffix: Name of the role, relation, etc. to use to lookup the constant - @type suffix: string - @return: The matching constant value - @rtype: object - """ - name = prefix.upper()+'_'+suffix.upper().replace(' ', '_') - return getattr(constants, name, suffix) - -def stateToString(value): - """ - Converts a state value to a string based on the name of the state constant in - the L{constants} module that has the given value. - - @param value: An AT-SPI state - @type value: Accessibility.StateType - @return: Human readable, untranslated name of the state - @rtype: string - """ - return state.STATE_VALUE_TO_NAME.get(value) - -def relationToString(value): - """ - Converts a relation value to a string based on the name of the state constant - in the L{constants} module that has the given value. - - @param value: An AT-SPI relation - @type value: Accessibility.RelationType - @return: Human readable, untranslated name of the relation - @rtype: string - """ - return relation.RELATION_VALUE_TO_NAME.get(value) - -def allModifiers(): - """ - Generates all possible keyboard modifiers for use with - L{registry.Registry.registerKeystrokeListener}. - """ - mask = 0 - while mask <= (1 << registry.MODIFIER_NUMLOCK): - yield mask - mask += 1 - -def findDescendant(acc, pred, breadth_first=False): - """ - Searches for a descendant node satisfying the given predicate starting at - this node. The search is performed in depth-first order by default or - in breadth first order if breadth_first is True. For example, - - my_win = findDescendant(lambda x: x.name == 'My Window') - - will search all descendants of x until one is located with the name 'My - Window' or all nodes are exausted. Calls L{_findDescendantDepth} or - L{_findDescendantBreadth} to start the recursive search. - - @param acc: Root accessible of the search - @type acc: Accessibility.Accessible - @param pred: Search predicate returning True if accessible matches the - search criteria or False otherwise - @type pred: callable - @param breadth_first: Search breadth first (True) or depth first (False)? - @type breadth_first: boolean - @return: Accessible matching the criteria or None if not found - @rtype: Accessibility.Accessible or None - """ - if breadth_first: - return _findDescendantBreadth(acc, pred) - - for child in acc: - try: - ret = _findDescendantDepth(acc, pred) - except Exception: - ret = None - if ret is not None: return ret - -def _findDescendantBreadth(acc, pred): - """ - Internal function for locating one descendant. Called by L{findDescendant} to - start the search. - - @param acc: Root accessible of the search - @type acc: Accessibility.Accessible - @param pred: Search predicate returning True if accessible matches the - search criteria or False otherwise - @type pred: callable - @return: Matching node or None to keep searching - @rtype: Accessibility.Accessible or None - """ - for child in acc: - try: - if pred(child): return child - except Exception: - pass - for child in acc: - try: - ret = _findDescendantBreadth(child, pred) - except Exception: - ret = None - if ret is not None: return ret - -def _findDescendantDepth(acc, pred): - """ - Internal function for locating one descendant. Called by L{findDescendant} to - start the search. - - @param acc: Root accessible of the search - @type acc: Accessibility.Accessible - @param pred: Search predicate returning True if accessible matches the - search criteria or False otherwise - @type pred: callable - @return: Matching node or None to keep searching - @rtype: Accessibility.Accessible or None - """ - try: - if pred(acc): return acc - except Exception: - pass - for child in acc: - try: - ret = _findDescendantDepth(child, pred) - except Exception: - ret = None - if ret is not None: return ret - -def findAllDescendants(acc, pred): - """ - Searches for all descendant nodes satisfying the given predicate starting at - this node. Does an in-order traversal. For example, - - pred = lambda x: x.getRole() == pyatspi.ROLE_PUSH_BUTTON - buttons = pyatspi.findAllDescendants(node, pred) - - will locate all push button descendants of node. - - @param acc: Root accessible of the search - @type acc: Accessibility.Accessible - @param pred: Search predicate returning True if accessible matches the - search criteria or False otherwise - @type pred: callable - @return: All nodes matching the search criteria - @rtype: list - """ - matches = [] - _findAllDescendants(acc, pred, matches) - return matches - -def _findAllDescendants(acc, pred, matches): - """ - Internal method for collecting all descendants. Reuses the same matches - list so a new one does not need to be built on each recursive step. - """ - for child in acc: - try: - if pred(child): matches.append(child) - except Exception: - pass - _findAllDescendants(child, pred, matches) - -def findAncestor(acc, pred): - """ - Searches for an ancestor satisfying the given predicate. Note that the - AT-SPI hierarchy is not always doubly linked. Node A may consider node B its - child, but B is not guaranteed to have node A as its parent (i.e. its parent - may be set to None). This means some searches may never make it all the way - up the hierarchy to the desktop level. - - @param acc: Starting accessible object - @type acc: Accessibility.Accessible - @param pred: Search predicate returning True if accessible matches the - search criteria or False otherwise - @type pred: callable - @return: Node matching the criteria or None if not found - @rtype: Accessibility.Accessible - """ - if acc is None: - # guard against bad start condition - return None - while 1: - if acc.parent is None: - # stop if there is no parent and we haven't returned yet - return None - try: - if pred(acc.parent): return acc.parent - except Exception: - pass - # move to the parent - acc = acc.parent - -def getPath(acc): - """ - Gets the path from the application ancestor to the given accessible in - terms of its child index at each level. - - @param acc: Target accessible - @type acc: Accessibility.Accessible - @return: Path to the target - @rtype: list of integer - @raise LookupError: When the application accessible cannot be reached - """ - path = [] - while 1: - if acc.parent is None: - path.reverse() - return path - try: - path.append(acc.getIndexInParent()) - except Exception: - raise LookupError - acc = acc.parent diff --git a/pyatspi/value.py b/pyatspi/value.py deleted file mode 100644 index 121d5c8..0000000 --- a/pyatspi/value.py +++ /dev/null @@ -1,74 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#This library is free software; you can redistribute it and/or -#modify it under the terms of the GNU Lesser General Public -#License version 2 as published by the Free Software Foundation. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU Lesser General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from interfaces import * -from accessible import Accessible -from factory import accessible_factory - -import dbus - -__all__ = [ - "Value", - ] - -#------------------------------------------------------------------------------ - -class Value(Accessible): - """ - An interface supporting controls which allow a one-dimensional, - scalar quantity to be modified or which reflect a scalar quantity. - (If STATE_EDITABLE is not present, the valuator is treated as - "read only". - """ - - def get_currentValue(self): - return dbus.Double(self._pgetter(self._dbus_interface, "currentValue")) - def set_currentValue(self, value): - self._psetter(self._dbus_interface, "currentValue", dbus.Double(value, variant_level=1)) - _currentValueDoc = \ - """ - The current value of the valuator. - """ - currentValue = property(fget=get_currentValue, fset=set_currentValue, doc=_currentValueDoc) - - def get_maximumValue(self): - return dbus.Double(self._pgetter(self._dbus_interface, "maximumValue")) - _maximumValueDoc = \ - """ - The maximum value allowed by this valuator. - """ - maximumValue = property(fget=get_maximumValue, doc=_maximumValueDoc) - - def get_minimumIncrement(self): - return dbus.Double(self._pgetter(self._dbus_interface, "minimumIncrement")) - _minimumIncrementDoc = \ - """ - The smallest incremental change which this valuator allows. If - 0, the incremental changes to the valuator are limited only by - the precision of a double precision value on the platform. - """ - minimumIncrement = property(fget=get_minimumIncrement, doc=_minimumIncrementDoc) - - def get_minimumValue(self): - return dbus.Double(self._pgetter(self._dbus_interface, "minimumValue")) - _minimumValueDoc = \ - """ - The minimum value allowed by this valuator. - """ - minimumValue = property(fget=get_minimumValue, doc=_minimumValueDoc) - -# Register the accessible class with the factory. -accessible_factory.register_accessible_class(ATSPI_VALUE, Value) - -#END---------------------------------------------------------------------------- diff --git a/tests/Makefile.am b/tests/Makefile.am deleted file mode 100644 index 8daea17..0000000 --- a/tests/Makefile.am +++ /dev/null @@ -1,11 +0,0 @@ -SUBDIRS = dummyatk apps data pyatspi cspi - -#TESTS=testrunner.py -TESTS_ENVIRONMENT = PYTHONPATH=$(abs_top_srcdir)/python \ - ATSPI_INTROSPECTION_PATH=$(top_srcdir)/xml/introspection \ - TEST_DATA_DIRECTORY=$(abs_top_srcdir)/tests/data \ - TEST_ATSPI_LIBRARY=$(abs_top_srcdir)/atk-adaptor/.libs/libspiatk.so \ - TEST_MODULES_DIRECTORY=$(abs_top_srcdir)/tests/apps/.libs \ - TEST_APPLICATION=$(abs_top_srcdir)/tests/apps/test-application - -CLEANFILES = *.pyc diff --git a/tests/apps/Makefile.am b/tests/apps/Makefile.am deleted file mode 100644 index 12a3257..0000000 --- a/tests/apps/Makefile.am +++ /dev/null @@ -1,47 +0,0 @@ -check_PROGRAMS = test-application -check_LTLIBRARIES = libnoopapp.la \ - libaccessibleapp.la \ - libcomponentapp.la \ - libactionapp.la \ - librelationapp.la - -test_application_CFLAGS = $(DBUS_GLIB_CFLAGS) \ - $(ATK_CFLAGS) \ - $(GMODULE_CFLAGS) \ - -I$(top_srcdir) - -test_application_LDADD = $(DBUS_GLIB_LIBS) \ - $(GMODULE_LIBS) \ - $(ATK_LIBS) - -test_application_SOURCES = test-application.c - - -TEST_APP_CFLAGS = $(ATK_CFLAGS) $(GMODULE_CFLAGS) -I$(top_srcdir) -I$(top_srcdir)/tests/dummyatk/ -TEST_APP_LDFLAGS = -no-undefined -module -avoid-version -rpath /a/fake/path -TEST_APP_LIBADD = $(ATK_LIBS) $(GMODULE_LIBS) $(top_builddir)/tests/dummyatk/libdummyatk.la - -libnoopapp_la_CFLAGS = $(TEST_APP_CFLAGS) -libnoopapp_la_LDFLAGS = $(TEST_APP_LDFLAGS) -libnoopapp_la_LIBADD = $(TEST_APP_LIBADD) -libnoopapp_la_SOURCES = noop-app.c - -libaccessibleapp_la_CFLAGS = $(TEST_APP_CFLAGS) $(LIB_XML_CFLAGS) -libaccessibleapp_la_LDFLAGS = $(TEST_APP_LDFLAGS) -libaccessibleapp_la_LIBADD = $(TEST_APP_LIBADD) $(LIB_XML_LIBS) -libaccessibleapp_la_SOURCES = accessible-app.c atk-object-xml-loader.c atk-object-xml-loader.h - -libcomponentapp_la_CFLAGS = $(TEST_APP_CFLAGS) -libcomponentapp_la_LDFLAGS = $(TEST_APP_LDFLAGS) -libcomponentapp_la_LIBADD = $(TEST_APP_LIBADD) -libcomponentapp_la_SOURCES = component-app.c - -libactionapp_la_CFLAGS = $(TEST_APP_CFLAGS) -libactionapp_la_LDFLAGS = $(TEST_APP_LDFLAGS) -libactionapp_la_LIBADD = $(TEST_APP_LIBADD) -libactionapp_la_SOURCES = action-app.c - -librelationapp_la_CFLAGS = $(TEST_APP_CFLAGS) -librelationapp_la_LDFLAGS = $(TEST_APP_LDFLAGS) -librelationapp_la_LIBADD = $(TEST_APP_LIBADD) -librelationapp_la_SOURCES = relation-app.c diff --git a/tests/apps/accessible-app.c b/tests/apps/accessible-app.c deleted file mode 100644 index 2796bf5..0000000 --- a/tests/apps/accessible-app.c +++ /dev/null @@ -1,57 +0,0 @@ -#include -#include -#include - -#include "atk-object-xml-loader.h" - -static gchar *tdata_path = NULL; - -static AtkObject *root_accessible; - -static AtkStateType states[] = -{ - ATK_STATE_MULTI_LINE, - ATK_STATE_MODAL, - ATK_STATE_INDETERMINATE, - ATK_STATE_SUPPORTS_AUTOCOMPLETION, - ATK_STATE_VERTICAL -}; - -#define OBJECT_TEST_1 "accessible-test.xml" - -G_MODULE_EXPORT void -test_init (gchar *path) -{ - AtkStateSet *ss; - gchar *td; - - if (path == NULL) - g_error("No test data path provided"); - tdata_path = path; - - td = g_build_path(G_DIR_SEPARATOR_S, tdata_path, OBJECT_TEST_1, NULL); - root_accessible = ATK_OBJECT(atk_object_xml_parse(td)); - g_free(td); - - ss = atk_object_ref_state_set(ATK_OBJECT(root_accessible)); - atk_state_set_add_states(ss, states, 5); - g_object_unref(G_OBJECT(ss)); -} - -G_MODULE_EXPORT void -test_next (int argc, char *argv[]) -{ - ; -} - -G_MODULE_EXPORT void -test_finished (int argc, char *argv[]) -{ - ; -} - -G_MODULE_EXPORT AtkObject * -test_get_root (void) -{ - return root_accessible; -} diff --git a/tests/apps/action-app.c b/tests/apps/action-app.c deleted file mode 100644 index 612cd59..0000000 --- a/tests/apps/action-app.c +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -#include - -static AtkObject *root_accessible; - -G_MODULE_EXPORT void -test_init (gchar *path) -{ - root_accessible = g_object_new(MY_TYPE_ATK_ACTION, NULL); -} - -G_MODULE_EXPORT void -test_next (int argc, char *argv[]) -{ - g_print("Moving to next stage\n"); -} - -G_MODULE_EXPORT void -test_finished (int argc, char *argv[]) -{ - g_print("Test has completed\n"); -} - -G_MODULE_EXPORT AtkObject * -test_get_root (void) -{ - return root_accessible; -} diff --git a/tests/apps/atk-object-xml-loader.c b/tests/apps/atk-object-xml-loader.c deleted file mode 100644 index 5fa2354..0000000 --- a/tests/apps/atk-object-xml-loader.c +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright 2008 Codethink Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include -#include -#include -#include - -#include - -#define ACCESSIBLE_NODE ((const xmlChar *) "accessible") -#define INTERFACE_NODE ((const xmlChar *) "interface") - -#define NAME_ATTR ((const xmlChar *) "name") -#define DESC_ATTR ((const xmlChar *) "description") -#define ROLE_ATTR ((const xmlChar *) "role") - -static MyAtkObject * -create_atk_object_from_element(xmlNode *element) -{ - xmlNode *child_node; - - MyAtkObject *obj = NULL; - MyAtkObject *child_obj; - - xmlChar *name; - xmlChar *description; - xmlChar *role_text; - gint role; - - name = xmlGetProp(element, NAME_ATTR); - description = xmlGetProp(element, DESC_ATTR); - role_text = xmlGetProp(element, ROLE_ATTR); - role = atoi(role_text); - - obj = MY_ATK_OBJECT(g_object_new(MY_TYPE_ATK_OBJECT, - "accessible-name", name, - "accessible-description", description, - "accessible-role", role, - NULL)); - - child_node = element->xmlChildrenNode; - while (child_node != NULL) - { - if (!xmlStrcmp(child_node->name, ACCESSIBLE_NODE)) - { - child_obj = create_atk_object_from_element(child_node); - my_atk_object_add_child(obj, child_obj); - } - child_node = child_node->next; - } - return obj; -} - -/* - * Reads the XML from filename and uses it - * to create a tree of MyAtkObjects. - * - * returns: The root object of the tree. - */ -MyAtkObject * -atk_object_xml_parse(gchar *filename) -{ - xmlDoc *doc; - xmlNode *root_element; - MyAtkObject *new_atk_object = NULL; - - doc = xmlReadFile(filename, NULL, 0); - g_assert(doc != NULL); - - root_element = xmlDocGetRootElement(doc); - - if (!xmlStrcmp(root_element->name, ACCESSIBLE_NODE)) - new_atk_object = create_atk_object_from_element(root_element); - - xmlFreeDoc(doc); - return new_atk_object; -} diff --git a/tests/apps/atk-object-xml-loader.h b/tests/apps/atk-object-xml-loader.h deleted file mode 100644 index ce707bd..0000000 --- a/tests/apps/atk-object-xml-loader.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2008 Codethink Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifndef ATK_OBJECT_XML_LOADER_H -#define ATK_OBJECT_XML_LOADER_H - -#include -#include - -MyAtkObject * -atk_object_xml_parse(gchar *filename); - -#endif /*ATK_OBJECT_XML_LOADER_H*/ diff --git a/tests/apps/component-app.c b/tests/apps/component-app.c deleted file mode 100644 index d51e1ac..0000000 --- a/tests/apps/component-app.c +++ /dev/null @@ -1,55 +0,0 @@ -#include -#include -#include - -static gchar *tdata_path = NULL; - -static AtkComponent *comps[] = {NULL, NULL, NULL}; -static const AtkRectangle extents[] = {{0,0,30,20}, {40,30,30,40}, {0,0,70,70}}; -static const AtkLayer layers[] = {ATK_LAYER_WINDOW, ATK_LAYER_WIDGET, ATK_LAYER_MDI}; -static const guint zorders[] = {0, -100, 100}; -static const gboolean extent_may_changed[] = {TRUE, FALSE, TRUE}; - -G_MODULE_EXPORT void -test_init (gchar *path) -{ - int i; - - if (path == NULL) - g_error("No test data path provided"); - tdata_path = path; - - g_type_init(); - for(i = 0; i < sizeof(comps) / sizeof(comps[0]); i++) - { - MyAtkComponent *mycomp = MY_ATK_COMPONENT(g_object_new(MY_TYPE_ATK_COMPONENT, NULL)); - - mycomp->extent = extents[i]; - mycomp->is_extent_may_changed = extent_may_changed[i]; - mycomp->layer = layers[i]; - mycomp->zorder = zorders[i]; - - comps[i] = ATK_COMPONENT(mycomp); - } - - my_atk_object_add_child(MY_ATK_OBJECT(comps[2]), MY_ATK_OBJECT(comps[0])); - my_atk_object_add_child(MY_ATK_OBJECT(comps[2]), MY_ATK_OBJECT(comps[1])); -} - -G_MODULE_EXPORT void -test_next (int argc, char *argv[]) -{ - g_print("Moving to next stage\n"); -} - -G_MODULE_EXPORT void -test_finished (int argc, char *argv[]) -{ - g_print("Test has completed\n"); -} - -G_MODULE_EXPORT AtkObject * -test_get_root (void) -{ - return ATK_COMPONENT(comps[2]); -} diff --git a/tests/apps/noop-app.c b/tests/apps/noop-app.c deleted file mode 100644 index f2a5f51..0000000 --- a/tests/apps/noop-app.c +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include - -G_MODULE_EXPORT void -test_init (int argc, char *argv[]) -{ - ; -} - -G_MODULE_EXPORT void -test_next (int argc, char *argv[]) -{ - ; -} - -G_MODULE_EXPORT void -test_finished (int argc, char *argv[]) -{ - ; -} - -G_MODULE_EXPORT AtkObject * -test_get_root (void) -{ - return NULL; -} diff --git a/tests/apps/relation-app.c b/tests/apps/relation-app.c deleted file mode 100644 index 5734ffe..0000000 --- a/tests/apps/relation-app.c +++ /dev/null @@ -1,90 +0,0 @@ -#include -#include -#include - -static AtkObject *root_accessible; - -G_MODULE_EXPORT void -test_init (gchar *path) -{ - AtkObject *r1, *r2, *r3; - AtkObject *m1, *m2, *m3; - AtkRelationSet *rset; - AtkRelation *rel; - AtkObject *rls[3]; - - root_accessible = g_object_new(MY_TYPE_ATK_OBJECT, NULL); - - r1 = ATK_OBJECT(g_object_new(MY_TYPE_ATK_OBJECT, - "accessible-name", "r1", - "accessible-description", "", - "accessible-role", ATK_ROLE_INVALID, - NULL)); - my_atk_object_add_child(MY_ATK_OBJECT(root_accessible), MY_ATK_OBJECT(r1)); - - r2 = ATK_OBJECT(g_object_new(MY_TYPE_ATK_OBJECT, - "accessible-name", "r2", - "accessible-description", "", - "accessible-role", ATK_ROLE_INVALID, - NULL)); - my_atk_object_add_child(MY_ATK_OBJECT(root_accessible), MY_ATK_OBJECT(r2)); - - r3 = ATK_OBJECT(g_object_new(MY_TYPE_ATK_OBJECT, - "accessible-name", "r3", - "accessible-description", "", - "accessible-role", ATK_ROLE_INVALID, - NULL)); - my_atk_object_add_child(MY_ATK_OBJECT(root_accessible), MY_ATK_OBJECT(r3)); - - m1 = ATK_OBJECT(g_object_new(MY_TYPE_ATK_OBJECT, - "accessible-name", "m1", - "accessible-description", "", - "accessible-role", ATK_ROLE_INVALID, - NULL)); - my_atk_object_add_child(MY_ATK_OBJECT(root_accessible), MY_ATK_OBJECT(m1)); - - m2 = ATK_OBJECT(g_object_new(MY_TYPE_ATK_OBJECT, - "accessible-name", "m2", - "accessible-description", "", - "accessible-role", ATK_ROLE_INVALID, - NULL)); - my_atk_object_add_child(MY_ATK_OBJECT(root_accessible), MY_ATK_OBJECT(m2)); - - m3 = ATK_OBJECT(g_object_new(MY_TYPE_ATK_OBJECT, - "accessible-name", "m3", - "accessible-description", "", - "accessible-role", ATK_ROLE_INVALID, - NULL)); - my_atk_object_add_child(MY_ATK_OBJECT(root_accessible), MY_ATK_OBJECT(m3)); - - atk_object_add_relationship(root_accessible, ATK_RELATION_EMBEDS, r1); - atk_object_add_relationship(root_accessible, ATK_RELATION_PARENT_WINDOW_OF, r2); - atk_object_add_relationship(root_accessible, ATK_RELATION_DESCRIBED_BY, r3); - - rls[0] = m1; - rls[1] = m2; - rls[2] = m3; - - rset = atk_object_ref_relation_set(root_accessible); - rel = atk_relation_new(rls, 3, ATK_RELATION_POPUP_FOR); - atk_relation_set_add(rset, rel); - g_object_unref(G_OBJECT(rset)); -} - -G_MODULE_EXPORT void -test_next (int argc, char *argv[]) -{ - g_print("Moving to next stage\n"); -} - -G_MODULE_EXPORT void -test_finished (int argc, char *argv[]) -{ - g_print("Test has completed\n"); -} - -G_MODULE_EXPORT AtkObject * -test_get_root (void) -{ - return root_accessible; -} diff --git a/tests/apps/test-application.c b/tests/apps/test-application.c deleted file mode 100644 index 9c0bd3c..0000000 --- a/tests/apps/test-application.c +++ /dev/null @@ -1,286 +0,0 @@ -/* - * AT-SPI - Assistive Technology Service Provider Interface - * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) - * - * Copyright 2008 Codethink Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -/* - * Testing AT-SPI requires both a test application and AT client. - * Test applications are built using the Dummy ATK implementation: MyAtk. - * This file contains the entry point for all test applications. - * Each test is built as a GModule, and this program loads the - * test module, as well as the AT-SPI module. The test module will - * provide its own implementation of atk_get_root, and as such provide - * all the application state for the test. - */ - -#include -#include -#include -#include -#include - -/* The test module, GModule containing interface for an atk-test */ -static GModule *test_module; -static gpointer test_module_get_root; -static gpointer test_module_next; -static gpointer test_module_finished; - -static DBusConnection *dbus_bus; -static GMainLoop *mainloop; - -/* Test module interface */ -/*************************/ - -typedef AtkObject *(*TestModuleGetRoot) (void); - -/* Calls into the test module to get the root atk object */ -static AtkObject * -get_root(void) -{ - return ((TestModuleGetRoot) test_module_get_root)(); -} - -typedef void (*VoidVoid) (void); - -/* Called to move to next stage of test.*/ -static void -next(void) -{ - ((VoidVoid) test_module_next)(); -} - - -/*************************/ - -/* The AtkUtil class is called to find the root accessible and to deal - * with events. Its an incomplete class, its v-table needs to be filled in. - */ -static void -setup_atk_util(void) -{ - AtkUtilClass *klass; - - klass = g_type_class_ref(ATK_TYPE_UTIL); - klass->get_root = get_root; - g_type_class_unref(klass); -} - -typedef void (*GtkModuleInit) (int *argc, char **argv[]); - -/* AT-SPI is a gtk module that must be loaded and initialized */ -static void -load_atspi_module(const char *path, int *argc, char **argv[]) -{ - GModule *bridge; - gpointer init; - - bridge = g_module_open(path, G_MODULE_BIND_LOCAL|G_MODULE_BIND_LAZY); - if (!bridge) - g_error("Couldn't load atk-bridge module : %s\n", g_module_error()); - - if (!g_module_symbol(bridge, "gtk_module_init", &init)) - g_error("Couldn't load symbol \"gtk_module_init\"\n"); - - ((GtkModuleInit) init)(argc, argv); -} - -typedef void (*TestModuleInit) (gchar *path); - -static void -load_test_module(const char *path, const char *tdpath) -{ - gpointer init; - - test_module = g_module_open(path, G_MODULE_BIND_LOCAL|G_MODULE_BIND_LAZY); - if (!test_module) - g_error("Couldn't load test module : %s\n", path); - - if (!g_module_symbol(test_module, "test_init", &init)) - g_error("Couldn't load symbol \"test_init\"\n"); - - if (!g_module_symbol(test_module, "test_get_root", &test_module_get_root)) - g_error("Couldn't load symbol \"test_get_root\"\n"); - - if (!g_module_symbol(test_module, "test_next", &test_module_next)) - g_error("Couldn't load symbol \"test_next\"\n"); - - if (!g_module_symbol(test_module, "test_finished", &test_module_finished)) - g_error("Couldn't load symbol \"test_finished\"\n"); - - ((TestModuleInit) init)((gchar *)tdpath); -} - -static const char* introspection_string = -"" -" " -" " -" " -" " -" " -""; - -static DBusHandlerResult -message_handler (DBusConnection *bus, DBusMessage *message, void *user_data) -{ - const char *iface = dbus_message_get_interface (message); - const char *member = dbus_message_get_member (message); - DBusHandlerResult result = DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - gboolean exit = FALSE; - - DBusMessage *reply = NULL; - - g_return_val_if_fail(iface != NULL, DBUS_HANDLER_RESULT_NOT_YET_HANDLED); - - if (!strcmp(iface, "org.codethink.atspi.test")) - { - if (!strcmp(member, "next")) - { - next(); - reply = dbus_message_new_method_return (message); - g_assert(reply != NULL); - result = DBUS_HANDLER_RESULT_HANDLED; - } - - if (!strcmp(member, "finish")) - { - ((VoidVoid) test_module_finished)(); - reply = dbus_message_new_method_return (message); - g_assert(reply != NULL); - result = DBUS_HANDLER_RESULT_HANDLED; - exit = TRUE; - } - } - - if (!strcmp(iface, "org.freedesktop.DBus.Introspectable")) - { - if (!strcmp(member, "Introspect")) - { - reply = dbus_message_new_method_return (message); - g_assert(reply != NULL); - dbus_message_append_args(reply, DBUS_TYPE_STRING, &introspection_string, - DBUS_TYPE_INVALID); - result = DBUS_HANDLER_RESULT_HANDLED; - } - } - - if (reply) - { - dbus_connection_send (bus, reply, NULL); - dbus_message_unref (reply); - } - - if (exit == TRUE) - { - dbus_connection_flush(bus); - dbus_connection_unref(bus); - g_main_loop_quit(mainloop); - } - return result; -} - -static DBusObjectPathVTable test_vtable = -{ - NULL, - &message_handler, - NULL, NULL, NULL, NULL -}; - -static void -init_dbus_interface(void) -{ - DBusError error; - - dbus_error_init(&error); - dbus_bus = dbus_bus_get(DBUS_BUS_SESSION, &error); - g_print("\nUnique D-Bus name is: %s\n", dbus_bus_get_unique_name(dbus_bus)); - - if (!dbus_bus) - g_error("Couldn't get the session bus - %s\n", error.message); - - g_assert(dbus_connection_register_object_path(dbus_bus, - "/org/codethink/atspi/test", - &test_vtable, - NULL)); - - dbus_connection_setup_with_g_main(dbus_bus, g_main_context_default()); -} - -static void -send_started_signal(void) -{ - DBusMessage* sig; - DBusMessageIter args; - - sig = dbus_message_new_signal("/org/codethink/atspi/test", "org.codethink.atspi.test", "started"); - g_assert(sig != NULL); - if (!dbus_connection_send(dbus_bus, sig, NULL)) - g_error("Out of memory"); - dbus_connection_flush(dbus_bus); - dbus_message_unref(sig); -} - -/*Command line data*/ -static gchar *tmodule_path = NULL; -static gchar *amodule_path = NULL; -static gchar *tdata_path = NULL; - -static GOptionEntry optentries[] = -{ - {"test-module", 0, 0, G_OPTION_ARG_STRING, &tmodule_path, "Module containing test scenario", NULL}, - {"test-atspi-library", 0, 0, G_OPTION_ARG_STRING, &amodule_path, "Gtk module with atk-atspi adaptor", NULL}, - {"test-data-directory", 0, 0, G_OPTION_ARG_STRING, &tdata_path, "Path to directory of test data", NULL}, - {NULL} -}; - -/* main - * - * Entry point for all test applications. - */ -main(int argc, char *argv[]) -{ - GOptionContext *opt; - GError *err = NULL; - - /*Parse command options*/ - opt = g_option_context_new(NULL); - g_option_context_add_main_entries(opt, optentries, NULL); - g_option_context_set_ignore_unknown_options(opt, TRUE); - - if (!g_option_context_parse(opt, &argc, &argv, &err)) - g_error("Option parsing failed: %s\n", err->message); - - if (tmodule_path == NULL) - g_error("No test module provided"); - if (amodule_path == NULL) - g_error("No atspi module provided"); - - g_type_init(); - - setup_atk_util(); - load_test_module(tmodule_path, tdata_path); - load_atspi_module(amodule_path, &argc, &argv); - init_dbus_interface(); - send_started_signal(); - - mainloop = g_main_loop_new (NULL, FALSE); - g_main_loop_run (mainloop); - - return 0; -} diff --git a/tests/cspi/Makefile.am b/tests/cspi/Makefile.am deleted file mode 100644 index 316cbe4..0000000 --- a/tests/cspi/Makefile.am +++ /dev/null @@ -1,19 +0,0 @@ -noinst_PROGRAMS = key-listener-test keysynth-test simple-at test-simple - -key_listener_test_SOURCES = key-listener-test.c -keysynth_test_SOURCES = keysynth-test.c -simple_at_SOURCES = simple-at.c -test_simple_SOURCES = test-simple.c - -INCLUDES = -I$(top_srcdir) \ - -I$(top_builddir) \ - $(DBUS_CFLAGS) \ - $(GLIB_CFLAGS) \ - $(GTK_CFLAGS) \ - $(ATK_CFLAGS) \ - $(DBIND_CFLAGS) \ - $(DEBUG_CFLAGS) - -LDADD = $(top_builddir)/common/libspicommon.la \ - $(top_builddir)/cspi/libcspi.la \ - $(TESTS_LIBS) $(X_LIBS) $(XINPUT_LIBS) $(ATK_LIBS) $(GTK_LIBS) $(DBIND_LIBS) diff --git a/tests/cspi/accessible-test.c b/tests/cspi/accessible-test.c deleted file mode 100644 index ab490db..0000000 --- a/tests/cspi/accessible-test.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2008 Codethink Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#include -#include -#include - -typedef struct { - gchar *none; -} AccessibleObjectFixture; - -static void -test_getChildAtIndex (AccessibleObjectFixture *fix, gconstpointer test_data) -{ - return; -} - -int -main (int argc, char *argv[]) -{ - return 0; -} diff --git a/tests/cspi/classy-test-suite.c b/tests/cspi/classy-test-suite.c deleted file mode 100644 index dd22e7a..0000000 --- a/tests/cspi/classy-test-suite.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - * Copyright (C) 2008 Codethink Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include -#include - -#include "classy-test.h" -#include "classy-test-suite.h" - -/*---------------------------------------------------------------------------*/ - -static gboolean -run_test_app(gchar *module_name, gchar *dbus_name) -{ - gboolean result; - GPid pid; - GError *err = NULL; - - const gchar *test_data_directory; - const gchar *test_modules_directory; - const gchar *test_atspi_library; - const gchar *test_application; - gchar *test_module; - gchar *command_line; - - test_data_directory = g_getenv("TEST_DATA_DIRECTORY"); - test_modules_directory = g_getenv("TEST_MODULES_DIRECTORY"); - test_atspi_library = g_getenv("TEST_ATSPI_LIBRARY"); - test_application = g_getenv("TEST_APPLICATION"); - - test_module = g_build_path("/", test_modules_directory, module_name, NULL); - - command_line = g_build_path(" ", test_application, - "--atspi-dbus-name", dbus_name, - "--test-atspi-library", test_atspi_library, - "--test-module", test_module, - "--test-data-directory", test_data_directory, - NULL); - - if (!(result = g_spawn_command_line_async(NULL, &err))) - { - fprintf(stderr, "\nCould not spawn test application - %s", err->message); - } - - g_free(test_module); - g_free(command_line); - - return result; -} - -/*---------------------------------------------------------------------------*/ - -static gboolean -suite_idle_handler(gpointer data); - -static void -suite_finished_handler(gpointer data) -{ - ClassyTestSuite *suite = CLASSY_TEST_SUITE(data); - ClassyTest *test = CLASSY_TEST(g_array_index(suite->cases, gpointer, suite->current)); - - if ((classy_test_state(test) == CLASSY_TEST_WIN) || suite->cont) { - g_idle_add(suite_idle_handler, suite); - } - /* TODO If test has failed remember to send signal saying so */ -} - -static gboolean -suite_idle_handler(gpointer data) -{ - ClassyTestSuite *suite = CLASSY_TEST_SUITE(data); - - suite->current++; - if (suite->current >= suite->cases->len) { - /* No more tests, check for success or fail */ - gboolean succeeded = TRUE; - gint i; - for (i=0; i < suite->cases->len; i++) { - ClassyTest *test; - test = CLASSY_TEST(g_array_index(suite->cases, gpointer, i)); - succeeded = succeeded && (classy_test_state(test) == CLASSY_TEST_WIN); - } - if (succeeded == TRUE) - classy_test_pass(CLASSY_TEST(suite)); - else - classy_test_fail(CLASSY_TEST(suite), "Sub-test has failed"); - } else { - /* More tests, run this one*/ - ClassyTest *test; - test = CLASSY_TEST(g_array_index(suite->cases, gpointer, suite->current)); - g_signal_connect(test, "finished", (GCallback) suite_finished_handler, data); - classy_test_run(test); - } - return FALSE; -} - -static void -suite_run(ClassyTest *test) -{ - g_idle_add(suite_idle_handler, test); -} - -/*---------------------------------------------------------------------------*/ - -static gchar * -suite_report(ClassyTest *test) -{ - ClassyTestSuite *suite = CLASSY_TEST_SUITE(test); - GString *report; - gint i; - - report = g_string_new(""); - - switch (classy_test_state(test)) { - case CLASSY_TEST_FAIL: - g_string_printf(report, "FAIL : %s\n : %s\n ", test->name); - case CLASSY_TEST_WIN: - g_string_printf(report, "PASS : %s\n", test->name); - default: - g_string_printf(report, "INCOMPLETE : %s\n", test->name); - } - - for (i=0; i < suite->cases->len; i++) { - ClassyTest *subtest = CLASSY_TEST(g_array_index(suite->cases, gpointer, i)); - g_string_append_printf(report, " "); - g_string_append_printf(report, "%s", classy_test_report(subtest)); - } - return g_string_free(report, FALSE); -} - -/*---------------------------------------------------------------------------*/ - -G_DEFINE_TYPE (ClassyTestSuite, classy_test_suite, TYPE_CLASSY_TEST) - -static void -classy_test_suite_finalize (GObject *obj) -{ - ClassyTestSuite *suite = CLASSY_TEST_SUITE(obj); - gint i; - - for (i=0; i < suite->cases->len; i++) { - ClassyTest *test; - test = CLASSY_TEST(g_array_index(suite->cases, gpointer, i)); - g_object_unref(test); - } - g_free(suite->data); - - G_OBJECT_CLASS (classy_test_suite_parent_class)->finalize (obj); -} - -static void -classy_test_suite_class_init (ClassyTestSuiteClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - ClassyTestClass *test_class = CLASSY_TEST_CLASS(klass); - - gobject_class->finalize = classy_test_suite_finalize; - - test_class->report = suite_report; - test_class->run = suite_run; -} - -static void -classy_test_suite_init (ClassyTestSuite *suite) -{ - suite->cases = g_array_new(FALSE, FALSE, sizeof(gpointer)); - suite->current = -1; -} - -/*---------------------------------------------------------------------------*/ - -ClassyTestSuite * -classy_test_suite_new(gchar *name, gint dsize, gboolean cont) -{ - ClassyTestSuite *suite; - ClassyTest *test; - - suite = g_object_new(TYPE_CLASSY_TEST_SUITE, NULL); - suite->cont = cont; - suite->data = g_malloc0(dsize); - - test = CLASSY_TEST(suite); - test->name = g_strdup(name); - - return suite; -} - -void -classy_test_suite_add(ClassyTestSuite *suite, ClassyTest *test) -{ - g_array_append(suite->cases, test); -} - -/*---------------------------------------------------------------------------*/ diff --git a/tests/cspi/classy-test-suite.h b/tests/cspi/classy-test-suite.h deleted file mode 100644 index d27aad0..0000000 --- a/tests/cspi/classy-test-suite.h +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Classy Test - Terrible framework for testing asyncronous interface - * - * Copyright (C) 2008 Codethink Ltd - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef CLASSY_TEST_SUITE_H -#define CLASSY_TEST_SUITE_H - -#include - -G_BEGIN_DECLS - -GType classy_test_suite_get_type(void); - -#define TYPE_CLASSY_TEST_SUITE (classy_test_suite_get_type()) - -#define CLASSY_TEST_SUITE(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), \ - TYPE_CLASSY_TEST_SUITE, \ - ClassyTestSuite)) - -#define CLASSY_TEST_SUITE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), \ - TYPE_CLASSY_TEST_SUITE, \ - ClassyTestSuiteClass)) - -#define IS_CLASSY_TEST_SUITE(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), \ - TYPE_CLASSY_TEST_SUITE)) - -#define IS_CLASSY_TEST_SUITE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), \ - TYPE_CLASSY_TEST_SUITE)) - -#define CLASSY_TEST_SUITE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), \ - TYPE_CLASSY_TEST_SUITE, \ - ClassyTestSuiteClass)) - -typedef struct _ClassyTestSuite ClassyTestSuite; -typedef struct _ClassyTestSuiteClass ClassyTestSuiteClass; - -struct _ClassyTestSuite { - ClassyTest parent; - - GArray *cases; - gint current; - gboolean cont; - - gpointer data; -}; - -struct _ClassyTestSuiteClass { - ClassyTestClass parent; -}; - -ClassyTestSuite * -classy_test_suite_new(gchar *name, gint dsize, gboolean cont); - -void -classy_test_suite_add(ClassyTestSuite *suite, ClassyTest *test); - -/*---------------------------------------------------------------------------*/ - -G_END_DECLS -#endif /* CLASSY_TEST_SUITE_H */ diff --git a/tests/cspi/classy-test.c b/tests/cspi/classy-test.c deleted file mode 100644 index e5ef266..0000000 --- a/tests/cspi/classy-test.c +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Classy Test - Terrible framework for testing asyncronous interface - * - * Copyright (C) 2008 Codethink Ltd - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include - -#include "classy-test.h" - -static gchar * -classy_test_report(ClassyTest *test) -{ - switch (classy_test_state(test)) { - case CLASSY_TEST_FAIL: - return g_strdup_printf("FAIL : %s - %s\n ", test->name, test->failm); - case CLASSY_TEST_WIN: - return g_strdup_printf("PASS : %s\n", test->name); - default: - return g_strdup_printf("INCOMPLETE : %s\n", test->name); - } -} - -/*---------------------------------------------------------------------------*/ - -static void -classy_test_run(ClassyTest *test) -{ - test->tstate = CLASSY_TEST_IN_PROGRESS; - (test->entry)(test, test->data); -} - -/*---------------------------------------------------------------------------*/ - -G_DEFINE_TYPE (ClassyTest, classy_test, G_TYPE_OBJECT) - -static void -classy_test_finalize (GObject *obj) -{ - ClassyTest *test = CLASSY_TEST(obj); - - g_free(test->name); - if (test->failm) { - g_free(test->failm); - test->failm = NULL; - } - G_OBJECT_CLASS (classy_test_parent_class)->finalize (obj); -} - -static void -classy_test_class_init (ClassyTestClass *klass) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - - gobject_class->finalize = classy_test_finalize; - - klass->report = classy_test_report; - klass->run = classy_test_run; - - /*Signals*/ - klass->finished = g_signal_newv("finished", - TYPE_CLASSY_TEST, - G_SIGNAL_RUN_LAST | G_SIGNAL_NO_HOOKS, - NULL, - NULL, - NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, - 0, - NULL); -} - -static void -classy_test_init (ClassyTest *test) -{ - test->failm = NULL; - test->tstate = CLASSY_TEST_NOT_STARTED; -} - -/*---------------------------------------------------------------------------*/ - -ClassyTest * -classy_test_new(gchar *name, - void (*entry) (ClassyTest*, gpointer data), - gint istate, - gpointer data) -{ - ClassyTest *test; - - test = g_object_new(TYPE_CLASSY_TEST, NULL); - - test->name = g_strdup(name); - test->entry = entry; - test->data = data; - - return test; -} - -/*---------------------------------------------------------------------------*/ - -void -classy_test_pass(ClassyTest *test) -{ - test->tstate = CLASSY_TEST_WIN; - g_signal_emit (test, CLASSY_TEST_CLASS(test)->finished, 0, NULL); -} - -/*---------------------------------------------------------------------------*/ - -void -classy_test_fail(ClassyTest *test, gchar *fmt, ...) -{ - va_list args; - - va_start(args, fmt); - test->failm = g_strdup_vprintf(fmt, args); - va_end(args); - test->tstate = CLASSY_TEST_FAIL; - g_signal_emit (test, CLASSY_TEST_CLASS(test)->finished, 0, NULL); -} - -/*---------------------------------------------------------------------------*/ - -gint -classy_test_state(ClassyTest *test) -{ - return test->tstate; -} - -/*---------------------------------------------------------------------------*/ diff --git a/tests/cspi/classy-test.h b/tests/cspi/classy-test.h deleted file mode 100644 index 68e59e1..0000000 --- a/tests/cspi/classy-test.h +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Classy Test - Terrible framework for testing asyncronous interface - * - * Copyright (C) 2008 Codethink Ltd - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#ifndef CLASSY_TEST_H -#define CLASSY_TEST_H - -#include - -G_BEGIN_DECLS - -GType classy_test_get_type(void); - -#define TYPE_CLASSY_TEST (classy_test_get_type()) - -#define CLASSY_TEST(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj), \ - TYPE_CLASSY_TEST, \ - ClassyTest)) - -#define CLASSY_TEST_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass), \ - TYPE_CLASSY_TEST, \ - ClassyTestClass)) - -#define IS_CLASSY_TEST(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj), \ - TYPE_CLASSY_TEST)) - -#define IS_CLASSY_TEST_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass), \ - TYPE_CLASSY_TEST)) - -#define CLASSY_TEST_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), \ - TYPE_CLASSY_TEST, \ - ClassyTestClass)) - -typedef struct _ClassyTest ClassyTest; -typedef struct _ClassyTestClass ClassyTestClass; - -enum { - CLASSY_TEST_NOT_STARTED, - CLASSY_TEST_IN_PROGRESS, - CLASSY_TEST_FAIL, - CLASSY_TEST_WIN -}; - -struct _ClassyTest { - GObject parent; - - gchar *name; - gchar *failm; - gint tstate; - - void (*entry) (ClassyTest *tc, gpointer data); - - gpointer data; -}; - -struct _ClassyTestClass { - GObjectClass parent; - - /*Virtuals*/ - gchar *(*report) (ClassyTest *test); - void (*run) (ClassyTest *test); - - /*Signals*/ - gint finished; -}; - -ClassyTest * -classy_test_new(gchar *name, - void (*entry) (ClassyTest*, gpointer data), - gint istate, - gpointer data); - -void -classy_test_pass(ClassyTest *test); - -void -classy_test_fail(ClassyTest *test, gchar *fmt, ...); - -gint -classy_test_state(ClassyTest *test); - -G_END_DECLS -#endif /* CLASSY_TEST_H */ diff --git a/tests/cspi/key-listener-test.c b/tests/cspi/key-listener-test.c deleted file mode 100644 index b212a21..0000000 --- a/tests/cspi/key-listener-test.c +++ /dev/null @@ -1,201 +0,0 @@ -/* - * AT-SPI - Assistive Technology Service Provider Interface - * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) - * - * Copyright 2001, 2002 Sun Microsystems Inc., - * Copyright 2001, 2002 Ximian, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include -#include -#include -#include -#include -#include -#include "../../cspi/spi.h" - -static SPIBoolean report_command_key_event (const AccessibleKeystroke *stroke, void *user_data); -static SPIBoolean report_ordinary_key_event (const AccessibleKeystroke *stroke, void *user_data); -static SPIBoolean report_synchronous_key_event (const AccessibleKeystroke *stroke, void *user_data); -static SPIBoolean report_tab_key_event (const AccessibleKeystroke *stroke, void *user_data); -static SPIBoolean report_all_key_event (const AccessibleKeystroke *stroke, void *user_data); - -static AccessibleKeystrokeListener *command_key_listener; -static AccessibleKeystrokeListener *ordinary_key_listener; -static AccessibleKeystrokeListener *synchronous_key_listener; -static AccessibleKeystrokeListener *tab_key_listener; -static AccessibleKeystrokeListener *all_key_listener; -static AccessibleKeySet *command_keyset; -static AccessibleKeySet *async_keyset; -static AccessibleKeySet *sync_keyset; -static AccessibleKeySet *tab_keyset; - -int -main (int argc, char **argv) -{ - const char *tab_strings[1] = {"Tab"}; - short keycodes[] = {65, 64, 23}; - SPIBoolean retval = FALSE; - - SPI_init (); - - /* prepare the keyboard snoopers */ - command_key_listener = SPI_createAccessibleKeystrokeListener (report_command_key_event, NULL); - ordinary_key_listener = SPI_createAccessibleKeystrokeListener (report_ordinary_key_event, NULL); - synchronous_key_listener = SPI_createAccessibleKeystrokeListener (report_synchronous_key_event, NULL); - tab_key_listener = SPI_createAccessibleKeystrokeListener (report_tab_key_event, NULL); - all_key_listener = SPI_createAccessibleKeystrokeListener (report_all_key_event, NULL); - - command_keyset = SPI_createAccessibleKeySet (1, "q", NULL, NULL); - async_keyset = SPI_createAccessibleKeySet (3, NULL, keycodes, NULL); - sync_keyset = SPI_createAccessibleKeySet (3, "def", NULL, NULL); - tab_keyset = SPI_createAccessibleKeySet (1, NULL, NULL, tab_strings); - retval = SPI_registerAccessibleKeystrokeListener(command_key_listener, - command_keyset, - SPI_KEYMASK_ALT | SPI_KEYMASK_CONTROL, - (unsigned long) ( SPI_KEY_PRESSED ), - SPI_KEYLISTENER_ALL_WINDOWS); - fprintf (stderr, "Command key registry: result %s\n", retval ? "succeeded" : - "failed"); - retval = SPI_registerAccessibleKeystrokeListener(ordinary_key_listener, - async_keyset, - SPI_KEYMASK_UNMODIFIED, - (unsigned long) ( SPI_KEY_PRESSED | SPI_KEY_RELEASED ), - SPI_KEYLISTENER_NOSYNC); - - retval = SPI_registerAccessibleKeystrokeListener(synchronous_key_listener, - sync_keyset, - SPI_KEYMASK_UNMODIFIED, - (unsigned long) ( SPI_KEY_PRESSED | SPI_KEY_RELEASED ), - SPI_KEYLISTENER_CANCONSUME); - - retval = SPI_registerAccessibleKeystrokeListener(tab_key_listener, - tab_keyset, - SPI_KEYMASK_ALT, - (unsigned long) ( SPI_KEY_PRESSED | SPI_KEY_RELEASED ), - SPI_KEYLISTENER_ALL_WINDOWS); - fprintf (stderr, "tab listener registry: %s\n", retval ? "succeeded" : "failed"); - - retval = SPI_registerAccessibleKeystrokeListener(all_key_listener, - SPI_KEYSET_ALL_KEYS, - SPI_KEYMASK_CONTROL | SPI_KEYMASK_SHIFT, - (unsigned long) ( SPI_KEY_PRESSED | SPI_KEY_RELEASED ), - SPI_KEYLISTENER_ALL_WINDOWS); - - fprintf (stderr, "all key registry: %s\n", retval ? "succeeded" : "failed" ); - - SPI_registerAccessibleKeystrokeListener(all_key_listener, - SPI_KEYSET_ALL_KEYS, - SPI_KEYMASK_SHIFT, - (unsigned long) ( SPI_KEY_PRESSED ), - SPI_KEYLISTENER_NOSYNC | SPI_KEYLISTENER_CANCONSUME); - - SPI_event_main (); - - putenv ("AT_BRIDGE_SHUTDOWN=1"); - - return SPI_exit (); -} - -static void -simple_at_exit (void) -{ - SPI_deregisterAccessibleKeystrokeListener (command_key_listener, SPI_KEYMASK_ALT | SPI_KEYMASK_CONTROL); - AccessibleKeystrokeListener_unref (command_key_listener); - SPI_freeAccessibleKeySet (command_keyset); - -/* - SPI_deregisterAccessibleKeystrokeListener (ordinary_key_listener, SPI_KEYMASK_ALT | SPI_KEYMASK_CONTROL); */ - AccessibleKeystrokeListener_unref (ordinary_key_listener); - SPI_freeAccessibleKeySet (async_keyset); - -/* SPI_deregisterAccessibleKeystrokeListener (synchronous_key_listener, SPI_KEYMASK_ALT | SPI_KEYMASK_CONTROL); */ - AccessibleKeystrokeListener_unref (synchronous_key_listener); - SPI_freeAccessibleKeySet (sync_keyset); - - SPI_deregisterAccessibleKeystrokeListener (tab_key_listener, SPI_KEYMASK_ALT | SPI_KEYMASK_CONTROL); - AccessibleKeystrokeListener_unref (tab_key_listener); - SPI_freeAccessibleKeySet (tab_keyset); - - SPI_event_quit (); -} - -static SPIBoolean -is_command_key (const AccessibleKeystroke *key) -{ - switch (key->keyID) - { - case 'Q': - case 'q': - simple_at_exit(); - return TRUE; /* not reached */ - default: - return FALSE; - } -} - -static void -print_key_event (const AccessibleKeystroke *key, char *prefix) -{ - fprintf (stderr, "%s KeyEvent %s%c (keycode %d); string=%s; time=%lx\n", - prefix, - (key->modifiers & SPI_KEYMASK_ALT)?"Alt-":"", - ((key->modifiers & SPI_KEYMASK_SHIFT)^(key->modifiers & SPI_KEYMASK_SHIFTLOCK))? - (char) toupper((int) key->keyID) : (char) tolower((int) key->keyID), - (int) key->keycode, - key->keystring, - (long int) key->timestamp); -} - -static SPIBoolean -report_command_key_event (const AccessibleKeystroke *key, void *user_data) -{ - print_key_event (key, "command"); - return is_command_key (key); -} - -static SPIBoolean -report_ordinary_key_event (const AccessibleKeystroke *key, void *user_data) -{ - print_key_event (key, "ordinary"); - return FALSE; -} - -static SPIBoolean -report_synchronous_key_event (const AccessibleKeystroke *key, void *user_data) -{ - /* consume 'd' key, let others pass through */ - print_key_event (key, "synchronous (consumable) "); - return ( key->keyID == 'd' ) ? TRUE : FALSE; -} - -static SPIBoolean -report_tab_key_event (const AccessibleKeystroke *key, void *user_data) -{ - print_key_event (key, "[TAB]"); - return FALSE; -} - -static SPIBoolean -report_all_key_event (const AccessibleKeystroke *key, void *user_data) -{ - fprintf(stderr, "(%ld)", key->keyID); - return FALSE; -} - diff --git a/tests/cspi/keysynth-test.c b/tests/cspi/keysynth-test.c deleted file mode 100644 index 73aa240..0000000 --- a/tests/cspi/keysynth-test.c +++ /dev/null @@ -1,65 +0,0 @@ -/* - * AT-SPI - Assistive Technology Service Provider Interface - * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) - * - * Copyright 2001, 2002 Sun Microsystems Inc., - * Copyright 2001, 2002 Ximian, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include -#include "../../cspi/spi-private.h" /* A hack for now */ -#include -#include -#include -#include -#include "common/spi-dbus.h" - -typedef struct { - long int val; - char *string; - AccessibleKeySynthType type; -} TextTest; - -static TextTest text[] = { - {65, NULL, SPI_KEY_PRESSRELEASE}, - {64, NULL, SPI_KEY_SYM}, - {0, "--hello!", SPI_KEY_STRING}, - {0, "StudlyCaps!", SPI_KEY_STRING} -}; - -static void -test_key_synthesis (void) -{ - int i; - for (i = 0; i < G_N_ELEMENTS (text); ++i) { - SPI_generateKeyboardEvent (text[i].val, text[i].string, text[i].type); - } -} - -int -main (int argc, char **argv) -{ - gtk_init (&argc, &argv); - SPI_init (); - - test_key_synthesis (); - - return SPI_exit (); -} - diff --git a/tests/cspi/simple-at.c b/tests/cspi/simple-at.c deleted file mode 100644 index 23cb0ec..0000000 --- a/tests/cspi/simple-at.c +++ /dev/null @@ -1,615 +0,0 @@ -/* - * AT-SPI - Assistive Technology Service Provider Interface - * (Gnome Accessibility Project; http://developer.gnome.org/projects/gap) - * - * Copyright 2001, 2002 Sun Microsystems Inc., - * Copyright 2001, 2002 Ximian, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ -#include -#include -#include -#include -#include -#include -#include -#include -#undef MAGNIFIER_ENABLED -#include "../../cspi/spi-private.h" /* A hack for now */ - -#define PRINT_TREE - -static void report_focus_event (const AccessibleEvent *event, void *user_data); -static void report_generic_event (const AccessibleEvent *event, void *user_data); -static void report_window_event (const AccessibleEvent *event, void *user_data); -static void report_text_event (const AccessibleEvent *event, void *user_data); -static void report_button_press (const AccessibleEvent *event, void *user_data); -static void check_property_change (const AccessibleEvent *event, void *user_data); -static SPIBoolean report_command_key_event (const AccessibleKeystroke *stroke, void *user_data); -static SPIBoolean report_ordinary_key_event (const AccessibleKeystroke *stroke, void *user_data); -static void get_environment_vars (void); - -static int _festival_init (void); -static void _festival_say (const char *text, const char *voice, SPIBoolean shutup); -static void _festival_write (const char *buff, int fd); - -#ifdef PRINT_TREE -static void print_accessible_tree (Accessible *accessible, char *prefix); -#endif - -#ifdef MAGNIFIER_ENABLED -static SPIBoolean use_magnifier = FALSE; -#endif - -static SPIBoolean use_festival = FALSE; -static SPIBoolean festival_chatty = FALSE; -static SPIBoolean name_changed = FALSE; - -static AccessibleEventListener *focus_listener; -static AccessibleEventListener *property_listener; -static AccessibleEventListener *generic_listener; -static AccessibleEventListener *window_listener; -static AccessibleEventListener *button_listener; -static AccessibleEventListener *text_listener; -static AccessibleKeystrokeListener *command_key_listener; -static AccessibleKeystrokeListener *ordinary_key_listener; -static AccessibleKeySet *command_keyset; - -int -main (int argc, char **argv) -{ - int i, j; - int n_desktops; - int n_apps; - char *s; - Accessible *desktop; - Accessible *application; - const char *modules; - - if ((argc > 1) && (!strncmp (argv[1], "-h", 2))) - { - printf ("Usage: simple-at\n"); - printf ("\tEnvironment variables used:\n\t\tFESTIVAL\n\t\tMAGNIFIER\n\t\tFESTIVAL_CHATTY\n"); - exit (0); - } - - modules = g_getenv ("GTK_MODULES"); - if (!modules || modules [0] == '\0') - { - putenv ("GTK_MODULES="); - } - modules = NULL; - - SPI_init (); - - focus_listener = SPI_createAccessibleEventListener (report_focus_event, NULL); - property_listener = SPI_createAccessibleEventListener (check_property_change, NULL); - generic_listener = SPI_createAccessibleEventListener (report_generic_event, NULL); - window_listener = SPI_createAccessibleEventListener (report_window_event, NULL); - text_listener = SPI_createAccessibleEventListener (report_text_event, NULL); - button_listener = SPI_createAccessibleEventListener (report_button_press, NULL); - SPI_registerGlobalEventListener (focus_listener, "focus:"); - SPI_registerGlobalEventListener (property_listener, "object:property-change"); -/* :accessible-selection"); */ - SPI_registerGlobalEventListener (property_listener, "object:property-change:accessible-name"); - SPI_registerGlobalEventListener (generic_listener, "object:selection-changed"); - SPI_registerGlobalEventListener (generic_listener, "object:children-changed"); - SPI_registerGlobalEventListener (generic_listener, "object:visible-data-changed"); - SPI_registerGlobalEventListener (generic_listener, "object:text-selection-changed"); - SPI_registerGlobalEventListener (text_listener, "object:text-caret-moved"); - SPI_registerGlobalEventListener (text_listener, "object:text-changed"); - SPI_registerGlobalEventListener (button_listener, "Gtk:GtkWidget:button-press-event"); - SPI_registerGlobalEventListener (window_listener, "window:minimize"); - SPI_registerGlobalEventListener (window_listener, "window:activate"); - n_desktops = SPI_getDesktopCount (); - - for (i=0; i 0) - { - AccessibleText_getCharacterExtents (text, 0, &x0, &y0, &w0, &h0, - SPI_COORD_TYPE_SCREEN); - AccessibleText_getCharacterExtents (text, nchars-1, &xN, &yN, &wN, &hN, - SPI_COORD_TYPE_SCREEN); - x = MIN (x0, xN); - width = MAX (x0 + w0, xN + wN) - x; - fprintf (stderr, "Text bounding box: (%ld, %ld) ; (%ld, %ld)\n", - x, y, x+width, y+height); - } - } -#ifdef MAGNIFIER_ENABLED - if (use_magnifier) { - magnifier_set_roi ((short) 0, x, y, width, height); - } -#endif - } - - - if (Accessible_isValue (obj)) - { - AccessibleValue *value = Accessible_getValue (obj); - fprintf (stderr, "Current value = %f, min = %f; max = %f\n", - AccessibleValue_getCurrentValue (value), - AccessibleValue_getMinimumValue (value), - AccessibleValue_getMaximumValue (value)); - } - /* if this is a text object, speak the first sentence. */ - - if (Accessible_isText(obj)) - - { - AccessibleText *text_interface; - long start_offset, end_offset; - char *first_sentence = "empty"; - text_interface = Accessible_getText (obj); - first_sentence = AccessibleText_getTextAtOffset ( - text_interface, (long) 0, SPI_TEXT_BOUNDARY_SENTENCE_START, &start_offset, &end_offset); - if (first_sentence && use_festival) - { - _festival_say(first_sentence, "voice_don_diphone", FALSE); - SPI_freeString (first_sentence); - } - len = AccessibleText_getCharacterCount (text_interface); - s = AccessibleText_getText (text_interface, 0, len); - fprintf (stderr, "done reporting on focussed object, text=%s\n", s); - } -} - -void -report_focus_event (const AccessibleEvent *event, void *user_data) -{ - char *s; - - g_return_if_fail (event->source != NULL); - s = Accessible_getName (event->source); - if (s) - { - fprintf (stderr, "%s event from %s\n", event->type, s); - SPI_freeString (s); - report_focussed_accessible (event->source, TRUE); - } - Accessible_getParent (event->source); - name_changed = FALSE; -} - -void -report_generic_event (const AccessibleEvent *event, void *user_data) -{ - fprintf (stderr, "%s event received\n", event->type); -} - -void -report_window_event (const AccessibleEvent *event, void *user_data) -{ - fprintf (stderr, "%s event received\n", event->type); - if (!strcmp (event->type, "window:activate")) - { - print_accessible_tree (event->source, "window"); - } -} - -void -report_text_event (const AccessibleEvent *event, void *user_data) -{ - AccessibleText *text = Accessible_getText (event->source); - fprintf (stderr, "%s event received\n", event->type); -#ifdef MAGNIFIER_ENABLED - if (use_magnifier && strcmp (event->type, "object:text-changed")) - { - long offset = AccessibleText_getCaretOffset (text); - long x, y, w, h; - fprintf (stderr, "offset %d\n", (int) offset); - AccessibleText_getCharacterExtents (text, offset, &x, &y, &w, &h, - SPI_COORD_TYPE_SCREEN); - fprintf (stderr, "new roi %d %d %d %d\n", (int) x, (int) y, (int) w, (int) h); - magnifier_set_roi ((short) 0, x, y, w, h); - } -#endif - if (!strcmp (event->type, "object:text-changed")) - { - long start, end; - char *new_text = AccessibleText_getTextAtOffset (text, (long) event->detail1, SPI_TEXT_BOUNDARY_WORD_START, &start, &end); - _festival_say (new_text, "voice_kal_diphone", FALSE); - fprintf (stderr, "text changed: %s", new_text ? new_text : ""); - SPI_freeString (new_text); - } - else - { - long start, end; - char *word_text = AccessibleText_getTextAtOffset (text, (long) event->detail1, SPI_TEXT_BOUNDARY_WORD_START, &start, &end); - char *sentence_text = AccessibleText_getTextAtOffset (text, (long) event->detail1, SPI_TEXT_BOUNDARY_SENTENCE_START, &start, &end); - fprintf (stderr, "text changed: word %s; sentence %s at %ld", - (word_text ? word_text : ""), - (sentence_text ? sentence_text : ""), - event->detail1); - if (word_text) SPI_freeString (word_text); - if (sentence_text) SPI_freeString (sentence_text); - } -} - -void -report_button_press (const AccessibleEvent *event, void *user_data) -{ - char *s; - - g_return_if_fail (event->source != NULL); - - s = Accessible_getName (event->source); - - fprintf (stderr, "%s event from %s\n", event->type, s); - SPI_freeString (s); - s = Accessible_getDescription (event->source); - fprintf (stderr, "Object description %s\n", s); - SPI_freeString (s); -} - -void -check_property_change (const AccessibleEvent *event, void *user_data) -{ - AccessibleSelection *selection = Accessible_getSelection (event->source); - int n_selections; - int i; - char *s; - fprintf (stderr, "property change event!\n"); - if (selection) - { - n_selections = (int) AccessibleSelection_getNSelectedChildren (selection); - s = Accessible_getName (event->source); - fprintf (stderr, "(Property) %s event from %s, %d selected children\n", - event->type, s, n_selections); - SPI_freeString (s); - /* for now, speak entire selection set */ - for (i=0; itype, "object:property-change:accessible-name")) - { - name_changed = TRUE; - report_focussed_accessible (event->source, TRUE); - } - else - { - fprintf (stderr, "Property change %s received\n", event->type); - } -} - -static void -simple_at_exit (void) -{ - SPI_deregisterGlobalEventListenerAll (focus_listener); - AccessibleEventListener_unref (focus_listener); - - SPI_deregisterGlobalEventListenerAll (property_listener); - AccessibleEventListener_unref (property_listener); - - SPI_deregisterGlobalEventListenerAll (generic_listener); - AccessibleEventListener_unref (generic_listener); - - SPI_deregisterGlobalEventListenerAll (text_listener); - AccessibleEventListener_unref (text_listener); - - SPI_deregisterGlobalEventListenerAll (button_listener); - AccessibleEventListener_unref (button_listener); - - SPI_deregisterAccessibleKeystrokeListener (command_key_listener, SPI_KEYMASK_ALT | SPI_KEYMASK_CONTROL); - AccessibleKeystrokeListener_unref (command_key_listener); - SPI_freeAccessibleKeySet (command_keyset); - - SPI_deregisterAccessibleKeystrokeListener (ordinary_key_listener, SPI_KEYMASK_SHIFTLOCK); - AccessibleKeystrokeListener_unref (ordinary_key_listener); - - SPI_event_quit (); -} - -static SPIBoolean -is_command_key (const AccessibleKeystroke *key) -{ - switch (key->keyID) - { - case 'Q': - case 'q': - simple_at_exit(); - return TRUE; /* not reached */ -#ifdef MAGNIFIER_ENABLED - case 'M': - case 'm': - use_magnifier = ! use_magnifier; - fprintf (stderr, "%ssing magnifier\n", use_magnifier ? "U" : "Not u"); - return TRUE; -#endif - case 'F': - case 'f': - use_festival = ! use_festival; - fprintf (stderr, "%speech output\n", use_festival ? "S" : "No s"); - return TRUE; - default: - return FALSE; - } -} - -static SPIBoolean -report_command_key_event (const AccessibleKeystroke *key, void *user_data) -{ - fprintf (stderr, "Command KeyEvent %s%c (keycode %d); string=%s; time=%lx\n", - (key->modifiers & SPI_KEYMASK_ALT)?"Alt-":"", - ((key->modifiers & SPI_KEYMASK_SHIFT)^(key->modifiers & SPI_KEYMASK_SHIFTLOCK))? - (char) toupper((int) key->keyID) : (char) tolower((int) key->keyID), - (int) key->keycode, - key->keystring, - (long int) key->timestamp); - return is_command_key (key); -} - - -static SPIBoolean -report_ordinary_key_event (const AccessibleKeystroke *key, void *user_data) -{ - fprintf (stderr, "Received key event:\tsym %ld\n\tmods %x\n\tcode %d\n\tstring=\'%s\'\n\ttime %lx\n", - (long) key->keyID, - (unsigned int) key->modifiers, - (int) key->keycode, - key->keystring, - (long int) key->timestamp); - return FALSE; -} - -static int -_festival_init (void) -{ - int fd; - struct sockaddr_in name; - int tries = 2; - - name.sin_family = AF_INET; - name.sin_port = htons (1314); - name.sin_addr.s_addr = htonl(INADDR_ANY); - fd = socket (PF_INET, SOCK_STREAM, 0); - - while (connect(fd, (struct sockaddr *) &name, sizeof (name)) < 0) { - if (!tries--) { - perror ("connect"); - return -1; - } - } - - _festival_write ("(audio_mode'async)\n", fd); - _festival_write ("(Parameter.set 'Duration_Model 'Tree_ZScore)\n", fd); - _festival_write ("(Parameter.set 'Duration_Stretch 0.75)\n", fd); - return fd; -} - -static void -_festival_say (const char *text, const char *voice, SPIBoolean shutup) -{ - static int fd = 0; - gchar *quoted; - gchar *p; - gchar prefix[50]; - static gchar voice_spec[32]; - - if (!fd) - { - fd = _festival_init (); - } - - fprintf (stderr, "saying text: %s\n", text); - - quoted = g_malloc(64+strlen(text)*2); - - sprintf (prefix, "(SayText \""); - - strncpy(quoted, prefix, 10); - p = quoted+strlen(prefix); - while (*text) { - if ( *text == '\\' || *text == '"' ) - *p = '\\'; - *p++ = *text++; - } - *p++ = '"'; - *p++ = ')'; - *p++ = '\n'; - *p = 0; - - if (shutup) _festival_write ("(audio_mode'shutup)\n", fd); - if (voice && (strncmp (voice, (char *) (voice_spec+1), strlen(voice)))) - { - snprintf (voice_spec, 32, "(%s)\n", voice); - _festival_write (voice_spec, fd); - _festival_write ("(Parameter.set 'Duration_Model 'Tree_ZScore)\n", fd); - _festival_write ("(Parameter.set 'Duration_Stretch 0.75)\n", fd); - } - - _festival_write (quoted, fd); - - g_free(quoted); -} - -static void -_festival_write (const gchar *command_string, int fd) -{ - fprintf(stderr, command_string); - if (fd < 0) { - perror("socket"); - return; - } - write(fd, command_string, strlen(command_string)); -} - diff --git a/tests/cspi/simple-test.c b/tests/cspi/simple-test.c deleted file mode 100644 index 21c74a6..0000000 --- a/tests/cspi/simple-test.c +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2008 Codethink Ltd. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#include -#include - -#include - -int -main (int argc, char **argv) -{ - gint i; - gint n_desktops; - gchar *s; - - SPI_init (); - - n_desktops = SPI_getDesktopCount (); - - for (i=0; i -#include -#include -#include -#include -#include -#include - -#include "dbus/dbus.h" - -/* Known bugs */ -#define WHOLE_STRING -1 - -static void validate_accessible (Accessible *accessible, - gboolean has_parent, - gboolean recurse_down); - -#define WINDOW_MAGIC 0x123456a -#define TEST_STRING_A "A test string" -#define TEST_STRING_A_OBJECT "A_test_string_object" -#define TEST_STRING_B "Another test string" - -static int print_tree_depth = 0; -static gboolean print_tree = FALSE; -static gboolean do_poke = FALSE; -static gboolean key_press_received = FALSE; -static gboolean key_release_received = FALSE; - -typedef struct { - gulong magic; - GtkWidget *window; -} TestWindow; - -static gboolean -focus_me (GtkWidget *widget) -{ - AtkObject *aobject = atk_implementor_ref_accessible ( - ATK_IMPLEMENTOR (widget)); - - /* Force a focus event - even if the WM focused - * us before our at-bridge's idle handler registered - * our interest */ - if (!GTK_WIDGET_HAS_FOCUS (widget)) - gtk_widget_grab_focus (widget); -/* else: FIXME - gtk_widget_grab_focus should send a notify */ - atk_focus_tracker_notify (aobject); - - g_object_unref (G_OBJECT (aobject)); - - return FALSE; -} - -static void -test_window_add_and_show (GtkContainer *container, GtkWidget *widget) -{ - gtk_container_add (container, widget); - gtk_widget_show (widget); -} - -static GtkWidget * -create_tree (void) -{ - GtkWidget *widget; - GtkTreeIter iter; - GtkListStore *store; - GtkTreeViewColumn *column; - - store = gtk_list_store_new (1, G_TYPE_STRING); - gtk_list_store_append (store, &iter); - gtk_list_store_set (store, &iter, 0, TEST_STRING_A, -1); - column = gtk_tree_view_column_new_with_attributes ("String", - gtk_cell_renderer_text_new (), "text", 0, NULL); - widget = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store)); - g_object_unref (G_OBJECT (store)); - gtk_tree_view_append_column (GTK_TREE_VIEW (widget), column); - - return widget; -} - -static TestWindow * -create_test_window (void) -{ - TestWindow *win = g_new0 (TestWindow, 1); - GtkWidget *widget, *vbox; - AtkObject *obj; - - win->magic = WINDOW_MAGIC; - win->window = gtk_window_new (GTK_WINDOW_TOPLEVEL); - - gtk_widget_show (win->window); - - vbox = gtk_vbox_new (0, 0); - gtk_container_add (GTK_CONTAINER (win->window), vbox); - gtk_widget_show (vbox); - - widget = gtk_entry_new (); - gtk_entry_set_text (GTK_ENTRY (widget), TEST_STRING_A); - obj = gtk_widget_get_accessible (widget); - atk_object_set_name (obj, TEST_STRING_A_OBJECT); - - test_window_add_and_show (GTK_CONTAINER (vbox), widget); - - widget = gtk_button_new_with_label ("_Foobar"); - test_window_add_and_show (GTK_CONTAINER (vbox), widget); - - widget = gtk_hseparator_new (); - test_window_add_and_show (GTK_CONTAINER (vbox), widget); - - widget = gtk_image_new_from_stock (GTK_STOCK_DIALOG_QUESTION, - GTK_ICON_SIZE_LARGE_TOOLBAR); - test_window_add_and_show (GTK_CONTAINER (vbox), widget); - - widget = g_object_new (GTK_TYPE_HSCALE, NULL); - gtk_range_set_range (GTK_RANGE (widget), 0.0, 100.0); - test_window_add_and_show (GTK_CONTAINER (vbox), widget); - - widget = create_tree (); - test_window_add_and_show (GTK_CONTAINER (vbox), widget); - - g_idle_add ((GSourceFunc) focus_me, win->window); - - return win; -} - -static void -test_window_destroy (TestWindow *win) -{ - gtk_widget_destroy (win->window); - g_free (win); -} - -static void -test_roles (void) -{ - int i; - - fprintf (stderr, "Testing roles...\n"); - for (i = -1; i < 1000; i++) - g_assert (AccessibleRole_getName (i) != NULL); - - g_assert (!strcmp (AccessibleRole_getName (SPI_ROLE_FILE_CHOOSER), "file-chooser")); - g_assert (!strcmp (AccessibleRole_getName (SPI_ROLE_RADIO_BUTTON), "radio-button")); - g_assert (!strcmp (AccessibleRole_getName (SPI_ROLE_TABLE), "table")); - g_assert (!strcmp (AccessibleRole_getName (SPI_ROLE_WINDOW), "window")); -} - -static void -test_action (AccessibleAction *action) -{ - gint n_actions, i; - gchar *s, *sd; - g_assert ((n_actions = AccessibleAction_getNActions (action)) >= 0); - - fprintf (stderr, "Testing actions..."); - for (i = 0; i < n_actions; ++i) - { - s = AccessibleAction_getName (action, i); - g_assert (s); - sd = AccessibleAction_getDescription (action, i); - g_assert (sd); - fprintf (stderr, "%d: %s (%s); ", i, s, sd); - SPI_freeString (s); - SPI_freeString (sd); - g_assert (AccessibleAction_doAction (action, i)); - } - fprintf (stderr, "\n"); -} - -static void -test_desktop (void) -{ - Accessible *desktop; - Accessible *application; - Accessible **list; - - fprintf (stderr, "Testing desktop...\n"); - - g_assert (SPI_getDesktop (-1) == NULL); - desktop = SPI_getDesktop (0); - g_assert (desktop != NULL); - - g_assert ((SPI_getDesktopList (&list)) > 0); - g_assert (list[0] == desktop); - SPI_freeDesktopList (list); - - validate_accessible (desktop, FALSE, FALSE); - - application = Accessible_getChildAtIndex (desktop, 0); - g_assert (application != NULL); - AccessibleApplication_unref (application); - - Accessible_unref (desktop); -} - -static void -test_application (Accessible *application) -{ - char *str; - - fprintf (stderr, "Testing application ...\n"); - g_assert (Accessible_isApplication (application)); - g_assert (Accessible_getApplication (application) == - application); - AccessibleApplication_unref (application); - - str = AccessibleApplication_getToolkitName (application); - g_assert (str != NULL); - g_assert (!strcmp (str, "GAIL")); - SPI_freeString (str); - - str = AccessibleApplication_getLocale (application, LC_MESSAGES); - g_assert (!strcmp (str, setlocale (LC_MESSAGES, NULL))); - SPI_freeString (str); - - str = AccessibleApplication_getVersion (application); - g_assert (str != NULL); - SPI_freeString (str); - - AccessibleApplication_getID (application); -} - -static void -test_editable_text (AccessibleEditableText *etext) -{ - char *str; - AccessibleText *text; - - fprintf (stderr, "Testing editable text ...\n"); - - g_assert (Accessible_isText (etext)); - text = Accessible_getText (etext); - - AccessibleEditableText_setTextContents ( - etext, TEST_STRING_B); - - str = AccessibleText_getText (text, 0, WHOLE_STRING); - g_assert (!strcmp (str, TEST_STRING_B)); - - SPI_freeString (str); - - /* FIXME: lots more editing here */ - - AccessibleEditableText_setTextContents ( - etext, TEST_STRING_A); - - AccessibleText_unref (text); -} - -static void -test_table (AccessibleTable *table) -{ - Accessible *header; - gint index; - gint rows, columns; - - fprintf (stderr, "Testing table ...\n"); - - rows = AccessibleTable_getNRows (table); - g_assert (rows > 0); - - columns = AccessibleTable_getNColumns (table); - g_assert (columns > 0); - - index = AccessibleTable_getIndexAt (table, rows - 1, columns - 1); - - g_assert (AccessibleTable_getRowAtIndex (table, index) == rows - 1); - - g_assert (AccessibleTable_getColumnAtIndex (table, index) == columns - 1); - - g_assert ((header = AccessibleTable_getColumnHeader (table, 0))); - Accessible_unref (header); - - AccessibleTable_isSelected (table, 0, 0); - - /* FIXME: lots more tests */ -} - -static void -test_text (AccessibleText *text) -{ - char *str; - - fprintf (stderr, "Testing text ...\n"); - - g_assert (AccessibleText_getCharacterCount (text) == - strlen (TEST_STRING_A)); - - str = AccessibleText_getText (text, 0, WHOLE_STRING); - g_assert (!strcmp (str, TEST_STRING_A)); - SPI_freeString (str); - - str = AccessibleText_getText (text, 0, 5); - g_assert (!strncmp (str, TEST_STRING_A, 5)); - SPI_freeString (str); - - AccessibleText_setCaretOffset (text, 7); - g_assert (AccessibleText_getCaretOffset (text) == 7); - - /* FIXME: lots more tests - selections etc. etc. */ -} - -static void -test_value (AccessibleValue *value) -{ - float original_value; - - fprintf (stderr, "Testing value ...\n"); - - original_value = AccessibleValue_getCurrentValue (value); - - g_assert (AccessibleValue_getCurrentValue (value) <= - AccessibleValue_getMaximumValue (value)); - - g_assert (AccessibleValue_getCurrentValue (value) >= - AccessibleValue_getMinimumValue (value)); - - AccessibleValue_setCurrentValue (value, - AccessibleValue_getMinimumValue (value)); - - g_assert (AccessibleValue_getCurrentValue (value) == - AccessibleValue_getMinimumValue (value)); - - AccessibleValue_setCurrentValue (value, - AccessibleValue_getMaximumValue (value)); - - g_assert (AccessibleValue_getCurrentValue (value) == - AccessibleValue_getMaximumValue (value)); - - AccessibleValue_setCurrentValue (value, original_value); - - g_assert (AccessibleValue_getCurrentValue (value) == original_value); -} - -static void -test_component (AccessibleComponent *component) -{ - long x, y, width, height; - - fprintf (stderr, "Testing component...\n"); - - AccessibleComponent_getExtents ( - component, &x, &y, &width, &height, SPI_COORD_TYPE_SCREEN); - - AccessibleComponent_getPosition ( - component, &x, &y, SPI_COORD_TYPE_SCREEN); - - AccessibleComponent_getSize (component, &width, &height); - - if (width > 0 && height > 0) { -#ifdef FIXME - Accessible *accessible, *componentb; -#endif - - g_assert (AccessibleComponent_contains ( - component, x, y, SPI_COORD_TYPE_SCREEN)); - - g_assert (AccessibleComponent_contains ( - component, x + width - 1, y, SPI_COORD_TYPE_SCREEN)); - - g_assert (AccessibleComponent_contains ( - component, x + width - 1, y + height - 1, - SPI_COORD_TYPE_SCREEN)); - -#ifdef FIXME - accessible = AccessibleComponent_getAccessibleAtPoint ( - component, x, y, SPI_COORD_TYPE_SCREEN); - - g_assert (Accessible_isComponent (accessible)); - componentb = Accessible_getComponent (accessible); - g_assert (componentb == component); - - AccessibleComponent_unref (componentb); - Accessible_unref (accessible); -#endif - } - - AccessibleComponent_getLayer (component); - AccessibleComponent_getMDIZOrder (component); -/* AccessibleComponent_grabFocus (component); */ -} - -static void -test_image (AccessibleImage *image) -{ - char *desc; - long int x = -1, y = -1, width = -1, height = -1; - - desc = AccessibleImage_getImageDescription (image); - g_assert (desc != NULL); - SPI_freeString (desc); - - AccessibleImage_getImagePosition (image, &x, &y, - SPI_COORD_TYPE_SCREEN); - AccessibleImage_getImageSize (image, &width, &height); - AccessibleImage_getImageExtents (image, &x, &y, &width, &height, - SPI_COORD_TYPE_WINDOW); -} - -static void -validate_tree (Accessible *accessible, - gboolean has_parent, - gboolean recurse_down) -{ - Accessible *parent; - long len, i; - - parent = Accessible_getParent (accessible); - if (has_parent) { - long index; - Accessible *child_at_index; - - g_assert (parent != NULL); - - index = Accessible_getIndexInParent (accessible); - g_assert (index >= 0); - - child_at_index = Accessible_getChildAtIndex (parent, index); - - g_assert (child_at_index == accessible); - - Accessible_unref (child_at_index); - Accessible_unref (parent); - } - - len = Accessible_getChildCount (accessible); - print_tree_depth++; - for (i = 0; i < len; i++) { - Accessible *child; - - child = Accessible_getChildAtIndex (accessible, i); -#ifdef ROPEY - if (!child) - fprintf (stderr, "Unusual - ChildGone at %ld\n", i); - - g_assert (Accessible_getIndexInParent (child) == i); - g_assert (Accessible_getParent (child) == accessible); -#endif - - if (recurse_down && child) - validate_accessible (child, has_parent, recurse_down); - - Accessible_unref (child); - } - print_tree_depth--; -} - -static void -validate_accessible (Accessible *accessible, - gboolean has_parent, - gboolean recurse_down) -{ - Accessible *tmp; - char *name, *descr; - AccessibleRole role; - AccessibleRelation **relations; - char *role_name; - GString *item_str = g_string_new (""); - int i; - - name = Accessible_getName (accessible); - g_assert (name != NULL); - - descr = Accessible_getDescription (accessible); - g_assert (descr != NULL); - - role = Accessible_getRole (accessible); - g_assert (role != SPI_ROLE_INVALID); - role_name = Accessible_getRoleName (accessible); - g_assert (role_name != NULL); - - relations = Accessible_getRelationSet (accessible); - g_assert (relations != NULL); - - for (i = 0; relations [i]; i++) { - AccessibleRelationType type; - int targets; - - fprintf (stderr, "relation %d\n", i); - - type = AccessibleRelation_getRelationType (relations [i]); - g_assert (type != SPI_RELATION_NULL); - - targets = AccessibleRelation_getNTargets (relations [i]); - g_assert (targets != -1); - - AccessibleRelation_unref (relations [i]); - relations [i] = NULL; - } - free (relations); - - if (print_tree) { - int i; - - for (i = 0; i < print_tree_depth; i++) - fputc (' ', stderr); - fputs ("|-> [ ", stderr); - } - - if (Accessible_isAction (accessible)) { - tmp = Accessible_getAction (accessible); - g_assert (tmp != NULL); - if (print_tree) - fprintf (stderr, "At"); - else - test_action (tmp); - AccessibleAction_unref (tmp); - } - - if (Accessible_isApplication (accessible)) { - tmp = Accessible_getApplication (accessible); - if (print_tree) - fprintf (stderr, "Ap"); - else - test_application (tmp); - AccessibleApplication_unref (tmp); - } - - if (Accessible_isComponent (accessible)) { - tmp = Accessible_getComponent (accessible); - g_assert (tmp != NULL); - if (print_tree) - fprintf (stderr, "Co"); - else - test_component (tmp); - AccessibleComponent_unref (tmp); - } - - if (Accessible_isEditableText (accessible)) { - tmp = Accessible_getEditableText (accessible); - g_assert (tmp != NULL); - if (print_tree) - fprintf (stderr, "Et"); - else - test_editable_text (tmp); - AccessibleEditableText_unref (tmp); - } - - if (Accessible_isHypertext (accessible)) { - tmp = Accessible_getHypertext (accessible); - g_assert (tmp != NULL); - if (print_tree) - fprintf (stderr, "Ht"); - AccessibleHypertext_unref (tmp); - } - - if (Accessible_isImage (accessible)) { - tmp = Accessible_getImage (accessible); - g_assert (tmp != NULL); - if (print_tree) { - char *desc; - - fprintf (stderr, "Im"); - - desc = AccessibleImage_getImageDescription (tmp); - g_string_append_printf ( - item_str, " image descr: '%s'", desc); - SPI_freeString (desc); - } else - test_image (tmp); - - AccessibleImage_unref (tmp); - } - - if (Accessible_isSelection (accessible)) { - tmp = Accessible_getSelection (accessible); - g_assert (tmp != NULL); - if (print_tree) - fprintf (stderr, "Se"); - AccessibleSelection_unref (tmp); - } - - if (Accessible_isTable (accessible)) { - tmp = Accessible_getTable (accessible); - g_assert (tmp != NULL); - if (print_tree) - fprintf (stderr, "Ta"); - else - test_table (tmp); - AccessibleTable_unref (tmp); - } - - if (Accessible_isText (accessible)) { - tmp = Accessible_getText (accessible); - g_assert (tmp != NULL); - if (print_tree) - fprintf (stderr, "Te"); - else { - if (strcmp (name, TEST_STRING_A_OBJECT) == 0) - test_text (tmp); - } - AccessibleText_unref (tmp); - } - - if (Accessible_isValue (accessible)) { - tmp = Accessible_getValue (accessible); - g_assert (tmp != NULL); - if (print_tree) - fprintf (stderr, "Va"); - else - test_value (tmp); - AccessibleValue_unref (tmp); - } - - if (print_tree) - fprintf (stderr, " ] '%s' (%s) - %s: %s\n", - name, descr, role_name, item_str->str); - - SPI_freeString (name); - SPI_freeString (descr); - SPI_freeString (role_name); - g_string_free (item_str, TRUE); - - validate_tree (accessible, has_parent, recurse_down); -} - -static void -test_misc (void) -{ - fprintf (stderr, "Testing misc bits ...\n"); - - g_assert (!Accessible_isComponent (NULL)); - g_assert (Accessible_getComponent (NULL) == NULL); - SPI_freeString (NULL); -} - -static void -global_listener_cb (const AccessibleEvent *event, - void *user_data) -{ - TestWindow *win = user_data; - Accessible *desktop; - AccessibleApplication *application; - - g_assert (win->magic == WINDOW_MAGIC); - g_assert (!strcmp (event->type, "focus:")); - - fprintf (stderr, "Fielded focus event ...\n"); - - if (!do_poke) { - desktop = SPI_getDesktop (0); - application = Accessible_getChildAtIndex (desktop, 0); - g_assert (application != NULL); - Accessible_unref (desktop); - - test_application (application); - - AccessibleApplication_unref (application); - - print_tree = FALSE; - - validate_accessible (event->source, TRUE, TRUE); - - fprintf (stderr, "quitting mainloop.\n"); - gtk_main_quit (); - } - - print_tree = TRUE; - validate_accessible (event->source, TRUE, TRUE); -} - -static SPIBoolean -key_listener_cb (const AccessibleKeystroke *stroke, - void *user_data) -{ - AccessibleKeystroke *s = user_data; - - *s = *stroke; - if (stroke->keystring) s->keystring = g_strdup (stroke->keystring); - - if (s->type == SPI_KEY_PRESSED) - key_press_received = TRUE; - else if (s->type == SPI_KEY_RELEASED) - key_release_received = TRUE; - - return TRUE; -} - - -static void -test_keylisteners (void) -{ - int i; - AccessibleKeystroke stroke; - AccessibleKeystrokeListener *key_listener; - AccessibleKeySet *test_keyset; - - fprintf (stderr, "Testing keyboard listeners ...\n"); - - key_listener = SPI_createAccessibleKeystrokeListener ( - key_listener_cb, &stroke); - - test_keyset = SPI_createAccessibleKeySet (1, "=", NULL, NULL); - - g_assert (SPI_registerAccessibleKeystrokeListener ( - key_listener, - test_keyset, - 0, - SPI_KEY_PRESSED | SPI_KEY_RELEASED, - SPI_KEYLISTENER_CANCONSUME | SPI_KEYLISTENER_ALL_WINDOWS)); - - for (i = 0; i < 3; i++) { - memset (&stroke, 0, sizeof (AccessibleKeystroke)); - g_assert (SPI_generateKeyboardEvent ('=', NULL, SPI_KEY_SYM)); - while (!(key_press_received)) - g_main_context_iteration (NULL, TRUE); - fprintf (stderr, "p [%s]", stroke.keystring); - g_assert (!strcmp (stroke.keystring, "=")); - while (!(key_release_received)) - g_main_context_iteration (NULL, TRUE); - fprintf (stderr, "r [%s]", stroke.keystring); - key_press_received = FALSE; - key_release_received = FALSE; - } - g_assert (SPI_deregisterAccessibleKeystrokeListener (key_listener, 0)); - SPI_freeAccessibleKeySet (test_keyset); - - fprintf (stderr, "\n"); - - AccessibleKeystrokeListener_unref (key_listener); - - g_assert (SPI_generateMouseEvent (100, 100, "rel")); - g_assert (SPI_generateMouseEvent (-50, -50, "rel")); - g_assert (SPI_generateMouseEvent (-50, -50, "rel")); - g_assert (SPI_generateMouseEvent (-1, -1, "b1c")); -} - -int -main (int argc, char **argv) -{ - int leaked, i; - TestWindow *win; - const char *modules; - AccessibleEventListener *global_listener; - - modules = g_getenv ("GTK_MODULES"); - if (!modules || modules [0] == '\0') - putenv ("GTK_MODULES=gail:atk-bridge"); - modules = NULL; - - for (i = 1; i < argc; i++) { - if (!g_strcasecmp (argv [i], "--poke")) - do_poke = TRUE; - } - - gtk_init (&argc, &argv); - - g_assert (!SPI_init ()); - g_assert (SPI_init ()); - g_assert (SPI_getDesktopCount () == 1); - - test_roles (); - test_misc (); - test_desktop (); - test_keylisteners (); - - win = create_test_window (); - - global_listener = SPI_createAccessibleEventListener (global_listener_cb, win); - - g_assert (SPI_registerGlobalEventListener (global_listener, "focus:")); - - fprintf (stderr, "Waiting for focus event ...\n"); - gtk_main (); - - g_assert (SPI_deregisterGlobalEventListenerAll (global_listener)); - AccessibleEventListener_unref (global_listener); - - test_window_destroy (win); - - /* Wait for any pending events from the registry */ - g_usleep (500*1000); - for (i = 0; i < 100; i++) - dbus_connection_read_write_dispatch (SPI_bus(), 5); - - if ((leaked = SPI_exit ())) - g_error ("Leaked %d SPI handles", leaked); - - g_assert (!SPI_exit ()); - - fprintf (stderr, "All tests passed\n"); - - if (g_getenv ("_MEMPROF_SOCKET")) { - fprintf (stderr, "Waiting for memprof\n"); - gtk_main (); - } - - putenv ("AT_BRIDGE_SHUTDOWN=1"); - - return 0; -} diff --git a/tests/data/Makefile.am b/tests/data/Makefile.am deleted file mode 100644 index b06736b..0000000 --- a/tests/data/Makefile.am +++ /dev/null @@ -1,3 +0,0 @@ -EXTRA_DIST = \ - accessible-test.xml\ - accessible-test-results.xml diff --git a/tests/data/accessible-test-results.xml b/tests/data/accessible-test-results.xml deleted file mode 100644 index a522187..0000000 --- a/tests/data/accessible-test-results.xml +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/data/accessible-test.xml b/tests/data/accessible-test.xml deleted file mode 100644 index c881873..0000000 --- a/tests/data/accessible-test.xml +++ /dev/null @@ -1,136 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tests/dummyatk/Makefile.am b/tests/dummyatk/Makefile.am deleted file mode 100644 index 2e93052..0000000 --- a/tests/dummyatk/Makefile.am +++ /dev/null @@ -1,38 +0,0 @@ -check_LTLIBRARIES = libdummyatk.la - -libdummyatk_la_CFLAGS = $(ATK_CFLAGS) \ - -I$(top_srcdir) - -libdummyatk_la_LDFLAGS = -no-undefined \ - -module \ - -avoid-version - -libdummyatk_la_LIBADD = $(ATK_LIBS) - -libdummyatk_la_SOURCES = my-atk-action.c \ - my-atk-action.h \ - my-atk-component.c \ - my-atk-component.h \ - my-atk-hyperlink.c \ - my-atk-hyperlink.h \ - my-atk-hypertext.c \ - my-atk-hypertext.h \ - my-atk-object.c \ - my-atk-object.h \ - my-atk-selection.c \ - my-atk-selection.h \ - my-atk-streamable-content.c \ - my-atk-streamable-content.h \ - my-atk-table.c \ - my-atk-table.h \ - my-atk-text.c \ - my-atk-text.h \ - my-atk-value.c \ - my-atk-value.h \ - my-atk.h \ - resources_storage.c \ - resources_storage.h \ - useful_functions.c \ - useful_functions.h \ - user_marshal.c \ - user_marshal.h diff --git a/tests/dummyatk/my-atk-action.c b/tests/dummyatk/my-atk-action.c deleted file mode 100644 index 363356a..0000000 --- a/tests/dummyatk/my-atk-action.c +++ /dev/null @@ -1,222 +0,0 @@ -#include -#include -#include - -#include "my-atk-object.h" -#include "my-atk-action.h" - -static GObjectClass *parent_class = NULL; -//implementaion of the interface -static gboolean my_atk_action_do_action(AtkAction *action, gint i) -{ - MyAtkAction *self = (MyAtkAction*)action; - gboolean result = (i>=0) && (i < self->n); - self->last_performed_action = result? i : -1; - return result; -} -static gint my_atk_action_get_n_actions(AtkAction *action) -{ - MyAtkAction *self = (MyAtkAction*)action; - return self->n; -} -static const gchar* my_atk_action_get_description(AtkAction *action, gint i) -{ - MyAtkAction *self = (MyAtkAction*)action; - if((i>=0) && (in)) - { - return self->actions[i].description; - } - else - { - printf("get_description: Wrong index.\n"); - return NULL; - } -} -static const gchar* my_atk_action_get_name(AtkAction *action, gint i) -{ - MyAtkAction *self = (MyAtkAction*)action; - if((i >= 0) && (i < self->n)) - { - return self->actions[i].name; - } - else - { - printf("get_name: Wrong index.\n"); - return NULL; - } -} -static const gchar* my_atk_action_get_localized_name(AtkAction *action, gint i) -{ - return my_atk_action_get_name(action,i); -} - -static const gchar* my_atk_action_get_keybinding(AtkAction *action, gint i) -{ - MyAtkAction *self = (MyAtkAction*)action; - if((i >= 0) && (i < self->n)) - { - gchar* keyb = self->actions[i].keybinding; - if(keyb == NULL || keybinding_note_define == NULL) - { - //anywhere(if action has keybinding or not) NULL will return - return NULL; - } - else - { - //verify, if string mean "no keybinding" - return strcmp(keyb, keybinding_note_define) != 0 ? keyb : NULL; - } - } - else - { - printf("get_keybinding: Wrong index.\n"); - return NULL; - } -} -static gboolean my_atk_action_set_description(AtkAction *action, gint i, const gchar *desc) -{ - MyAtkAction *self = (MyAtkAction*)action; - - if(!((i >= 0) && (i < self->n)) ) - { - //index out of range, but this is not application error according documentation - return FALSE; - } - //index in correct range - if(self->actions[i].description == desc) - { - //self assignment - return immediately - return TRUE; - } - if(self->actions[i].description != NULL) - { - //free old value of description if it is not NULL - free(self->actions[i].description); - } - if(desc != NULL) - { - //dump new value of description if it is not NULL - self->actions[i].description = (gchar*)strdup((const char*)desc); - } - return TRUE; -} -////////// -static void my_atk_action_instance_init(GTypeInstance *instance, gpointer g_class) -{ - int i; - MyAtkAction *self = (MyAtkAction*)instance; - self->n = DEFAULT_NUMBER_ACTIONS; - self->actions = g_new(struct OneAction, self->n); - if(self->actions == NULL) - { - self->n = 0; - return; - } - //init fields of action 0 with values which differ from others actions - self->actions[0].name = (gchar*)strdup(FIRST_ACTION_NAME); - self->actions[0].description = (gchar*)strdup(FIRST_ACTION_DESCRIPTION); - self->actions[0].keybinding = (gchar*)strdup(FIRST_ACTION_KEYBINDING); - - for(i = 1; i < self->n; i++) - { - self->actions[i].name = (gchar*)strdup(DEFAULT_ACTION_NAME); - self->actions[i].description = (gchar*)strdup(DEFAULT_ACTION_DESCRIPTION); - self->actions[i].keybinding = g_strdup_printf("%d", i); - } - self->disposed = FALSE; - self->last_performed_action = -1; -} - -static void -my_atk_action_interface_init(gpointer g_iface, gpointer iface_data) -{ - AtkActionIface *klass = (AtkActionIface *)g_iface; - - klass->do_action = my_atk_action_do_action; - klass->get_n_actions = my_atk_action_get_n_actions; - klass->get_description = my_atk_action_get_description; - klass->get_name = my_atk_action_get_name; - klass->get_localized_name = my_atk_action_get_localized_name; - klass->get_keybinding = my_atk_action_get_keybinding; - klass->set_description = my_atk_action_set_description; -} - -static void -my_atk_action_dispose(GObject *obj) -{ - MyAtkAction *self = (MyAtkAction*)obj; - - if(self->disposed) - { - return; - } - self->disposed = TRUE; - - G_OBJECT_CLASS(parent_class)->dispose(obj); -} - -static void -my_atk_action_finalize(GObject *obj) -{ - MyAtkAction *self = (MyAtkAction*)obj; - int i; - - for(i = 0; i < self->n; i++) - { - struct OneAction oneAction = self->actions[i]; - if(oneAction.name != NULL) - free(oneAction.name); - if(oneAction.description != NULL) - free(oneAction.description); - if(oneAction.keybinding != NULL) - free(oneAction.keybinding); - } - if(self->actions != NULL) - g_free(self->actions); - - G_OBJECT_CLASS(parent_class)->finalize(obj); -} -static void -my_atk_action_class_init (gpointer g_class, gpointer g_class_data) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS(g_class); - MyAtkActionClass *klass = MY_ATK_ACTION_CLASS (g_class); - - gobject_class->dispose = my_atk_action_dispose; - gobject_class->finalize = my_atk_action_finalize; - - parent_class = g_type_class_peek_parent(klass); -} -GType my_atk_action_get_type(void) -{ - static GType type = 0; - if(type == 0) - { - static const GTypeInfo info = - { - sizeof (MyAtkActionClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - my_atk_action_class_init, /* class_init */ - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (MyAtkAction), - 0, /* n_preallocs */ - my_atk_action_instance_init /* instance_init */ - }; - - static const GInterfaceInfo iface_info = - { - (GInterfaceInitFunc) my_atk_action_interface_init, /* interface_init */ - NULL, /* interface_finalize */ - NULL /* interface_data */ - }; - type = g_type_register_static (MY_TYPE_ATK_OBJECT, - "MyAtkAction", - &info, 0); - g_type_add_interface_static (type, - ATK_TYPE_ACTION, - &iface_info); - } - return type; -} diff --git a/tests/dummyatk/my-atk-action.h b/tests/dummyatk/my-atk-action.h deleted file mode 100644 index f33e75d..0000000 --- a/tests/dummyatk/my-atk-action.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef MY_ATK_ACTION_H -#define MY_ATK_ACTION_H -//Object, which implement interface AtkAction(all functions) -#include -#include -#include - -#include "my-atk-object.h" - -//declarations -#define MY_TYPE_ATK_ACTION (my_atk_action_get_type ()) -#define MY_ATK_ACTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_ACTION, MyAtkAction)) -#define MY_ATK_ACTION_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_ACTION, MyAtkActionClass)) -#define MY_IS_ATK_ACTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_ACTION)) -#define MY_IS_ATK_ACTION_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_ACTION)) -#define MY_ATK_ACTION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_ACTION, MyAtkActionClass)) - -static const gchar* keybinding_note_define = "none"; - -#define FIRST_ACTION_NAME "First action" -#define FIRST_ACTION_DESCRIPTION "First action performed" -#define FIRST_ACTION_KEYBINDING "0" - -#define DEFAULT_NUMBER_ACTIONS 10 -#define DEFAULT_ACTION_NAME "Action" -#define DEFAULT_ACTION_DESCRIPTION "Description of action" -#define DEFAULT_ACTION_KEYBINDING keybinding_note_define - - -//for external using -#define LAST_PERFORMED_ACTION(myAtkAction) (MY_ATK_ACTION(myAtkAction)->last_performed_action) -#define CLEAR_LAST_PERFOMED_ACTION(myAtkAction) (MY_ATK_ACTION(myAtkAction)->last_performed_action = -1 - -typedef struct _MyAtkAction MyAtkAction; -typedef struct _MyAtkActionClass MyAtkActionClass; - -struct _MyAtkAction -{ - MyAtkObject parent; - - gboolean disposed; - struct OneAction - { - gchar *name; - gchar *description; - gchar *keybinding; - }*actions; - gint n; - gint last_performed_action;//this field is changed when perfoms action -}; - -struct _MyAtkActionClass -{ - MyAtkObjectClass parent; -}; -GType my_atk_action_get_type(void); - -#endif /*MY_ATK_ACTION_H*/ diff --git a/tests/dummyatk/my-atk-component.c b/tests/dummyatk/my-atk-component.c deleted file mode 100644 index e304c7d..0000000 --- a/tests/dummyatk/my-atk-component.c +++ /dev/null @@ -1,403 +0,0 @@ -#include -#include -#include - -#include "my-atk-object.h" -#include "my-atk-component.h" - -//*************************implementation*********************** -static MyAtkObjectClass *component_parent_class = NULL; -//current focus object -static AtkComponent* focus_object = NULL; - -static guint focus_signal_id = 0; -/* - * Because of implementation of AtkUtils, we need to ensure that list of focus_trackers - * is not empty. Otherwise function atk_focus_tracker_notify will not change focus. - */ -static guint focus_tracker_id = 0; -static void my_event_listener(AtkObject* obj) -{ - //simply exist for register as focus_tracker -} -/* - * If this flag is TRUE, then focus cannot be changed until someone clears the flag - * via my_atk_component_set_modal(FALSE). - */ -static gboolean is_modal = FALSE; -//for debug -void print_extent(AtkRectangle *extent) -{ - printf("{%d,%d,%d,%d}", extent->x, extent->y, extent->width, extent->height); -} -//for internal use -static void emit_bounds_changed(MyAtkComponent *component) -{ - static guint bounds_changed_id = 0; - if(bounds_changed_id == 0) - { - bounds_changed_id = g_signal_lookup("bounds-changed", ATK_TYPE_COMPONENT); - } - AtkRectangle *param = g_boxed_copy(ATK_TYPE_RECTANGLE, &(component->extent)); - g_signal_emit(component, bounds_changed_id, 0, param); -} -static void change_focus(AtkComponent* component, gboolean is_gain) -{ - const gchar* state_name = atk_state_type_get_name(ATK_STATE_FOCUSED); - - g_signal_emit_by_name(component, "focus-event", is_gain); - g_signal_emit_by_name(component, "state-change::focused", - state_name, is_gain); - - AtkObject* parent = atk_object_get_parent((AtkObject*)component); - if(parent != NULL) - { - AtkStateSet* stateSet = atk_object_ref_state_set(parent); - if(atk_state_set_contains_state(stateSet, ATK_STATE_MANAGES_DESCENDANTS)) - g_signal_emit_by_name(parent, "active-descendant-changed", - atk_get_focus_object()); - g_object_unref(stateSet); - } -} -//implementation of virtual functions -//******************ref_state_set(AtkObject)***************************** -static AtkStateSet* my_atk_component_ref_state_set(AtkObject *object) -{ - MyAtkComponent *self = (MyAtkComponent*)object; - - AtkStateSet* result = ((AtkObjectClass*)component_parent_class)-> - ref_state_set(object); - if(self->is_manage_descendants) - atk_state_set_add_state(result, ATK_STATE_MANAGES_DESCENDANTS); - return result; -} -//******************get_size******************* -static void my_atk_component_get_size(AtkComponent *component, gint *width, gint *height) -{ - g_return_if_fail(MY_IS_ATK_COMPONENT(component)); - - MyAtkComponent *self = MY_ATK_COMPONENT(component); - *width = self->extent.width; - *height = self->extent.height; -} -//*********************get_position******************* -static void my_atk_component_get_position(AtkComponent *component, gint *x, gint *y, AtkCoordType coord_type) -{ - g_return_if_fail(MY_IS_ATK_COMPONENT(component)); - - MyAtkComponent *self = MY_ATK_COMPONENT(component); - *x = self->extent.x; - *y = self->extent.y; - -//**********************get_extents******************* -} -static void my_atk_component_get_extents(AtkComponent *component, gint *x, gint *y, - gint *width, gint *height, AtkCoordType coord_type) -{ - g_return_if_fail(MY_IS_ATK_COMPONENT(component)); - - MyAtkComponent *self = MY_ATK_COMPONENT(component); - *x = self->extent.x; - *y = self->extent.y; - *width = self->extent.width; - *height = self->extent.height; -} - -//**************************set_size******************* -static gboolean my_atk_component_set_size(AtkComponent *component, gint width, gint height) -{ - g_return_val_if_fail(MY_IS_ATK_COMPONENT(component), FALSE); - - MyAtkComponent *self = MY_ATK_COMPONENT(component); - if(self->is_extent_may_changed) - { - self->extent.width = width; - self->extent.height = height; - - emit_bounds_changed(self); - - return TRUE; - } - return FALSE; -} -//**************************set_position******************** -static gboolean my_atk_component_set_position(AtkComponent *component, - gint x, gint y, AtkCoordType coord_type) -{ - g_return_val_if_fail(MY_IS_ATK_COMPONENT(component), FALSE); - - MyAtkComponent *self = MY_ATK_COMPONENT(component); - if(self->is_extent_may_changed) - { - self->extent.x = x; - self->extent.y = y; - - emit_bounds_changed(self); - - return TRUE; - } - return FALSE; -} -//*************************************set_extents*************** -static gboolean my_atk_component_set_extents(AtkComponent *component, - gint x, gint y, gint width, gint height, AtkCoordType coord_type) -{ - g_return_val_if_fail(MY_IS_ATK_COMPONENT(component), FALSE); - - MyAtkComponent *self = MY_ATK_COMPONENT(component); - - if(self->is_extent_may_changed) - { - self->extent.x = x; - self->extent.y = y; - self->extent.width = width; - self->extent.height = height; - - emit_bounds_changed(self); - - return TRUE; - } - return FALSE; -} -//**************************get_layer**************** -static AtkLayer my_atk_component_get_layer(AtkComponent *component) -{ - g_return_val_if_fail(MY_IS_ATK_COMPONENT(component), ATK_LAYER_INVALID); - - MyAtkComponent *self = MY_ATK_COMPONENT(component); - return self->layer; -} -//**************************get_mdi_zorder**************** -static gint my_atk_component_get_mdi_zorder(AtkComponent *component) -{ - g_return_val_if_fail(MY_IS_ATK_COMPONENT(component), G_MININT); - - MyAtkComponent *self = MY_ATK_COMPONENT(component); - return self->zorder; -} -//***********************contains********************** -static gboolean my_atk_component_contains(AtkComponent *component, - gint x, gint y, AtkCoordType coord_type) -{ - g_return_val_if_fail(MY_IS_ATK_COMPONENT(component), FALSE); - //for extract extent - gint x_tmp, y_tmp, width_tmp, height_tmp; - my_atk_component_get_extents(component, &x_tmp, &y_tmp, &width_tmp, &height_tmp, coord_type); - - if( (x >= x_tmp) &&(y >= y_tmp) &&(x < x_tmp + width_tmp) && (y < y_tmp + height_tmp) ) - { - return TRUE; - } - else - { - return FALSE; - } -} -//**********************ref_accessible_at_point*********************** -/* - * Retuns accessible child that implements AtkCOmponent and contains the given point. - */ -static AtkObject* my_atk_component_ref_accessible_at_point(AtkComponent* component, - gint x, gint y, AtkCoordType coord_type) -{ - g_return_val_if_fail(MY_IS_ATK_COMPONENT(component), NULL); - gint i; - - gint n_children = atk_object_get_n_accessible_children((AtkObject*)component); - for(i = 0; i < n_children; i++) - { - AtkObject *child = atk_object_ref_accessible_child((AtkObject*)component, i); - if(ATK_IS_COMPONENT(child) - && atk_component_contains((AtkComponent*)child, x, y, coord_type)) - { - return child; - } - g_object_unref(child); - } - return NULL; -} -//*************************************grab_focus********************************* -static gboolean my_atk_component_grab_focus(AtkComponent* component) -{ - if(component == focus_object) - { - //Already has focus - return TRUE; - } - if(is_modal) - { - //cannot grab focus - return FALSE; - } - AtkComponent *focus_object_old = focus_object; - focus_object = component; - - atk_focus_tracker_notify((AtkObject*)component); - - if(focus_object_old != NULL) - { - //signals for object which lost focus - change_focus(focus_object_old, FALSE); - } - if(component != NULL) - { - //signals for object which grab focus - change_focus(component, TRUE); - } - return TRUE; -} -//***********************my_atk_component_add_focus_handler********************* -static guint my_atk_component_add_focus_handler(AtkComponent *component, AtkFocusHandler handler) -{ - g_return_val_if_fail(MY_IS_ATK_COMPONENT(component),0); - //verify whether handler already connect to object - gulong found_handler_id = g_signal_handler_find(component, - G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_FUNC, - focus_signal_id, - 0, - NULL, - (gpointer)handler, - NULL); - if(found_handler_id == 0) - { - //handler hasn't been connected yet - return g_signal_connect_closure_by_id(component, - focus_signal_id, - 0, - g_cclosure_new( (GCallback)handler, - NULL, - NULL), - FALSE); - } - else/* found_handler_id != 0*/ - { - //handler has already been connected - return 0; - } - -} -//***********************my_atk_component_remove_focus_handler********************* -static void my_atk_component_remove_focus_handler(AtkComponent *component, guint handler_id) -{ - g_signal_handler_disconnect(component, handler_id); -} -//***********************my_atk_component_set_modal(my function)*************** -void my_atk_component_set_modal(gboolean value) -{ - is_modal = value; -} -//******************my_atk_component_set_manage_descendants(my_function)******* -void my_atk_component_set_manage_descendants(MyAtkComponent* component, gboolean value) -{ - if(component->is_manage_descendants == value)return; - component->is_manage_descendants = value; - g_signal_emit_by_name(component, "state-change::manages-descendants", - "manages-descendants", value); -} -//Others funtions -static void my_atk_component_instance_init(GTypeInstance *obj, gpointer g_class) -{ - MyAtkComponent *self = (MyAtkComponent*)obj; - //set defaults values - self->extent.x = 0; - self->extent.y = 0; - self->extent.width = 10; - self->extent.height = 10; - self->is_extent_may_changed = TRUE; - self->layer = ATK_LAYER_INVALID; - self->zorder = -2147; -} -static void my_atk_component_instance_finalize(GObject* obj) -{ - MyAtkComponent* component = (MyAtkComponent*)obj; - - if(((AtkObject*)component) == atk_get_focus_object()) - { - atk_focus_tracker_notify(NULL); - } -} - -static void my_atk_component_class_init(gpointer g_class, gpointer class_data) -{ - GObjectClass* g_object_class = (GObjectClass*)g_class; - AtkObjectClass* atkObject_class = (AtkObjectClass*)g_class; - //GObject virtual table - g_object_class->finalize = my_atk_component_instance_finalize; - //AtkObject virtual table - atkObject_class->ref_state_set = my_atk_component_ref_state_set; - //parent_class - component_parent_class = g_type_class_peek_parent(g_class); - //make focus_tracker's table not empty. - focus_tracker_id = atk_add_focus_tracker(my_event_listener); - //store "focus-event"-signal id - focus_signal_id = g_signal_lookup("focus-event",MY_TYPE_ATK_COMPONENT); -} -/* - * Though, according to the documentation, this function will never called for - * static-registred types. - * Base_init function doesn't suite for this work, - * because it will called in every derived classes. - */ -/*static void my_atk_component_class_finalize(gpointer g_class, gpointer class_data) -{ - - if(focus_tracker_id != 0) - { - atk_remove_focus_tracker(focus_tracker_id); - focus_tracker_id = 0; - } -}*/ -static void my_atk_component_interface_init(gpointer g_iface, gpointer iface_data) -{ - AtkComponentIface *klass = (AtkComponentIface*)g_iface; - - klass->get_extents = my_atk_component_get_extents; - klass->get_position = my_atk_component_get_position; - klass->get_size = my_atk_component_get_size; - - klass->set_extents = my_atk_component_set_extents; - klass->set_position = my_atk_component_set_position; - klass->set_size = my_atk_component_set_size; - - klass->contains = my_atk_component_contains; - klass->ref_accessible_at_point = my_atk_component_ref_accessible_at_point; - - klass->get_layer = my_atk_component_get_layer; - klass->get_mdi_zorder = my_atk_component_get_mdi_zorder; - - klass->grab_focus = my_atk_component_grab_focus; - klass->add_focus_handler = my_atk_component_add_focus_handler; - klass->remove_focus_handler = my_atk_component_remove_focus_handler; -} - -GType my_atk_component_get_type() -{ - static GType type = 0; - if(type == 0) - { - static const GTypeInfo typeInfo = - { - sizeof(MyAtkComponentClass), - NULL, //base_init - NULL, //base_finalize - my_atk_component_class_init, //class_init - NULL, //class_finalize - NULL, //class_data - sizeof(MyAtkComponent), - 0, //n_preallocs - my_atk_component_instance_init //instance_init - }; - - static const GInterfaceInfo iface_info = - { - my_atk_component_interface_init, /* interface_init*/ - NULL, /* interface_finalize*/ - NULL /* interface_data */ - }; - type = g_type_register_static(MY_TYPE_ATK_OBJECT, "MyAtkComponent", &typeInfo, 0); - g_type_add_interface_static(type, - ATK_TYPE_COMPONENT, - &iface_info); - } - return type; -} diff --git a/tests/dummyatk/my-atk-component.h b/tests/dummyatk/my-atk-component.h deleted file mode 100644 index 3fa5850..0000000 --- a/tests/dummyatk/my-atk-component.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef MY_ATK_COMPONENT_H -#define MY_ATK_COMPONENT_H -/* - * MyAtkComponent: derives AtkObject(with parent-child accessibilities) - * and implements AtkComponent. - */ -#include - -#include "my-atk-object.h" - -#define MY_TYPE_ATK_COMPONENT (my_atk_component_get_type ()) -#define MY_ATK_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_COMPONENT, MyAtkComponent)) -#define MY_ATK_COMPONENT_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_COMPONENT, MyAtkComponentClass)) -#define MY_IS_ATK_COMPONENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_COMPONENT)) -#define MY_IS_ATK_COMPONENT_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_COMPONENT)) -#define MY_ATK_COMPONENT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_COMPONENT, MyAtkComponentClass)) - -typedef struct _MyAtkComponent MyAtkComponent; -typedef struct _MyAtkComponentClass MyAtkComponentClass; - -struct _MyAtkComponent -{ - MyAtkObject parent; - //relative coordinates, which coincides with absolute ones - AtkRectangle extent; - //whether component may be relocated - gboolean is_extent_may_changed; - //for emit "active-descendant-changed" signal - gboolean is_manage_descendants; - // - AtkLayer layer; - gint zorder; -}; - -struct _MyAtkComponentClass -{ - MyAtkObjectClass parent; -}; - -GType my_atk_component_get_type(); -#endif /*MY_ATK_COMPONENT_H*/ diff --git a/tests/dummyatk/my-atk-hyperlink.c b/tests/dummyatk/my-atk-hyperlink.c deleted file mode 100644 index cb6b435..0000000 --- a/tests/dummyatk/my-atk-hyperlink.c +++ /dev/null @@ -1,137 +0,0 @@ -#include - -#include "my-atk-text.h" -#include "my-atk-hyperlink.h" -#include "resources_storage.h" - -//***************************implementation**************************************** -static MyAtkTextClass *parent_class_atk_hyperlink = NULL; - -// Implementation of virtual functions -//***************************my_atk_hyperlink_get_uri************** -gchar* my_atk_hyperlink_get_uri(AtkHyperlink* link_, gint index) -{ - MyAtkHyperlink* self = (MyAtkHyperlink*)link_; - - if(index < 0 || index >= self->number_of_anchors) return NULL; - return g_strdup(self->uri); -} -//**************************my_atk_hyperlink_is_valid************************** -gboolean my_atk_hyperlink_is_valid(AtkHyperlink* link_) -{ - MyAtkHyperlink* self = (MyAtkHyperlink*)link_; - - return (resource_storage_get(self->uri) != NULL); -} -//*************************my_atk_hyperlink_get_object************************ -AtkObject* my_atk_hyperlink_get_object(AtkHyperlink* link_, gint index) -{ - MyAtkHyperlink* self = (MyAtkHyperlink*)link_; - - if(index < 0 || index >= self->number_of_anchors) return NULL; - return resource_storage_get(self->uri); -} -//***************************my_atk_hyperlink_get_start_index************** -gint my_atk_hyperlink_get_start_index(AtkHyperlink* link_) -{ - MyAtkHyperlink* self = (MyAtkHyperlink*)link_; - - return self->start_index; -} -//***************************my_atk_hyperlink_get_end_index************** -gint my_atk_hyperlink_get_end_index(AtkHyperlink* link_) -{ - MyAtkHyperlink* self = (MyAtkHyperlink*)link_; - - return self->end_index; -} -//***************************my_atk_hyperlink_link_state******************* -guint my_atk_hyperlink_link_state(AtkHyperlink* link_) -{ - return 0; -} -//***************************my_atk_hyperlink_get_n_anchors******************* -gboolean my_atk_hyperlink_get_n_anchors(AtkHyperlink* link_) -{ - return ((MyAtkHyperlink*)link_)->number_of_anchors; -} -//***************************my_atk_hypertlink_is_selected_link*********** -gboolean my_atk_hyperlink_is_selected_link(AtkHyperlink* link_) -{ - MyAtkHyperlink* self = (MyAtkHyperlink*)link_; - - return self->is_selected; -} -//others functions -MyAtkHyperlink* my_atk_hyperlink_new(gint start_index, gint end_index,const gchar* uri) -{ - MyAtkHyperlink* result = g_object_new(MY_TYPE_ATK_HYPERLINK, NULL); - if(result == NULL) return NULL; - result->start_index = start_index; - result->end_index = end_index; - result->uri = g_strdup(uri); - result->number_of_anchors = 1; - return result; -} -void my_atk_hyperlink_activate(MyAtkHyperlink* hyperlink) -{ - g_signal_emit_by_name(hyperlink, "link-activated"); -} -//initialize/finalize functions -static void my_atk_hyperlink_instance_init(GTypeInstance *obj, gpointer g_class) -{ - MyAtkHyperlink *self = (MyAtkHyperlink*)obj; - - self->start_index = self->end_index = 0; - self->uri = NULL; - self->is_selected = FALSE; - self->number_of_anchors = 0; -} -static void my_atk_hyperlink_instance_finalize(GObject* obj) -{ - MyAtkHyperlink *self = (MyAtkHyperlink*)obj; - - g_free(self->uri); -} - -static void my_atk_hyperlink_class_init(gpointer g_class, gpointer class_data) -{ - GObjectClass* g_object_class = (GObjectClass*)g_class; - //GObject virtual table - g_object_class->finalize = my_atk_hyperlink_instance_finalize; - //parent_class - parent_class_atk_hyperlink = g_type_class_peek_parent(g_class); - // - AtkHyperlinkClass* atkHyperlinkClass = (AtkHyperlinkClass*)g_class; - - atkHyperlinkClass->get_uri = my_atk_hyperlink_get_uri; - atkHyperlinkClass->get_object = my_atk_hyperlink_get_object; - atkHyperlinkClass->get_start_index = my_atk_hyperlink_get_start_index; - atkHyperlinkClass->get_end_index = my_atk_hyperlink_get_end_index; - atkHyperlinkClass->is_valid = my_atk_hyperlink_is_valid; - atkHyperlinkClass->link_state = my_atk_hyperlink_link_state; - atkHyperlinkClass->get_n_anchors = my_atk_hyperlink_get_n_anchors; - atkHyperlinkClass->is_selected_link = my_atk_hyperlink_is_selected_link; -} - -GType my_atk_hyperlink_get_type() -{ - static GType type = 0; - if(type == 0) - { - static const GTypeInfo typeInfo = - { - sizeof(MyAtkHyperlinkClass), - NULL, //base_init - NULL, //base_finalize - my_atk_hyperlink_class_init, //class_init - NULL, //class_finalize - NULL, //class_data - sizeof(MyAtkHyperlink), - 0, //n_preallocs - my_atk_hyperlink_instance_init //instance_init - }; - type = g_type_register_static(ATK_TYPE_HYPERLINK, "MyAtkHyperlink", &typeInfo, 0); - } - return type; -} diff --git a/tests/dummyatk/my-atk-hyperlink.h b/tests/dummyatk/my-atk-hyperlink.h deleted file mode 100644 index 026ba54..0000000 --- a/tests/dummyatk/my-atk-hyperlink.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef MY_ATK_HYPERLINK_H -#define MY_ATK_HYPERLINK_H -/* - * MyAtkHyperlink: implements AtkHyperlink - */ -#include - -#define MY_TYPE_ATK_HYPERLINK (my_atk_hyperlink_get_type ()) -#define MY_ATK_HYPERLINK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_HYPERLINK, MyAtkHyperlink)) -#define MY_ATK_HYPERLINK_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_HYPERLINK, MyAtkHyperlinkClass)) -#define MY_IS_ATK_HYPERLINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_HYPERLINK)) -#define MY_IS_ATK_HYPERLINK_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_HYPERLINK)) -#define MY_ATK_HYPERLINK_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_HYPERLINK, MyAtkHyperlinkClass)) - -typedef struct _MyAtkHyperlink MyAtkHyperlink; -typedef struct _MyAtkHyperlinkClass MyAtkHyperlinkClass; - -struct _MyAtkHyperlink -{ - AtkHyperlink parent; - - gint start_index, end_index; - - gchar* uri; - gint number_of_anchors;//0 on "clear" hyperlink and 1 after set it - gboolean is_selected; -}; - -struct _MyAtkHyperlinkClass -{ - AtkHyperlinkClass parent; -}; - -GType my_atk_hyperlink_get_type(); -#endif /*MY_ATK_HYPERLINK_H*/ diff --git a/tests/dummyatk/my-atk-hypertext.c b/tests/dummyatk/my-atk-hypertext.c deleted file mode 100644 index 1bba620..0000000 --- a/tests/dummyatk/my-atk-hypertext.c +++ /dev/null @@ -1,172 +0,0 @@ -#include - -#include "my-atk-text.h" -#include "my-atk-hyperlink.h" -#include "my-atk-hypertext.h" - -//***************************implementation**************************************** -static MyAtkTextClass *parent_class_atk_text = NULL; - -typedef struct -{ - gint start_offset, end_offset; - gint index; -}HyperlinkRange; -// Implementation of virtual functions - -//***************************my_atk_hypertext_get_n_links************************* -gint my_atk_hypertext_get_n_links(AtkHypertext* hypertext) -{ - MyAtkHypertext* self = (MyAtkHypertext*)hypertext; - - return self->hyperlinks->len; -} -//***************************my_atk_hypertext_get_link*********************** -AtkHyperlink* my_atk_hypertext_get_link(AtkHypertext* hypertext, gint link_index) -{ - MyAtkHypertext* self = (MyAtkHypertext*)hypertext; - - if(link_index < 0 || link_index >= self->hyperlinks->len) - return NULL; - return g_ptr_array_index(self->hyperlinks, link_index); -} -//*************************my_atk_hypertext_get_link_index******************* -gint my_atk_hypertext_get_link_index(AtkHypertext* hypertext, gint char_index) -{ - gint i; - MyAtkHypertext* self = (MyAtkHypertext*)hypertext; - GArray* ranges = self->hyperlink_ranges; - for(i = ranges->len - 1; i >= 0; i--) - { - HyperlinkRange *range = &g_array_index(ranges, HyperlinkRange, i); - if(range->start_offset <= char_index) - { - if(range->end_offset > char_index)return range->index; - break; - } - } - return -1; -} -//others functions -gboolean my_atk_hypertext_add_hyperlink(MyAtkHypertext* hypertext, - gint start_index, gint end_index, const gchar* uri) -{ - MyAtkHyperlink* new_hyperlink; - GArray* ranges = hypertext->hyperlink_ranges; - gint i; - for(i = 0; i < ranges->len; i++) - { - HyperlinkRange *range = &g_array_index(ranges, HyperlinkRange, i); - if(range->end_offset <= start_index) continue; - if(range->start_offset < end_index) return FALSE; - break; - } - new_hyperlink = my_atk_hyperlink_new(start_index, end_index, uri); - g_ptr_array_add(hypertext->hyperlinks, new_hyperlink); - HyperlinkRange new_range; - new_range.start_offset = start_index; - new_range.end_offset = end_index; - new_range.index = hypertext->hyperlinks->len - 1; - g_array_insert_val(ranges, i, new_range); - return TRUE; -} -// -void my_atk_hypertext_select_link(MyAtkHypertext* hypertext, gint index) -{ - if(index < 0 || index >= my_atk_hypertext_get_n_links((AtkHypertext*)hypertext)) - return; - - if(hypertext->current_selected_link != -1) - { - MyAtkHyperlink *selected_link_old = - (MyAtkHyperlink*)my_atk_hypertext_get_link( - (AtkHypertext*)hypertext, hypertext->current_selected_link); - selected_link_old->is_selected = FALSE; - } - - hypertext->current_selected_link = index; - MyAtkHyperlink *selected_link_new = (MyAtkHyperlink*)my_atk_hypertext_get_link( - (AtkHypertext*)hypertext, hypertext->current_selected_link); - selected_link_new->is_selected = TRUE; - - g_signal_emit_by_name(hypertext, - "link-selected", hypertext->current_selected_link); -} -//initialize/finalize functions -static void my_atk_hypertext_instance_init(GTypeInstance *obj, gpointer g_class) -{ - MyAtkHypertext *self = (MyAtkHypertext*)obj; - - self->hyperlink_ranges = g_array_new(FALSE, FALSE, sizeof(HyperlinkRange)); - self->hyperlinks = g_ptr_array_new(); - - self->current_selected_link = -1; -} -static void my_atk_hypertext_instance_finalize(GObject* obj) -{ - MyAtkHypertext *self = (MyAtkHypertext*)obj; - - g_array_free(self->hyperlink_ranges, FALSE); - - g_ptr_array_foreach(self->hyperlinks,(GFunc)g_object_unref, NULL); - g_ptr_array_free(self->hyperlinks, FALSE); -} - -static void my_atk_hypertext_class_init(gpointer g_class, gpointer class_data) -{ - GObjectClass* g_object_class = (GObjectClass*)g_class; - //GObject virtual table - g_object_class->finalize = my_atk_hypertext_instance_finalize; - //parent_class - parent_class_atk_text = g_type_class_peek_parent(g_class); -} -static void my_atk_hypertext_interface_init(gpointer g_iface, gpointer iface_data) -{ - AtkHypertextIface *klass = (AtkHypertextIface*)g_iface; - - klass->get_link = my_atk_hypertext_get_link; - klass->get_n_links = my_atk_hypertext_get_n_links; - klass->get_link_index = my_atk_hypertext_get_link_index; -} - -GType my_atk_hypertext_get_type() -{ - static GType type = 0; - if(type == 0) - { - static const GTypeInfo typeInfo = - { - sizeof(MyAtkHypertextClass), - NULL, //base_init - NULL, //base_finalize - my_atk_hypertext_class_init, //class_init - NULL, //class_finalize - NULL, //class_data - sizeof(MyAtkHypertext), - 0, //n_preallocs - my_atk_hypertext_instance_init //instance_init - }; - - static const GInterfaceInfo AtkTextIface_info = - { - my_atk_text_interface_init, /* interface_init*/ - NULL, /* interface_finalize*/ - NULL /* interface_data */ - }; - static const GInterfaceInfo AtkHypertextIface_info = - { - my_atk_hypertext_interface_init,/* interface_init*/ - NULL, /* interface_finalize*/ - NULL /* interface_data */ - }; - type = g_type_register_static(MY_TYPE_ATK_TEXT, "MyAtkHypertext", &typeInfo, 0); - g_type_add_interface_static(type, - ATK_TYPE_TEXT, - &AtkTextIface_info); - - g_type_add_interface_static(type, - ATK_TYPE_HYPERTEXT, - &AtkHypertextIface_info); - } - return type; -} diff --git a/tests/dummyatk/my-atk-hypertext.h b/tests/dummyatk/my-atk-hypertext.h deleted file mode 100644 index 50d02cf..0000000 --- a/tests/dummyatk/my-atk-hypertext.h +++ /dev/null @@ -1,33 +0,0 @@ -#ifndef MY_ATK_HYPERTEXT_H -#define MY_ATK_HYPERTEXT_H -/* - * MyAtkHypertext: implements AtkHypertext - */ -#include -#include - -#define MY_TYPE_ATK_HYPERTEXT (my_atk_hypertext_get_type ()) -#define MY_ATK_HYPERTEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_HYPERTEXT, MyAtkHypertext)) -#define MY_ATK_HYPERTEXT_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_HYPERTEXT, MyAtkHypertextClass)) -#define MY_IS_ATK_HYPERTEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_HYPERTEXT)) -#define MY_IS_ATK_HYPERTEXT_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_HYPERTEXT)) -#define MY_ATK_HYPERTEXT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_HYPERTEXT, MyAtkHypertextClass)) - -typedef struct _MyAtkHypertext MyAtkHypertext; -typedef struct _MyAtkHypertextClass MyAtkHypertextClass; - -struct _MyAtkHypertext -{ - MyAtkText parent; - - GArray* hyperlink_ranges; - GPtrArray* hyperlinks; - - gint current_selected_link; -}; - -struct _MyAtkHypertextClass -{ - MyAtkTextClass parent; -}; -#endif /*MY_ATK_HYPERTEXT_H*/ diff --git a/tests/dummyatk/my-atk-object.c b/tests/dummyatk/my-atk-object.c deleted file mode 100644 index 4029424..0000000 --- a/tests/dummyatk/my-atk-object.c +++ /dev/null @@ -1,186 +0,0 @@ - -#include -#include - -#include "my-atk-object.h" - -static AtkObjectClass *atk_object_parent_class = NULL; - -void my_atk_object_add_child(MyAtkObject* parent, MyAtkObject* child) -{ - g_ptr_array_add(parent->children, child); - g_object_ref_sink(child); - - atk_object_set_parent(ATK_OBJECT(child), ATK_OBJECT(parent)); - - g_signal_emit_by_name(parent, "children-changed::add", - parent->children->len - 1, child); -} - -void my_atk_object_remove_child(MyAtkObject* parent, MyAtkObject* child) -{ - gint i; - for(i = parent->children->len - 1; i >= 0; i--) - { - if(g_ptr_array_index(parent->children, i) == child) break; - } - if(i < 0)return; - - g_ptr_array_remove_index(parent->children, i); - g_object_unref(child); - g_signal_emit_by_name(parent, "children-changed::remove", - i, child); -} - -static void my_atk_object_set_parent(AtkObject *accessible, AtkObject *parent) -{ - g_return_if_fail(parent != NULL); - - MyAtkObject *self = MY_ATK_OBJECT(accessible); - AtkObject *parent_old = (atk_object_get_parent(accessible)); - - if(parent_old == parent) - { - //nothing to do because parent does not change - return; - } - - //set field 'parent' in child using 'base-method' - atk_object_parent_class->set_parent(accessible, parent); - - if(parent_old != NULL) - { - my_atk_object_remove_child((MyAtkObject*)parent_old, self); - } -} - -static gint my_atk_object_get_n_children(AtkObject *accessible) -{ - return MY_ATK_OBJECT(accessible)->children->len; -} - -static AtkObject* my_atk_object_ref_child(AtkObject *accessible, gint i) -{ - MyAtkObject *self = MY_ATK_OBJECT(accessible); - if(i < 0 || i >= self->children->len) - { - printf("ref_child: Incorrect index of child.\n"); - return NULL; - } - - AtkObject* child = (AtkObject*) - g_ptr_array_index(self->children, i); - - return (child == NULL) ? NULL : g_object_ref(child); -} - -static gint my_atk_object_get_index_in_parent(AtkObject *accessible) -{ - AtkObject *parent = atk_object_get_parent(accessible); - if(parent == NULL) return -1;//no parent - - MyAtkObject *parent_my = MY_ATK_OBJECT(parent); - - int i = parent_my->children->len; - for(; i>=0; i--) - { - if(g_ptr_array_index(parent_my->children,i) == accessible) - break; - } - if(i < 0)printf("Something wrong in parent-child strucutre.\n"); - return i;//if error, i will be equal to -1 -} - -static AtkStateSet *my_atk_object_ref_state_set(AtkObject *accessible) -{ - MyAtkObject *obj = MY_ATK_OBJECT(accessible); - - if (obj->state_set == NULL) - obj->state_set = atk_state_set_new(); - return g_object_ref(G_OBJECT(obj->state_set)); -} - -static AtkAttributeSet *my_atk_object_get_attributes (AtkObject *accessible) -{ - MyAtkObject *obj = MY_ATK_OBJECT(accessible); - AtkAttributeSet *rs = obj->attributes = NULL; - AtkAttribute *a, *b, *c; - - a = g_new(AtkAttribute, 1); - b = g_new(AtkAttribute, 1); - c = g_new(AtkAttribute, 1); - - a->name = g_strdup("foo"); - a->value = g_strdup("bar"); - b->name = g_strdup("baz"); - b->value = g_strdup("qux"); - c->name = g_strdup("quux"); - c->value = g_strdup("corge"); - - rs = g_slist_append(rs, (gpointer) a); - rs = g_slist_append(rs, (gpointer) b); - rs = g_slist_append(rs, (gpointer) c); -} - -//function, needed in instance_finalize() -static void my_unref1(gpointer data, gpointer user_data) -{ - g_object_unref(data); -} - -static void my_atk_object_instance_finalize(GObject *obj) -{ - MyAtkObject *self = (MyAtkObject*) obj; - //unrefs all children - g_ptr_array_foreach(self->children, my_unref1, NULL); - //then free array (without frees pointers) - g_ptr_array_free(self->children, FALSE); - //chain to parent class - G_OBJECT_CLASS(atk_object_parent_class)->finalize(obj); -} - -void my_atk_object_class_init(gpointer g_class, gpointer g_class_data) -{ - AtkObjectClass *atkObjectClass = (AtkObjectClass*)g_class; - - ((GObjectClass*)g_class)->finalize = my_atk_object_instance_finalize; - //set pointers to new functions in table of virtuals functions - atkObjectClass->set_parent = my_atk_object_set_parent; - atkObjectClass->get_n_children = my_atk_object_get_n_children; - atkObjectClass->ref_child = my_atk_object_ref_child; - atkObjectClass->get_index_in_parent = my_atk_object_get_index_in_parent; - atkObjectClass->ref_state_set = my_atk_object_ref_state_set; - atkObjectClass->get_attributes = my_atk_object_get_attributes; - - atk_object_parent_class = g_type_class_peek_parent(g_class); -} - -static void my_atk_object_instance_init(GTypeInstance *obj, gpointer g_class) -{ - MyAtkObject *self = (MyAtkObject*)obj; - - self->children = g_ptr_array_sized_new(10); - self->attributes = g_slist_alloc(); -} - -GType my_atk_object_get_type() -{ - static GType type = 0; - if(type == 0) - { - static const GTypeInfo typeInfo = - { - sizeof(MyAtkObjectClass), - NULL, //base_init - NULL, //base_finalize - my_atk_object_class_init, //class_init - NULL, //class_finalize - NULL, //class_data - sizeof(MyAtkObject), - 0, //n_preallocs - my_atk_object_instance_init //instance_init - }; - type = g_type_register_static(ATK_TYPE_OBJECT,"MyAtkObject",&typeInfo,0); - } - return type; -} diff --git a/tests/dummyatk/my-atk-object.h b/tests/dummyatk/my-atk-object.h deleted file mode 100644 index 72a4aea..0000000 --- a/tests/dummyatk/my-atk-object.h +++ /dev/null @@ -1,37 +0,0 @@ -#ifndef MY_ATK_OBJECT_H -#define MY_ATK_OBJECT_H - -#include - -#define MY_TYPE_ATK_OBJECT (my_atk_object_get_type ()) -#define MY_ATK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_OBJECT, MyAtkObject)) -#define MY_ATK_OBJECT_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_OBJECT, MyAtkObjectClass)) -#define MY_IS_ATK_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_OBJECT)) -#define MY_IS_ATK_OBJECT_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_OBJECT)) -#define MY_ATK_OBJECT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_OBJECT, MyAtkObjectClass)) - -typedef struct _MyAtkObject MyAtkObject; -typedef struct _MyAtkObjectClass MyAtkObjectClass; - -struct _MyAtkObject -{ - AtkObject parent; - //array of children - AtkStateSet *state_set; - AtkAttributeSet *attributes; - GPtrArray* children; - gint id; -}; - -struct _MyAtkObjectClass -{ - AtkObjectClass parent; -}; - -GType my_atk_object_get_type(); - -void my_atk_object_add_child(MyAtkObject* parent, MyAtkObject* child); - -void my_atk_object_remove_child(MyAtkObject* parent, MyAtkObject* child); - -#endif /*MY_ATK_OBJECT_H*/ diff --git a/tests/dummyatk/my-atk-selection.c b/tests/dummyatk/my-atk-selection.c deleted file mode 100644 index e3f386f..0000000 --- a/tests/dummyatk/my-atk-selection.c +++ /dev/null @@ -1,332 +0,0 @@ -/* This file contains both declaration and definition of the MyAtkSelection, - * a GObject that implements the AtkSelectionIface interface. - */ - -#include -#include - -#include "my-atk-object.h" -#include "my-atk-selection.h" - -/******************************************************************/ -/* Implementation */ -/******************************************************************/ -static GObjectClass *parent_class_simple_selection = NULL; - -/* Implementation of the AtkSelectionIface interface. */ -static gboolean -simple_selection_add_selection (AtkSelection *selection, gint i) -{ - MyAtkSelection* self = (MyAtkSelection*)selection; - if ((!self) || self->disposed) - { - return FALSE; - } - - if ((i >= 0) && (i < TEST_SELECTION_NCHILDREN)) - { - /* If the child is not selected, select it and send the signal */ - if (!self->is_selected[i]) - { - self->is_selected[i] = TRUE; - g_signal_emit_by_name ((gpointer)self, "selection-changed"); - } - - return TRUE; - } - else - { - return FALSE; - } - -} - -static gboolean -simple_selection_clear_selection (AtkSelection *selection) -{ - MyAtkSelection* self = (MyAtkSelection*)selection; - if ((!self) || self->disposed) - { - return FALSE; - } - - /* clear selection */ - { - gboolean changed = FALSE; - int i; - for (i = 0; i < TEST_SELECTION_NCHILDREN; ++i) - { - changed |= self->is_selected[i]; - self->is_selected[i] = FALSE; - } - - if (changed) - { - g_signal_emit_by_name ((gpointer)self, "selection-changed"); - } - } - - return TRUE; -} - -static AtkObject* -simple_selection_ref_selection (AtkSelection *selection, gint i) -{ - int pos; - int nsel; - MyAtkSelection* self = (MyAtkSelection*)selection; - if ((!self) || self->disposed) - { - return NULL; - } - - nsel = 0; - for (pos = 0; pos < TEST_SELECTION_NCHILDREN; ++pos) - { - if (self->is_selected[pos]) - { - if (i == nsel) - { - g_object_ref (G_OBJECT (self->child[pos])); - return ATK_OBJECT(self->child[pos]); - } - ++nsel; - } - } - - return NULL; -} - -static gint -simple_selection_get_selection_count (AtkSelection *selection) -{ - MyAtkSelection* self = (MyAtkSelection*)selection; - - int cnt = 0; - int i; - - if ((!self) || self->disposed) - { - return 0; - } - - for (i = 0; i < TEST_SELECTION_NCHILDREN; ++i) - { - if (self->is_selected[i]) - { - ++cnt; - } - } - - return cnt; -} - -static gboolean -simple_selection_is_child_selected (AtkSelection *selection, gint i) -{ - MyAtkSelection* self = (MyAtkSelection*)selection; - if ((!self) || self->disposed) - { - return FALSE; - } - - if ((i >= 0) && (i < TEST_SELECTION_NCHILDREN)) - { - return (self->is_selected[i]); - } - else - { - return FALSE; - } -} - -static gboolean -simple_selection_remove_selection (AtkSelection *selection, gint i) -{ - int pos; - int nsel; - - MyAtkSelection* self = (MyAtkSelection*)selection; - if ((!self) || self->disposed) - { - return FALSE; - } - - nsel = 0; - for (pos = 0; pos < TEST_SELECTION_NCHILDREN; ++pos) - { - if (self->is_selected[pos]) - { - if (i == nsel) - { - self->is_selected[pos] = FALSE; - g_signal_emit_by_name ((gpointer)self, "selection-changed"); - return TRUE; - } - ++nsel; - } - } - - return TRUE; -} - -static gboolean -simple_selection_select_all_selection (AtkSelection *selection) -{ - MyAtkSelection* self = (MyAtkSelection*)selection; - if ((!self) || self->disposed) - { - return FALSE; - } - - if (!self->multisel_supported) - { - return FALSE; - } - - /* select all */ - { - gboolean changed = FALSE; - int i; - for (i = 0; i < TEST_SELECTION_NCHILDREN; ++i) - { - changed |= !self->is_selected[i]; - self->is_selected[i] = TRUE; - } - - if (changed) - { - g_signal_emit_by_name ((gpointer)self, "selection-changed"); - } - } - - return TRUE; -} - -/******************************************************************/ -static void -simple_selection_interface_init (gpointer g_iface, gpointer iface_data) -{ - AtkSelectionIface *klass = (AtkSelectionIface *)g_iface; - - /* set up overrides here */ - klass->add_selection = - (gboolean (*) (AtkSelection *selection, gint i)) simple_selection_add_selection; - - klass->clear_selection = - (gboolean (*) (AtkSelection *selection)) simple_selection_clear_selection; - - klass->ref_selection = - (AtkObject* (*) (AtkSelection *selection, gint i)) simple_selection_ref_selection; - - klass->get_selection_count = - (gint (*) (AtkSelection *selection)) simple_selection_get_selection_count; - - klass->is_child_selected = - (gboolean (*) (AtkSelection *selection, gint i)) simple_selection_is_child_selected; - - klass->remove_selection = - (gboolean (*) (AtkSelection *selection, gint i)) simple_selection_remove_selection; - - klass->select_all_selection = - (gboolean (*) (AtkSelection *selection)) simple_selection_select_all_selection; -} - -static void -simple_selection_instance_init (GTypeInstance *instance, gpointer g_class) -{ - MyAtkSelection *self = (MyAtkSelection *)instance; - int i; - - self->disposed = FALSE; - self->multisel_supported = TRUE; - for (i = 0; i < TEST_SELECTION_NCHILDREN; ++i) - { - self->child[i] = MY_ATK_OBJECT (g_object_new (MY_TYPE_ATK_OBJECT, NULL)); - self->child[i]->id = i; - self->is_selected[i] = FALSE; /* not selected by default */ - } -} - -static void -my_atk_selection_dispose (GObject *obj) -{ - MyAtkSelection *self = (MyAtkSelection *)obj; - int i; - - if (self->disposed) - { - return; - } - - /* Make sure dispose does not run twice. */ - self->disposed = TRUE; - - for (i = 0; i < TEST_SELECTION_NCHILDREN; ++i) - { - g_object_unref (G_OBJECT (self->child[i])); - } - - /* Chain up to the parent class */ - G_OBJECT_CLASS (parent_class_simple_selection)->dispose (obj); -} - -static void -my_atk_selection_finalize (GObject *obj) -{ - /*MyAtkSelection *self = (MyAtkSelection *)obj; - if (self) - { - }*/ - - /* Chain up to the parent class */ - G_OBJECT_CLASS (parent_class_simple_selection)->finalize (obj); -} - -static void -my_atk_selection_class_init (gpointer g_class, gpointer g_class_data) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (g_class); - MyAtkSelectionClass *klass = MY_ATK_SELECTION_CLASS (g_class); - - gobject_class->dispose = my_atk_selection_dispose; - gobject_class->finalize = my_atk_selection_finalize; - - parent_class_simple_selection = g_type_class_peek_parent (klass); -} - -GType -my_atk_selection_get_type (void) -{ - static GType type = 0; - if (type == 0) - { - static const GTypeInfo info = - { - sizeof (MyAtkSelectionClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - my_atk_selection_class_init, /* class_init */ - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (MyAtkSelection), - 0, /* n_preallocs */ - simple_selection_instance_init /* instance_init */ - }; - - static const GInterfaceInfo iface_info = - { - (GInterfaceInitFunc) simple_selection_interface_init, /* interface_init */ - NULL, /* interface_finalize */ - NULL /* interface_data */ - }; - type = g_type_register_static (MY_TYPE_ATK_OBJECT, - "MyAtkSelectionType", - &info, 0); - g_type_add_interface_static (type, - ATK_TYPE_SELECTION, - &iface_info); - } - return type; -} - diff --git a/tests/dummyatk/my-atk-selection.h b/tests/dummyatk/my-atk-selection.h deleted file mode 100644 index 8e8fcf5..0000000 --- a/tests/dummyatk/my-atk-selection.h +++ /dev/null @@ -1,55 +0,0 @@ -/* This file contains both declaration and definition of the MyAtkSelection, - * a GObject that implements the AtkSelectionIface interface. - */ - -#ifndef MY_ATK_SELECTION_H -#define MY_ATK_SELECTION_H - -#include -#include - -#include - -#define MY_TYPE_ATK_SELECTION (my_atk_selection_get_type ()) -#define MY_ATK_SELECTION(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_SELECTION, MyAtkSelection)) -#define MY_ATK_SELECTION_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_SELECTION, MyAtkSelectionClass)) -#define MY_IS_ATK_SELECTION(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_SELECTION)) -#define MY_IS_ATK_SELECTION_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_SELECTION)) -#define MY_ATK_SELECTION_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_SELECTION, MyAtkSelectionClass)) - -/* Number of child objects for the MyAtkSelection instance */ -#define TEST_SELECTION_NCHILDREN 10 - -typedef struct _MyAtkSelection MyAtkSelection; -typedef struct _MyAtkSelectionClass MyAtkSelectionClass; - -struct _MyAtkSelection -{ - MyAtkObject parent; - - gboolean disposed; - - /* TRUE if multiple selection is supported, FALSE otherwise. - * default - TRUE. - */ - gboolean multisel_supported; - - /* Children of this object */ - MyAtkObject* child[TEST_SELECTION_NCHILDREN]; - - /* is_selected[i] == TRUE means the ith child is selected, == FALSE - - * it is not. - */ - gboolean is_selected[TEST_SELECTION_NCHILDREN]; -}; - -struct _MyAtkSelectionClass -{ - MyAtkObjectClass parent; -}; - -GType -my_atk_selection_get_type (void); - -#endif /*MY_ATK_SELECTION_H*/ - diff --git a/tests/dummyatk/my-atk-streamable-content.c b/tests/dummyatk/my-atk-streamable-content.c deleted file mode 100644 index 460dd9a..0000000 --- a/tests/dummyatk/my-atk-streamable-content.c +++ /dev/null @@ -1,96 +0,0 @@ -#include - -#include "my-atk-object.h" -#include "my-atk-streamable-content.h" - -//*************************implementation*********************** -//implementation of virtual functions -//*****************get_n_mime_types************ -static gint my_atk_streamable_content_get_n_mime_types( - AtkStreamableContent *streamable) -{ - g_return_val_if_fail(MY_IS_ATK_STREAMABLE_CONTENT(streamable), 0); - - return sizeof(mime_types) / sizeof(mime_types[0]); -} -//*****************get_mime_type**************** -static const gchar* my_atk_streamable_content_get_mime_type( - AtkStreamableContent *streamable, - gint i) -{ - g_return_val_if_fail(MY_IS_ATK_STREAMABLE_CONTENT(streamable), NULL); - - if((i < 0) || (i >= sizeof(mime_types) / sizeof(mime_types[0]))) - { - return NULL; - } - return mime_types[i]; -} -//**********************get_stream******************* -static GIOChannel* my_atk_streamable_content_get_stream( - AtkStreamableContent *streamable, - const gchar* mime_type) -{ - gint i; - g_return_val_if_fail(MY_IS_ATK_STREAMABLE_CONTENT(streamable), NULL); - - for(i = 0; i < sizeof(mime_types) / sizeof(mime_types[0]); i++) - { - if(strcmp(mime_type, mime_types[i]) == 0) - { - GError *error = NULL; - gchar* full_filename = T2C_GET_DATA_PATH(file_names[i]); - GIOChannel* channel = g_io_channel_new_file(full_filename, "r", &error); - if(error != NULL) - { - TRACE("Cannot open file '%s' for read: %s", full_filename, - error->message); - g_error_free(error); - } - g_free(full_filename); - return channel; - } - } - return NULL; -} -//others functions -static void my_atk_streamable_content_interface_init(gpointer g_iface, gpointer iface_data) -{ - AtkStreamableContentIface *klass = (AtkStreamableContentIface*)g_iface; - - klass->get_n_mime_types = my_atk_streamable_content_get_n_mime_types; - klass->get_mime_type = my_atk_streamable_content_get_mime_type; - klass->get_stream = my_atk_streamable_content_get_stream; -} - -GType my_atk_streamable_content_get_type() -{ - static GType type = 0; - if(type == 0) - { - static const GTypeInfo typeInfo = - { - sizeof(MyAtkStreamableContentClass), - NULL, //base_init - NULL, //base_finalize - NULL, //class_init - NULL, //class_finalize - NULL, //class_data - sizeof(MyAtkStreamableContent), - 0, //n_preallocs - NULL //instance_init - }; - - static const GInterfaceInfo iface_info = - { - my_atk_streamable_content_interface_init, /* interface_init*/ - NULL, /* interface_finalize*/ - NULL /* interface_data */ - }; - type = g_type_register_static(MY_TYPE_ATK_OBJECT, "MyAtkStreamableContent", &typeInfo, 0); - g_type_add_interface_static(type, - ATK_TYPE_STREAMABLE_CONTENT, - &iface_info); - } - return type; -} diff --git a/tests/dummyatk/my-atk-streamable-content.h b/tests/dummyatk/my-atk-streamable-content.h deleted file mode 100644 index 7a476ac..0000000 --- a/tests/dummyatk/my-atk-streamable-content.h +++ /dev/null @@ -1,35 +0,0 @@ -#ifndef MY_ATK_STREAMABLE_CONTENT_H -#define MY_ATK_STREAMABLE_CONTENT_H - -/* - * MyAtkStreamableContent: derives GObject and implements AtkStreamableContent - */ - -#include - -#include "my-atk-object.h" - -#define MY_TYPE_ATK_STREAMABLE_CONTENT (my_atk_streamable_content_get_type ()) -#define MY_ATK_STREAMABLE_CONTENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_STREAMABLE_CONTENT, MyAtkStreamableContent)) -#define MY_ATK_STREAMABLE_CONTENT_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_STREAMABLE_CONTENT, MyAtkStreamableContentClass)) -#define MY_IS_ATK_STREAMABLE_CONTENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_STREAMABLE_CONTENT)) -#define MY_IS_ATK_STREAMABLE_CONTENT_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_STREAMABLE_CONTENT)) -#define MY_ATK_STREAMABLE_CONTENT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_STREAMABLE_CONTENT, MyAtkStreamableContentClass)) - -typedef struct _MyAtkStreamableContent MyAtkStreamableContent; -typedef struct _MyAtkStreamableContentClass MyAtkStreamableContentClass; - -static const gchar* mime_types[]={"text/plain", "text/richtext"}; -static const gchar* file_names[]={"file1", "file2"}; -struct _MyAtkStreamableContent -{ - MyAtkObject parent; -}; - -struct _MyAtkStreamableContentClass -{ - MyAtkObjectClass parent; -}; - -GType my_atk_streamable_content_get_type(); -#endif /*MY_ATK_STREAMABLE_CONTENT_H*/ diff --git a/tests/dummyatk/my-atk-table.c b/tests/dummyatk/my-atk-table.c deleted file mode 100644 index a76c70e..0000000 --- a/tests/dummyatk/my-atk-table.c +++ /dev/null @@ -1,177 +0,0 @@ -/* This file contains both declaration and definition of the MyAtkTable, - * a GObject that pretends to implement the AtkTableIface interface (it - * registers appropriate interface), but provides no implementation for any of the - * methods of this interface (NULL-filled vftbl). - */ - -#include -#include - -#include "my-atk-object.h" -#include "my-atk-table.h" - -/////////////////////////////////////////////////////////////////////////// -// Helper functions and data -/////////////////////////////////////////////////////////////////////////// -void -my_atk_table_select_rows (MyAtkTable* table, gboolean sel_scheme[]) -{ - // the function does nothing -} - -void -my_atk_table_select_columns (MyAtkTable* table, gboolean sel_scheme[]) -{ - // the function does nothing -} - -/////////////////////////////////////////////////////////////////////////// -// Implementation -/////////////////////////////////////////////////////////////////////////// -static GObjectClass *parent_class_table = NULL; - -/******************************************************************/ -static void -table_interface_init (gpointer g_iface, gpointer iface_data) -{ - AtkTableIface *klass = (AtkTableIface *)g_iface; - - /* set up overrides here */ - klass-> ref_at = - (AtkObject* (*) (AtkTable *table, gint row, gint column)) NULL; - klass-> get_index_at = - (gint (*) (AtkTable *table, gint row, gint column)) NULL; - klass-> get_column_at_index = - (gint (*) (AtkTable *table, gint index_)) NULL; - klass-> get_row_at_index = - (gint (*) (AtkTable *table, gint index_)) NULL; - klass-> get_n_columns = - (gint (*) (AtkTable *table)) NULL; - klass-> get_n_rows = - (gint (*) (AtkTable *table)) NULL; - klass-> get_column_extent_at = - (gint (*) (AtkTable *table, gint row, gint column)) NULL; - klass-> get_row_extent_at = - (gint (*) (AtkTable *table, gint row, gint column)) NULL; - klass-> get_caption = - (AtkObject* (*) (AtkTable *table)) NULL; - klass-> get_column_description = - (const gchar* (*) (AtkTable *table, gint column)) NULL; - klass-> get_column_header = - (AtkObject* (*) (AtkTable *table, gint column)) NULL; - klass-> get_row_description = - (const gchar* (*) (AtkTable *table, gint row)) NULL; - klass-> get_row_header = - (AtkObject* (*) (AtkTable *table, gint row)) NULL; - klass-> get_summary = - (AtkObject* (*) (AtkTable *table)) NULL; - klass-> set_caption = - (void (*) (AtkTable *table, AtkObject *caption)) NULL; - klass-> set_column_description = - (void (*) (AtkTable *table, gint column, const gchar *description)) NULL; - klass-> set_column_header = - (void (*) (AtkTable *table, gint column, AtkObject *header)) NULL; - klass-> set_row_description = - (void (*) (AtkTable *table, gint row, const gchar *description)) NULL; - klass-> set_row_header = - (void (*) (AtkTable *table, gint row, AtkObject *header)) NULL; - klass-> set_summary = - (void (*) (AtkTable *table, AtkObject *accessible)) NULL; - klass-> get_selected_columns = - (gint (*) (AtkTable *table, gint **selected)) NULL; - klass-> get_selected_rows = - (gint (*) (AtkTable *table, gint **selected)) NULL; - klass-> is_column_selected = - (gboolean (*) (AtkTable *table, gint column)) NULL; - klass-> is_row_selected = - (gboolean (*) (AtkTable *table, gint row)) NULL; - klass-> is_selected = - (gboolean (*) (AtkTable *table, gint row, gint column)) NULL; - klass-> add_row_selection = - (gboolean (*) (AtkTable *table, gint row)) NULL; - klass-> remove_row_selection = - (gboolean (*) (AtkTable *table, gint row)) NULL; - klass-> add_column_selection = - (gboolean (*) (AtkTable *table, gint column)) NULL; - klass-> remove_column_selection = - (gboolean (*) (AtkTable *table, gint column)) NULL; -} - -static void -table_instance_init (GTypeInstance *instance, gpointer g_class) -{ - MyAtkTable *self = (MyAtkTable *)instance; - - self->disposed = FALSE; -} - -static void -my_atk_table_dispose (GObject *obj) -{ - MyAtkTable *self = (MyAtkTable *)obj; - - if (self->disposed) - { - return; - } - - /* Make sure dispose does not run twice. */ - self->disposed = TRUE; - - /* Chain up to the parent class */ - G_OBJECT_CLASS (parent_class_table)->dispose (obj); -} - -static void -my_atk_table_finalize (GObject *obj) -{ - /* Chain up to the parent class */ - G_OBJECT_CLASS (parent_class_table)->finalize (obj); -} - -static void -my_atk_table_class_init (gpointer g_class, gpointer g_class_data) -{ - GObjectClass *gobject_class = G_OBJECT_CLASS (g_class); - MyAtkTableClass *klass = MY_ATK_TABLE_CLASS (g_class); - - gobject_class->dispose = my_atk_table_dispose; - gobject_class->finalize = my_atk_table_finalize; - - parent_class_table = g_type_class_peek_parent (klass); -} - -GType -my_atk_table_get_type (void) -{ - static GType type = 0; - if (type == 0) - { - static const GTypeInfo info = - { - sizeof (MyAtkTableClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - my_atk_table_class_init, /* class_init */ - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (MyAtkTable), - 0, /* n_preallocs */ - table_instance_init /* instance_init */ - }; - - static const GInterfaceInfo iface_info = - { - (GInterfaceInitFunc) table_interface_init, /* interface_init */ - NULL, /* interface_finalize */ - NULL /* interface_data */ - }; - type = g_type_register_static (MY_TYPE_ATK_OBJECT, - "MyAtkTableType", - &info, 0); - g_type_add_interface_static (type, - ATK_TYPE_TABLE, - &iface_info); - } - return type; -} diff --git a/tests/dummyatk/my-atk-table.h b/tests/dummyatk/my-atk-table.h deleted file mode 100644 index 7860a2d..0000000 --- a/tests/dummyatk/my-atk-table.h +++ /dev/null @@ -1,86 +0,0 @@ -#ifndef MY_ATK_TABLE_H -#define MY_ATK_TABLE_H - -#include -#include -#include - -#define MY_TYPE_ATK_TABLE (my_atk_table_get_type ()) -#define MY_ATK_TABLE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_TABLE, MyAtkTable)) -#define MY_ATK_TABLE_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_TABLE, MyAtkTableClass)) -#define MY_IS_ATK_TABLE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_TABLE)) -#define MY_IS_ATK_TABLE_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_TABLE)) -#define MY_ATK_TABLE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_TABLE, MyAtkTableClass)) - -#define NROWS 4 /* row count */ -#define NCOLS 5 /* column count */ - -static gint ids[NROWS][NCOLS] = - { {0, 1, 2, 2, 3}, - {4, 5, 6, 7, 8}, - {9, 9, 10, 11, 12}, - {9, 9, 13, 14, -1} }; - -static gint row_ext[NROWS][NCOLS] = - { {1, 1, 1, 1, 1}, - {1, 1, 1, 1, 1}, - {2, 2, 1, 1, 1}, - {2, 2, 1, 1, 1} }; - -static gint col_ext[NROWS][NCOLS] = - { {1, 1, 2, 2, 1}, - {1, 1, 1, 1, 1}, - {2, 2, 1, 1, 1}, - {2, 2, 1, 1, 1} }; - -#define NCHILDREN 16 /* child object count */ - -// default string values -#define DEF_CAPTION_TEXT "Default table caption" -#define DEF_SUMMARY_TEXT "Default table summary" -#define DEF_ROW_DESCR_TPL "Row No%d" -#define DEF_COL_DESCR_TPL "Column No%d" - -/* row and column headers */ -typedef struct -{ - AtkObject* hdr; - gboolean selected; /* TRUE if the row/column is selected, FALSE otherwise */ -} TestSimpleHeaderStruct; - -/* This struct represents a table cell */ -typedef struct -{ - MyAtkObject* elem; /* the element */ - guint ext_row; /* its row extent */ - guint ext_col; /* its column extent */ -} TestSimpleCell; - -typedef struct _MyAtkTable MyAtkTable; -typedef struct _MyAtkTableClass MyAtkTableClass; - -struct _MyAtkTable -{ - MyAtkObject parent; - - gboolean disposed; - - MyAtkObject* child[NCHILDREN]; - MyAtkObject* not_a_child; - TestSimpleHeaderStruct row[NROWS]; - TestSimpleHeaderStruct col[NCOLS]; - guint nrows; - guint ncols; - AtkObject* caption; - AtkObject* summary; -}; - -struct _MyAtkTableClass -{ - MyAtkObjectClass parent; -}; - -GType -my_atk_table_get_type (void); - -#endif /*MY_ATK_TABLE_H*/ diff --git a/tests/dummyatk/my-atk-text.c b/tests/dummyatk/my-atk-text.c deleted file mode 100644 index 6729c4b..0000000 --- a/tests/dummyatk/my-atk-text.c +++ /dev/null @@ -1,1290 +0,0 @@ - -#include -#include -#include -#include - -#include "my-atk-text.h" -//*************************implementation*********************** - -//Attributes -/* - * Auxiliary functions create/copy/print/free structures - * Use the same naming principe, as atk, but without 'atk' prefix - */ - //AtkAttribute -AtkAttribute* attribute_new(const gchar* name, const gchar* value) -{ - AtkAttribute* attr = g_malloc(sizeof(AtkAttribute)); - if(attr == NULL) return NULL; - attr->name = g_strdup(name); - attr->value = g_strdup(value); - return attr; -} -AtkAttribute* attribute_copy(AtkAttribute* attr) -{ - return attribute_new(attr->name, attr->value); -} -void attribute_print(AtkAttribute* attr) -{ - TRACE("name=%s, value=%s", attr->name, attr->value); -} - -//AtkAttributeSet -AtkAttributeSet* attribute_set_copy(AtkAttributeSet* attr) -{ - GSList *tmp; - AtkAttributeSet* result = g_slist_copy(attr); - for(tmp = result; tmp != NULL; tmp = tmp->next) - tmp->data = attribute_copy((AtkAttribute*)tmp->data); - return result; -} -void attribute_set_print(AtkAttributeSet *set) -{ - if(set == NULL) - TRACE0("(empty)"); - else - g_slist_foreach(set, (GFunc)attribute_print, NULL); -} - -// STATIC FUNCTIONS -// -//auxiliary functions for search tokens -//Number of different characters -#define TABLE_SIZE 256 -//modificator static isn't used because this tables will be use in tests -/*static*/ gboolean table_word_symbols[TABLE_SIZE], - table_sentence_symbols[TABLE_SIZE], - table_line_symbols[TABLE_SIZE]; -static gboolean *tables[7]={NULL, - table_word_symbols, - table_word_symbols, - table_sentence_symbols, - table_sentence_symbols, - table_line_symbols, - table_line_symbols - }; - -static gboolean current_token(const gchar* str, gint offset, gint *token_start, gint *token_end, - const gboolean table_token_symbols[TABLE_SIZE]) -{ - const gchar *current = str + offset; - if(!table_token_symbols[(guchar)*current]) - { - return FALSE; - } - for( --current; (current >= str) && table_token_symbols[(guchar)*current]; --current); - *token_start = current - str + 1; - for(current = str + offset + 1; - (*current != 0) && table_token_symbols[(guchar)*current]; ++current); - *token_end = current - str; - return TRUE; -} -static gboolean next_token(const gchar* str, gint offset, gint *token_start, gint *token_end, - const gboolean table_token_symbols[TABLE_SIZE]) -{ - const gchar *current = str + offset; - for( ; (*current != 0) && table_token_symbols[(guchar)*current]; ++current); - if(*current == 0) - return FALSE; - for(++current ; (*current != 0) && !table_token_symbols[(guchar)*current]; ++current); - if(!table_token_symbols[(guchar)*current]) - return FALSE; - return current_token(str, current - str, token_start, token_end, table_token_symbols); -} -static gboolean previous_token(const gchar* str, gint offset, gint *token_start, gint *token_end, - const gboolean table_token_symbols[TABLE_SIZE]) -{ - const gchar *current = str + offset; - for( ; (current > str) && table_token_symbols[(guchar)*current]; --current); - if(current == str) - return FALSE; - for( ; (current > str) && !table_token_symbols[(guchar)*current]; --current); - if(!table_token_symbols[(guchar)*current]) - return FALSE; - return current_token(str, current - str, token_start, token_end, table_token_symbols); -} - - -//Range: type of data, containing in list of attributes -typedef struct -{ - gint start,end;//range, containing this attributes - AtkAttributeSet* attributeSet; -} Range; -//auxiliary functions for ranges -Range* range_new(gint start, gint end) -{ - Range *range = g_malloc(sizeof(Range)); - range->start = start; - range->end = end; - range->attributeSet = NULL; - return range; -} - -void range_free(Range* range) -{ - atk_attribute_set_free(range->attributeSet); - g_free(range); -} -void range_print(const Range*range) -{ - TRACE("[%d,%d):", range->start, range->end); - attribute_set_print(range->attributeSet); -} -//only for correct list of ranges - ranges shouldn't intersect -gint range_compare(const Range* range1, const Range* range2) -{ - return range1->start - range2->start;//never equal -} -//Bounds of text -void text_bounds_init(TextBounds *bounds) -{ - bounds->base_x = 0; - bounds->base_y = 0; - bounds->pixels_above_line = 2; - bounds->pixels_below_line = 3; - bounds->size = 8; - bounds->pixels_between_characters = 1; - bounds->width = 3; -} - -//auxiliary function - create new range according to start_offset and end_offset -AtkTextRange* text_range_new(AtkText* text, - gint start_offset, gint end_offset, AtkCoordType coord_type) -{ - AtkTextRange* range = g_malloc(sizeof(AtkTextRange)); - if(range == NULL) return NULL; - range->start_offset = start_offset; - range->end_offset = end_offset; - range->content = atk_text_get_text(text, start_offset, end_offset); - atk_text_get_range_extents(text, start_offset, end_offset, coord_type, &range->bounds); - return range; -} -// Returns number of line, which contain given character. -// Also return relative offset - offset of this character from start of the line -gint get_character_line(MyAtkText *text, gint offset, gint *relative_offset) -{ - gint result = 0; - //simple realization - counts lines from start of the text, until reaches offset - const guchar *text_str = (guchar*)text->str; - gboolean state_FSM = table_line_symbols[text_str[0]]; - gint i, last_line_start = 0; - for(i = 1; i <= offset; state_FSM = table_line_symbols[text_str[i++]]) - { - if(state_FSM)continue; - result++; - last_line_start = i; - } - if(relative_offset != NULL) *relative_offset = offset - last_line_start; - return result; -} -// Compute extent of character, -// as it was at line 'line' and at offset 'relative_offset' in that line -//(geometry) -void get_extents(MyAtkText *text, gint line, gint relative_offset, AtkTextRectangle *rect) -{ - rect->x = text->bounds.base_x + relative_offset * - (text->bounds.width + text->bounds.pixels_between_characters); - rect->y = text->bounds.base_y + text->bounds.pixels_above_line + line * - (text->bounds.size + text->bounds.pixels_below_line + text->bounds.pixels_above_line); - rect->width = text->bounds.width; - rect->height = text->bounds.size; -} -//return line, corresponding to given y-coordinate -gint get_point_line(MyAtkText *text, gint y) -{ - //slightly differ from invers operation - if(y - text->bounds.base_y < 0)return -1; - return (y - text->bounds.base_y) - /(text->bounds.size + text->bounds.pixels_below_line + text->bounds.pixels_above_line); -} -// Returns offset from left boundary of text, correspondind to x-coordinate -gint get_point_relative_offset(MyAtkText *text, gint x) -{ - //slightly differ from invers operation - if(x - text->bounds.base_x < 0)return -1; - return (x - text->bounds.base_x) - /(text->bounds.width + text->bounds.pixels_between_characters); -} -// Returns offset where given line start(even if this line is empty) -// If line number too small(<0)return -1, if too big - return length of the text -gint get_offset_at_line_start(MyAtkText *text, gint line) -{ - gint i; - if(line < 0)return -1; - if(line == 0)return 0; - gint len = my_strlen(text->str); - guchar *str = (guchar*)text->str; - gint current_line = 0; - gboolean state_FSM = table_line_symbols[str[0]]; - for(i = 1; i < len; state_FSM = table_line_symbols[str[i++]]) - { - if(state_FSM || ++current_line != line)continue; - return i; - } - return len; - -} -// Return offset of character at the given line and at the given offset at this line -// If such character doesn't exist, return -1 -gint get_offset_at_line(MyAtkText *text, gint line, gint relative_offset) -{ - gint j; - if(line < 0 || relative_offset < 0)return -1; - const guchar* str = (guchar*)text->str; - gint len = my_strlen(text->str); - gint offset_at_line_start = get_offset_at_line_start(text, line); - if(offset_at_line_start + relative_offset >= len)return -1; - for(j = 0; j <= relative_offset; j++) - if(!table_line_symbols[str[offset_at_line_start + j]]) - return -1; - return offset_at_line_start + relative_offset; -} -/* - * Count ranges of text, which clipping by rel_start_offset and relative_end_offset. - * 'offset' stands start of search(start of first line), - * number_of_lines - maximum number of lines for search. - * If 'ranges' not NULL, writes ranges to it. 'coord_type' used only in this case. - */ -gint count_ranges(MyAtkText *text, gint offset, gint rel_start_offset, gint rel_end_offset, - gint number_of_lines, AtkTextRange** ranges, AtkCoordType coord_type) -{ - guchar *str = (guchar*)text->str; - gint len = my_strlen(text->str); - - gint number_of_ranges = 0; - gint current_line = 0; - gint current_line_start = offset; - for(;(current_line < number_of_lines) && (current_line_start < len); current_line ++) - { - if(!table_line_symbols[str[current_line_start]]) - { - current_line_start++; - continue; - } - gint start_offset,end_offset; - gchar *tmp_str = atk_text_get_text_at_offset((AtkText*)text, current_line_start, - ATK_TEXT_BOUNDARY_LINE_END, &start_offset, &end_offset); - g_free(tmp_str); - if(end_offset - current_line_start > rel_start_offset) - { - if(ranges != NULL) - { - gint range_start_offset = current_line_start + rel_start_offset; - gint range_end_offset = current_line_start + rel_end_offset + 1; - if(range_end_offset > end_offset) - range_end_offset = end_offset; - //add element - ranges[number_of_ranges] = text_range_new((AtkText*)text, - range_start_offset, range_end_offset, coord_type); - } - number_of_ranges++; - } - current_line_start = end_offset + 1; - } - if(ranges != NULL) ranges[number_of_ranges] = NULL; - return number_of_ranges; -} - -//"free"-functions(for internal using, because them don't emit signals) -void my_atk_text_free_run_attributes(MyAtkText *text) -{ - g_list_foreach(text->attributes, (GFunc)range_free, NULL); - g_list_free(text->attributes); - text->attributes = NULL; -} -void my_atk_text_free_default_attributes(MyAtkText *text) -{ - atk_attribute_set_free(text->default_attributes); - text->default_attributes = NULL; -} -void my_atk_text_clear_selections(MyAtkText *text) -{ - if(text->selections->len != 0) - g_array_remove_range(text->selections, 0, text->selections->len); -} -void table_symbols_init() -{ - //word - gint i; - for(i = TABLE_SIZE - 1;i > 0 ; --i) - table_word_symbols[i] = g_ascii_isalnum(i); - table_word_symbols['\0'] = FALSE; - //sentence - for(i = TABLE_SIZE - 1;i >= 0x20; --i) - table_sentence_symbols[i] = TRUE; - table_sentence_symbols['.'] = FALSE; - table_sentence_symbols['!'] = FALSE; - table_sentence_symbols['?'] = FALSE; - for(i = 0x1f;i > 0; --i) - table_sentence_symbols[i] = FALSE; - table_sentence_symbols['\0'] = FALSE; - //line - for(i = TABLE_SIZE - 1;i > 0 ; --i) - table_line_symbols[i] = TRUE; - table_line_symbols['\n'] = FALSE; - table_line_symbols['\0'] = FALSE; -} -void correct_selections_after_insert(MyAtkText *text, gint position, gint length) -{ - gint i; - GArray* selections = text->selections; - for(i = selections->len - 1; i >=0; i--) - { - TextSelection* sel = &g_array_index(selections, TextSelection, i); - if(sel->end_offset >= position) sel->end_offset+= length; - if(sel->start_offset >= position) sel->start_offset+= length; - else break; - } -} -void correct_selections_after_delete(MyAtkText *text, gint position, gint length) -{ - gint i; - GArray* selections = text->selections; - for(i = selections->len - 1; i >=0; i--) - { - TextSelection* sel = &g_array_index(selections, TextSelection, i); - if(sel->start_offset >= position) - { - if(sel->start_offset >= position + length) - { - sel->start_offset-= length; - sel->end_offset-= length; - } - //position <= sel->start_offset < position + length - else if(sel->end_offset > position + length) - { - sel->start_offset = position; - sel->end_offset -= length; - } - else - { - g_array_remove_index(selections, i); - } - continue; - } - /*sel->start_offset < position*/ - if(sel->end_offset > position + length) sel->end_offset-= length; - else if(sel->end_offset > position) sel->end_offset = position; - break; - } -} -void correct_attributes_after_insert(MyAtkText* text, gint position, gint length) -{ - GList *attributes = text->attributes; - GList *tmp; - //before inserted position - for(tmp = attributes; tmp != NULL; tmp = tmp -> next) - { - Range* range = (Range*)tmp->data; - if(range->end <= position)continue; - //range->end > position - if(range->start < position) - range->start -= length;//will be restore in the next loop - break; - } - //after inserted position - for(; tmp != NULL; tmp = tmp -> next) - { - Range* range = (Range*)tmp->data; - range->end += length; - range->start += length; - } -} -void correct_attributes_after_delete(MyAtkText* text, gint position, gint length) -{ - GList *attributes = text->attributes; - GList *tmp = attributes; - //before deleting range - for(tmp = attributes; tmp != NULL; tmp = tmp->next) - { - Range* range = (Range*)tmp->data; - if(range->end <= position) continue; - if(range->start < position) - { - if(range->end > position + length) range->end -= length; - else range->end = position; - tmp = tmp->next; - } - break; - } - //at deleting range - while(tmp != NULL) - { - Range* range = (Range*)tmp->data; - if(range->start >= position + length) break; - if(range->end <= position + length) - { - GList *tmp1 = tmp->next; - range_free(range); - attributes = g_list_remove_link(attributes, tmp); - tmp = tmp1; - continue; - } - //range->end > position + length - //range->start < position + length - range->start = position + length;//will be restored in next loop - break; - } - //after deleting range - for(;tmp != NULL; tmp = tmp->next) - { - Range* range = (Range*)tmp->data; - range->end -= length; - range->start -= length; - } - text->attributes = attributes; -} -void correct_caret_after_insert(MyAtkText* text, gint position, gint length) -{ - if(text->caret_offset > position)text->caret_offset += length; -} -void correct_caret_after_delete(MyAtkText* text, gint position, gint length) -{ - if(text->caret_offset >= position + length)text->caret_offset -= length; - else if(text->caret_offset > position) text->caret_offset = position; -} - -// Implementation of virtual functions -//******************************my_atk_text_get_character_count************************* -static gint my_atk_text_get_character_count(AtkText *text) -{ - MyAtkText *self = (MyAtkText*)text; - return my_strlen(self->str); -} -//**************************************my_atk_text_get_text***************************** -static gchar* my_atk_text_get_text(AtkText *text, gint start_offset, gint end_offset) -{ - gchar *str = ((MyAtkText*)text)->str; - if((start_offset < 0) || (end_offset > my_strlen(str)) || (end_offset <= start_offset)) - { - //incorrect bounds - return NULL; - } - return g_strndup(str + start_offset, end_offset - start_offset); - -} -//*******************************my_atk_text_get_character_at_offset************************ -static gunichar my_atk_text_get_character_at_offset(AtkText *text, gint offset) -{ - gchar *str = ((MyAtkText*)text)->str; - if(offset < 0 || offset >= my_strlen(str)) - { - return 0; - } - return (gunichar)str[offset]; -} -// In the next 3 functions some code is commented for verify tests themselves on 'mutants' -// in realization. -//******************************my_atk_text_get_text_after_offset*************************** -static gchar* my_atk_text_get_text_after_offset(AtkText *text, gint offset, - AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset) -{ - gchar *str = ((MyAtkText*)text)->str; - gint len = my_strlen(str); - if((offset < 0) || (offset >= len)) - { - return NULL;//incorrect offset - } - - // This variable is set in switch statement. If after that statement variable is TRUE, - // then return text from 'strat_offset' to 'end_offset'. Otherwise NULL will be returned. - gboolean is_successed = TRUE; - - gint start_tmp; - gint end_tmp; - - switch(boundary_type) - { - case ATK_TEXT_BOUNDARY_CHAR: - if(offset + 1 == len) - { - is_successed = FALSE; - break; - } - *start_offset = offset + 1; - *end_offset = offset + 2; - is_successed = TRUE; - break; - case ATK_TEXT_BOUNDARY_WORD_START: - case ATK_TEXT_BOUNDARY_SENTENCE_START: - case ATK_TEXT_BOUNDARY_LINE_START: - if(!next_token(str, offset, start_offset, &end_tmp, tables[boundary_type])) - { - //debug -// if(current_token(str, offset, start_offset, end_offset, tables[boundary_type])) -// { -// is_successed = TRUE; -// break; -// } - is_successed = FALSE; - break; - } - if(!next_token(str, end_tmp, end_offset, &end_tmp, tables[boundary_type])) - { - *end_offset = len; - } - is_successed = TRUE; - //debug -// (*start_offset)++; -// if(*start_offset > 10) ++(*start_offset); - break; - case ATK_TEXT_BOUNDARY_WORD_END: - case ATK_TEXT_BOUNDARY_SENTENCE_END: - case ATK_TEXT_BOUNDARY_LINE_END: - if(!current_token(str, offset, &start_tmp, start_offset, tables[boundary_type])) - { - if(!next_token(str, offset, &start_tmp, start_offset, tables[boundary_type])) - { - is_successed = FALSE; - break; - } - } - //debug -// else if(*start_offset > strlen(str) - 7) -// { -// *end_offset = *start_offset + 3; -// is_successed = TRUE; -// break; -// } - if(!next_token(str, *start_offset, &start_tmp, end_offset, tables[boundary_type])) - { - is_successed = FALSE; - break; - } - //debug -// --(*start_offset); - is_successed = TRUE; - - break; - default: - is_successed = FALSE; - } - - if(is_successed) - { - return my_atk_text_get_text(text, *start_offset, *end_offset); - } - else - { - return NULL; - } -} -//*******************************my_atk_text_get_text_at_offset******************************* -static gchar* my_atk_text_get_text_at_offset(AtkText *text, gint offset, - AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset) -{ - gchar *str = ((MyAtkText*)text)->str; - gint len = my_strlen(str); - if((offset < 0) || (offset >= len)) - { - return NULL; - } - - // This variable is set in switch statement. If after that statement variable is TRUE, - // then return text from 'strat_offset' to 'end_offset'. Otherwise NULL will be returned. - gboolean is_successed = TRUE; - - gint start_tmp; - gint end_tmp; - - switch(boundary_type) - { - case ATK_TEXT_BOUNDARY_CHAR: - *start_offset = offset; - *end_offset = offset + 1; - is_successed = TRUE; - break; - case ATK_TEXT_BOUNDARY_WORD_START: - case ATK_TEXT_BOUNDARY_SENTENCE_START: - case ATK_TEXT_BOUNDARY_LINE_START: - if(!current_token(str, offset, start_offset, &end_tmp, tables[boundary_type])) - { - if(!previous_token(str, offset, start_offset, &end_tmp, tables[boundary_type])) - { - is_successed = FALSE; - break; - } - } - if(!next_token(str, offset, end_offset, &end_tmp, tables[boundary_type])) - { - *end_offset = len; - } - is_successed = TRUE; - break; - case ATK_TEXT_BOUNDARY_WORD_END: - case ATK_TEXT_BOUNDARY_SENTENCE_END: - case ATK_TEXT_BOUNDARY_LINE_END: - if(!current_token(str, offset, &start_tmp, end_offset, tables[boundary_type])) - { - if(!next_token(str, offset, &start_tmp, end_offset, tables[boundary_type])) - { - is_successed = FALSE; - break; - } - } - if(!previous_token(str, start_tmp, &start_tmp, start_offset, tables[boundary_type])) - { - *start_offset = 0; - } - is_successed = TRUE; - //debug -// ++(*start_offset); - break; - default: - is_successed = FALSE; - } - - if(is_successed) - { - //debug -// if(boundary_type == ATK_TEXT_BOUNDARY_LINE_START) -// return my_atk_text_get_text(text, ++(*start_offset), *end_offset); - return my_atk_text_get_text(text, *start_offset, *end_offset); - } - else - { - return NULL; - } -} -//***********************************my_atk_text_get_text_before_offset****************** -static gchar* my_atk_text_get_text_before_offset(AtkText *text, gint offset, - AtkTextBoundary boundary_type, gint *start_offset, gint *end_offset) -{ - gchar *str = ((MyAtkText*)text)->str; - gint len = my_strlen(str); - if((offset < 0) || (offset >= len)) - { - return NULL; - } - - // This variable is set in switch statement. If after that statement variable is TRUE, - // then return text from 'strat_offset' to 'end_offset'. Otherwise NULL will be returned. - gboolean is_successed = TRUE; - - gint start_tmp; - gint end_tmp; - - switch(boundary_type) - { - case ATK_TEXT_BOUNDARY_CHAR: - if(offset == 0) - { - is_successed = FALSE; - break; - } - *start_offset = offset - 1; - *end_offset = offset; - is_successed = TRUE; - break; - case ATK_TEXT_BOUNDARY_WORD_START: - case ATK_TEXT_BOUNDARY_SENTENCE_START: - case ATK_TEXT_BOUNDARY_LINE_START: - if(!current_token(str, offset, end_offset, &end_tmp, tables[boundary_type])) - { - if(!previous_token(str, offset, end_offset, &end_tmp, tables[boundary_type])) - { - is_successed = FALSE; - break; - } - } - if(!previous_token(str, *end_offset, start_offset, &end_tmp, tables[boundary_type])) - { - is_successed = FALSE; - break; - } - is_successed = TRUE; - //debug -// ++(*start_offset); - break; - case ATK_TEXT_BOUNDARY_WORD_END: - case ATK_TEXT_BOUNDARY_SENTENCE_END: - case ATK_TEXT_BOUNDARY_LINE_END: - if(!previous_token(str, offset, &start_tmp, end_offset, tables[boundary_type])) - { - is_successed = FALSE; - break; - } - if(!previous_token(str, start_tmp, &start_tmp, start_offset, tables[boundary_type])) - { - *start_offset = 0; - } - is_successed = TRUE; - break; - default: - is_successed = FALSE; - } - - if(is_successed) - { - return my_atk_text_get_text(text, *start_offset, *end_offset); - } - else - { - return NULL; - } -} -//*********************************my_atk_text_get_run_attributes***************** -AtkAttributeSet* my_atk_text_get_run_attributes(AtkText* text, gint offset, - gint *start_offset, gint *end_offset) -{ - GList *tmp; - GList *attributes = ((MyAtkText*)text)->attributes; - if(offset < 0 || offset >= my_atk_text_get_character_count(text)) - { - TRACE0("Incorrect value of offset."); - return NULL; - } - gint start = -1, end = -1; - for(tmp = attributes; tmp != NULL; tmp = tmp->next) - { - Range* range = (Range*)(tmp->data); - if(range->end <= offset) - { - start = range->end; - continue; - } - if(range->start > offset) - { - end = range->start; - break; - } - - *start_offset = range->start; - *end_offset = range->end; - return attribute_set_copy(range->attributeSet); - } - *start_offset = (start == -1) ? 0 : start; - *end_offset = (end == -1) ? my_atk_text_get_character_count(text) : end; - return NULL; -} -//*********************************my_atk_text_get_default_attributes***************** -AtkAttributeSet* my_atk_text_get_default_attributes(AtkText* text) -{ - return attribute_set_copy(((MyAtkText*)text)->default_attributes); -} -//*********************************my_atk_text_get_character_extents***************** -void my_atk_text_get_character_extents(AtkText* text, gint offset, gint *x, gint *y, - gint *width, gint *height, AtkCoordType coord_type) -{ - AtkTextRectangle result; - gint relative_offset, line; - line = get_character_line((MyAtkText*)text, offset, &relative_offset); - get_extents((MyAtkText*)text, line, relative_offset, &result); - *x = result.x; - *y = result.y; - *width = result.width; - *height = result.height; -} -//*******************************my_atk_text_get_range_extents************************ -void my_atk_text_get_range_extents(AtkText *text, gint start_offset, gint end_offset, - AtkCoordType coord_type, AtkTextRectangle *rect) -{ - //simple - union of extents of the characters, contained in this range - AtkTextRectangle result, bounds_tmp; - gint i; - - atk_text_get_character_extents (text, start_offset, - &result.x, &result.y, - &result.width, &result.height, - coord_type); - - for (i = start_offset + 1; i < end_offset; i++) - { - my_atk_text_get_character_extents (text, i,&bounds_tmp.x, &bounds_tmp.y, - &bounds_tmp.width, &bounds_tmp.height, coord_type); - - if(bounds_tmp.x < result.x) - { - //corrects left boundary - result.width += result.x - bounds_tmp.x; - result.x = bounds_tmp.x; - } - if(bounds_tmp.x + bounds_tmp.width > result.x + result.width) - { - //corrects right boundary - result.width = bounds_tmp.x + bounds_tmp.width - result.x; - } - if(bounds_tmp.y < result.y) - { - //corrects top boundary - result.height += result.y - bounds_tmp.y; - result.y = bounds_tmp.y; - } - if(bounds_tmp.y + bounds_tmp.height > result.y + result.height) - { - //corrects buttom boundary - result.height = bounds_tmp.y + bounds_tmp.height - result.y; - } - } - *rect = result; -} -//**********************************my_atk_text_get_offset_at_point********************* -gint my_atk_text_get_offset_at_point(AtkText* text, gint x, gint y, AtkCoordType coord_type) -{ - gint line, relative_offset; - - line = get_point_line((MyAtkText*)text, y); - relative_offset = get_point_relative_offset((MyAtkText*)text, x); - - return get_offset_at_line((MyAtkText*)text, line, relative_offset); -} -//*****************************my_atk_text_get_bounded_ranges****************************** -AtkTextRange** my_atk_text_get_bounded_ranges(AtkText *text, AtkTextRectangle *rect, - AtkCoordType coord_type, AtkTextClipType x_clip_type, AtkTextClipType y_clip_type) -{ - MyAtkText *self = (MyAtkText*)text; - - gint start_line, end_line, start_rel_offset, end_rel_offset; - AtkTextRange** result; - gint len = my_strlen(self->str); -//macro for simplify return empty ranges when fail to do smth -#define RETURN_EMTPY_RANGES {result = g_malloc(sizeof(AtkTextRange*));result[0] = NULL;return result;} - //start line - start_line = (y_clip_type == ATK_TEXT_CLIP_NONE) || (y_clip_type == ATK_TEXT_CLIP_MAX) - ? 0 : get_point_line(self, rect->y); - if(start_line < 0) start_line = 0; - //end line - end_line = (y_clip_type == ATK_TEXT_CLIP_NONE) || (y_clip_type == ATK_TEXT_CLIP_MIN) - ? G_MAXINT/2 : get_point_line(self, rect->y + rect->height); - if(end_line < 0) RETURN_EMTPY_RANGES; - //start relative offset - start_rel_offset = (x_clip_type == ATK_TEXT_CLIP_NONE) || (x_clip_type == ATK_TEXT_CLIP_MAX) - ? 0 : get_point_relative_offset(self, rect->x); - if(start_rel_offset < 0) start_rel_offset = 0; - //end relative offset - end_rel_offset = (x_clip_type == ATK_TEXT_CLIP_NONE) || (x_clip_type == ATK_TEXT_CLIP_MIN) - ? G_MAXINT/2 : get_point_relative_offset(self, rect->x + rect->width); - if(end_rel_offset < 0) RETURN_EMTPY_RANGES; - //start offset(at the start of 'start_line') - gint start_offset = get_offset_at_line_start(self, start_line); - if(start_offset + start_rel_offset >= len) RETURN_EMTPY_RANGES; - - //count ranges - gint number_of_ranges = count_ranges(self, start_offset, - start_rel_offset, end_rel_offset, end_line - start_line + 1, NULL, coord_type); - //create array(with just getting size) - result = g_malloc(sizeof(AtkTextRange*) * (number_of_ranges + 1)); - //write ranges - count_ranges(self, start_offset, - start_rel_offset, end_rel_offset, end_line - start_line + 1, result, coord_type); -#undef RETURN_EMPTY_RANGES - return result; -} - -//********************************my_atk_text_get_n_selections******************************* -gint my_atk_text_get_n_selections(AtkText *text) -{ - MyAtkText *self = (MyAtkText*)text; - return self->selections->len; -} - -//********************************my_atk_text_get_selection******************************* -gchar* my_atk_text_get_selection(AtkText *text, - gint selection_num, gint *start_offset, gint *end_offset) -{ - MyAtkText *self = (MyAtkText*)text; - GArray *selections = self->selections; - if(selection_num < 0 || selection_num >= selections->len) return NULL; - *start_offset = g_array_index(selections, TextSelection, selection_num).start_offset; - *end_offset = g_array_index(selections, TextSelection, selection_num).end_offset; - return my_atk_text_get_text(text, *start_offset, *end_offset); -} -//********************************my_atk_text_remove_selection******************************* -gboolean my_atk_text_remove_selection(AtkText *text, gint selection_num) -{ - MyAtkText *self = (MyAtkText*)text; - GArray *selections = self->selections; - if(selection_num < 0 || selection_num >= selections->len) return FALSE; - g_array_remove_index(selections, selection_num); - - g_signal_emit_by_name(text, "text-selection-changed"); - return TRUE; -} -//********************************my_atk_text_add_selection******************************* -gboolean my_atk_text_add_selection(AtkText *text, gint start_offset, gint end_offset) -{ - if(start_offset < 0 || end_offset > my_atk_text_get_character_count(text) - || start_offset >= end_offset) return FALSE; - - MyAtkText *self = (MyAtkText*)text; - GArray *selections = self->selections; - gint i; - for(i = 0; i < selections->len; i++) - { - if(g_array_index(selections, TextSelection, i).start_offset >= start_offset) - { - if(g_array_index(selections, TextSelection, i).start_offset < end_offset) - return FALSE; - break; - } - } - TextSelection new_selection; - new_selection.start_offset = start_offset; - new_selection.end_offset = end_offset; - g_array_insert_val(selections, i, new_selection); - - g_signal_emit_by_name(text, "text-selection-changed"); - return TRUE; -} -//********************************my_atk_text_set_selection******************************* -gboolean my_atk_text_set_selection(AtkText *text, - gint selection_num, gint start_offset, gint end_offset) -{ - MyAtkText *self = (MyAtkText*)text; - GArray *selections = self->selections; - if(selection_num < 0 || selection_num >= selections->len) return NULL; - - if((selection_num == 0 - || g_array_index(selections, TextSelection, selection_num - 1).end_offset <= start_offset) - && (selection_num == selections->len - 1 - || g_array_index(selections, TextSelection, selection_num + 1).start_offset >= end_offset) - ) - { - //Arrange of selections won't change - g_array_index(selections, TextSelection, selection_num).start_offset = - start_offset; - g_array_index(selections, TextSelection, selection_num).end_offset = - end_offset; - g_signal_emit_by_name(text, "text-selection-changed"); - return TRUE; - } - gint start_offset_old = - g_array_index(selections, TextSelection, selection_num).start_offset; - gint end_offset_old = - g_array_index(selections, TextSelection, selection_num).end_offset; - - my_atk_text_remove_selection(text, selection_num); - if(!my_atk_text_add_selection(text, start_offset, end_offset)) - { - //fail when adding selection. Restore initial state. - my_atk_text_add_selection(text, start_offset_old, end_offset_old); - return FALSE; - } - g_signal_emit_by_name(text, "text-selection-changed"); - return TRUE; - -} - -//************************************my_atk_text_get_caret_offset****************** -gint my_atk_text_get_caret_offset(AtkText *text) -{ - MyAtkText *self = (MyAtkText*)text; - return self->caret_offset; -} -//************************************my_atk_text_set_caret_offset****************** -gboolean my_atk_text_set_caret_offset(AtkText *text, gint offset) -{ - MyAtkText *self = (MyAtkText*)text; - //caret may be set just after the last character - if(offset < 0 || offset > my_atk_text_get_character_count(text))return FALSE; - self->caret_offset = offset; - g_signal_emit_by_name(self, "text-caret-moved", offset); - return TRUE; -} - -//***********************my_atk_text_insert_text******************************* -void my_atk_text_insert_text(AtkEditableText* text, const gchar* string, - gint length, gint *position) -{ - gint i; - MyAtkText* myAtkText = (MyAtkText*)text; - gchar *str = myAtkText->str; - gint strlen_old = my_strlen(str); - - if(string == NULL) return; - //correct length - for(i = 0; i < length; i ++) - { - if(string[i] == '\0') {length = i; break;} - } - - if(*position < 0 || *position > strlen_old || length <= 0 )return; - - - gchar *new_str = g_malloc(strlen_old + length + 1); - if(new_str == NULL)return; - - if(*position != 0) - memcpy(new_str, str, (size_t)*position); - memcpy(new_str + *position, string, (size_t)length); - if(strlen_old != *position) - memcpy(new_str + *position + length, str + *position, - (size_t)(strlen_old - *position)); - new_str[strlen_old + length] = '\0'; - - g_free(str); - myAtkText->str = new_str; - correct_selections_after_insert(myAtkText, *position, length); - correct_attributes_after_insert(myAtkText, *position, length); - correct_caret_after_insert(myAtkText, *position, length); - g_signal_emit_by_name(text, "text-changed::insert", *position, length); - g_signal_emit_by_name(text, "text-selection-changed"); - g_signal_emit_by_name(text, "text-attributes-changed"); - g_signal_emit_by_name(text, "text-caret-moved", myAtkText->caret_offset); - - (*position) += length; -} -//*************************my_atk_text_delete_text******************* -void my_atk_text_delete_text(AtkEditableText* text, gint start_pos, gint end_pos) -{ - MyAtkText* myAtkText = (MyAtkText*)text; - gchar *str = myAtkText->str; - gint strlen_old = my_strlen(str); - - if(start_pos < 0 || end_pos > strlen_old || start_pos >= end_pos )return; - if(strlen_old != end_pos) - memmove(str + start_pos, str + end_pos, strlen_old - end_pos); - str[start_pos - end_pos + strlen_old] = '\0'; - - correct_selections_after_delete(myAtkText, start_pos, end_pos - start_pos); - correct_attributes_after_delete(myAtkText, start_pos, end_pos - start_pos); - correct_caret_after_delete(myAtkText, start_pos, end_pos - start_pos); - g_signal_emit_by_name(text, "text-changed::delete", start_pos, end_pos - start_pos); - g_signal_emit_by_name(text, "text-selection-changed"); - g_signal_emit_by_name(text, "text-attributes-changed"); - g_signal_emit_by_name(text, "text-caret-moved", myAtkText->caret_offset); -} -//***********************my_atk_text_set_text_contents************************* -void my_atk_text_set_text_contents(AtkEditableText* text, const gchar* string) -{ - my_atk_text_delete_text(text, 0, my_atk_text_get_character_count((AtkText*)text)); - gint position = 0; - my_atk_text_insert_text(text, string, my_strlen(string), &position); -} -//**********************my_atk_text_copy_text*************************** -void my_atk_text_copy_text(AtkEditableText* text, gint start_pos, gint end_pos) -{ - MyAtkText* myAtkText = (MyAtkText*)text; - const gchar *str = myAtkText->str; - gint strlen_old = my_strlen(str); - if(start_pos < 0 || end_pos > strlen_old || start_pos >= end_pos )return; - - MyAtkTextClass *parent = MY_ATK_TEXT_GET_CLASS(text); - g_free(parent->clipboard); - /*parent->clipboard = g_malloc(end_pos - start_pos + 1); - - strncpy(parent->clipboard, str + start_pos, end_pos - start_pos); - parent->clipboard[end_pos - start_pos] = '\0';*/ - parent->clipboard = g_strndup(str + start_pos, end_pos - start_pos); -} -//**********************my_atk_text_paste_text*************************** -void my_atk_text_paste_text(AtkEditableText *text, gint position) -{ - //NULL-clipboard process corretly - MyAtkTextClass* parent = MY_ATK_TEXT_GET_CLASS(text); - my_atk_text_insert_text(text, parent->clipboard, my_strlen(parent->clipboard), &position); -} -//**********************my_atk_text_cut_text*************************** -void my_atk_text_cut_text(AtkEditableText* text, gint start_pos, gint end_pos) -{ - my_atk_text_copy_text(text, start_pos, end_pos); - my_atk_text_delete_text(text, start_pos, end_pos); -} -//*********************my_atk_text_set_run_attributes************************ -gboolean my_atk_text_set_run_attributes(AtkEditableText* text, AtkAttributeSet* attrib_set, - gint start_offset, gint end_offset) -{ - MyAtkText* self = (MyAtkText*)text; - gint len = atk_text_get_character_count((AtkText*)text); - if(start_offset < 0 || start_offset >= end_offset || end_offset > len) - return FALSE; - GList *attributes = self->attributes; - GList *tmp = attributes; - - while(tmp != NULL) - { - Range *range = (Range*)tmp->data; - if(range->start < start_offset) - { - if(range->end <= end_offset) - { - if(range->end > start_offset) range->end = start_offset; - tmp = tmp->next; - continue; - } - /*range->end > end_offset*/ - Range* additional_range = range_new(end_offset, range->end); - additional_range->attributeSet = attribute_set_copy(range->attributeSet); - range->end = start_offset; - attributes = g_list_insert_before(attributes, tmp->next, additional_range); - tmp = tmp->next; - break; - } - else/*range->start >= start_offset*/ - { - if(range->end <= end_offset) - { - GList *tmp1 = tmp->next; - attributes = g_list_remove_link(attributes, tmp); - tmp = tmp1; - continue; - } - /*range->end > end_offset*/ - if(range->start < end_offset) range->start = end_offset; - break; - } - } - Range *new_range = range_new(start_offset, end_offset); - new_range->attributeSet = attribute_set_copy(attrib_set); - if(tmp == NULL)attributes = g_list_append(attributes, new_range); - else attributes = g_list_insert_before(attributes, tmp, new_range); - - self->attributes = attributes; - g_signal_emit_by_name(self, "text_attributes_changed"); - return TRUE; -} - -//others functions -//sets default attributes -void my_atk_text_set_default_attributes(MyAtkText* text, AtkAttributeSet *set) -{ - atk_attribute_set_free(text->default_attributes); - text->default_attributes = attribute_set_copy(set); - g_signal_emit_by_name(text, "text-attributes-changed"); -} - -void my_atk_text_print_run_attributes(MyAtkText *text) -{ - g_list_foreach(text->attributes, (GFunc)range_print, NULL); -} -void my_atk_text_print_default_attributes(MyAtkText *text) -{ - attribute_set_print(text->default_attributes); -} -//need for separate testing interfaces -void auxiliary_atk_text_set_text_contents(MyAtkText* text, const gchar* string) -{ - my_atk_text_set_text_contents((AtkEditableText*)text, string); -} -void auxiliary_atk_text_set_run_attributes(MyAtkText* text, AtkAttributeSet* attrib_set, - gint start_offset, gint end_offset) -{ - my_atk_text_set_run_attributes((AtkEditableText*)text, attrib_set, start_offset, end_offset); -} - -//initialize/finalize functions -static void my_atk_text_instance_init(GTypeInstance *obj, gpointer g_class) -{ - MyAtkText *self = (MyAtkText*)obj; - - self->str = NULL; - self->attributes = NULL; - self->default_attributes = NULL; - text_bounds_init(&self->bounds); - - self->selections = g_array_new(FALSE, FALSE, sizeof(TextSelection)); - - self->caret_offset = 0; -} -static void my_atk_text_instance_finalize(GObject* obj) -{ - MyAtkText *self = (MyAtkText*)obj; - g_free(self->str); - my_atk_text_free_run_attributes(self); - my_atk_text_free_default_attributes(self); - if(self->selections != NULL)g_array_free(self->selections, FALSE); -} - -static void my_atk_text_class_init(gpointer g_class, gpointer class_data) -{ - GObjectClass* g_object_class = (GObjectClass*)g_class; - //GObject virtual table - g_object_class->finalize = my_atk_text_instance_finalize; - //Fills tables of symbols - table_symbols_init(); - //initialize clipboard - ((MyAtkTextClass*)g_class)->clipboard = NULL; -} -//Because of static registration of type, finalization function will never been called -//And glib prints warning if use it in registration. -/*static void my_atk_text_class_finalize(gpointer g_class, gpointer class_data) -{ - MyAtkTextClass *self = (MyAtkTextClass*)g_class; - - g_free(self->clipboard); - self->clipboard = NULL; -}*/ -void my_atk_text_interface_init(gpointer g_iface, gpointer iface_data) -{ - AtkTextIface *klass = (AtkTextIface*)g_iface; - //"get_text" - klass->get_character_count = my_atk_text_get_character_count; - klass->get_text = my_atk_text_get_text; - klass->get_character_at_offset = my_atk_text_get_character_at_offset; - klass->get_text_after_offset = my_atk_text_get_text_after_offset; - klass->get_text_at_offset = my_atk_text_get_text_at_offset; - klass->get_text_before_offset = my_atk_text_get_text_before_offset; - //"attributes" - klass->get_run_attributes = my_atk_text_get_run_attributes; - klass->get_default_attributes = my_atk_text_get_default_attributes; - //"bounds" - klass->get_character_extents = my_atk_text_get_character_extents; - klass->get_range_extents = my_atk_text_get_range_extents; - klass->get_offset_at_point = my_atk_text_get_offset_at_point; - klass->get_bounded_ranges = my_atk_text_get_bounded_ranges; - //"selection" - klass->get_n_selections = my_atk_text_get_n_selections; - klass->get_selection = my_atk_text_get_selection; - klass->remove_selection = my_atk_text_remove_selection; - klass->add_selection = my_atk_text_add_selection; - klass->set_selection = my_atk_text_set_selection; - //"caret" - klass->get_caret_offset = my_atk_text_get_caret_offset; - klass->set_caret_offset = my_atk_text_set_caret_offset; -} - -static void my_atk_editable_text_interface_init(gpointer g_iface, gpointer iface_data) -{ - AtkEditableTextIface *klass = (AtkEditableTextIface*)g_iface; - - klass->set_text_contents = my_atk_text_set_text_contents; - klass->set_run_attributes = my_atk_text_set_run_attributes; - klass->copy_text = my_atk_text_copy_text; - klass->insert_text = my_atk_text_insert_text; - klass->paste_text = my_atk_text_paste_text; - klass->cut_text = my_atk_text_cut_text; - klass->delete_text = my_atk_text_delete_text; -} -GType my_atk_text_get_type() -{ - static GType type = 0; - if(type == 0) - { - static const GTypeInfo typeInfo = - { - sizeof(MyAtkTextClass), - NULL, //base_init - NULL, //base_finalize - my_atk_text_class_init, //class_init - NULL, //class_finalize - NULL, //class_data - sizeof(MyAtkText), - 0, //n_preallocs - my_atk_text_instance_init //instance_init - }; - - static const GInterfaceInfo AtkTextIface_info = - { - my_atk_text_interface_init, /* interface_init*/ - NULL, /* interface_finalize*/ - NULL /* interface_data */ - }; - static const GInterfaceInfo AtkEditableTextIface_info = - { - my_atk_editable_text_interface_init,/* interface_init*/ - NULL, /* interface_finalize*/ - NULL /* interface_data */ - }; - type = g_type_register_static(MY_TYPE_ATK_OBJECT, "MyAtkText", &typeInfo, 0); - g_type_add_interface_static(type, - ATK_TYPE_TEXT, - &AtkTextIface_info); - - g_type_add_interface_static(type, - ATK_TYPE_EDITABLE_TEXT, - &AtkEditableTextIface_info); - } - return type; -} diff --git a/tests/dummyatk/my-atk-text.h b/tests/dummyatk/my-atk-text.h deleted file mode 100644 index 7a6a73e..0000000 --- a/tests/dummyatk/my-atk-text.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef MY_ATK_TEXT_H -#define MY_ATK_TEXT_H -/* - * MyAtkText: implements AtkText and AtkEditableText - */ -#include - -#include "my-atk-object.h" - -#define MY_TYPE_ATK_TEXT (my_atk_text_get_type ()) -#define MY_ATK_TEXT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_TEXT, MyAtkText)) -#define MY_ATK_TEXT_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_TEXT, MyAtkTextClass)) -#define MY_IS_ATK_TEXT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_TEXT)) -#define MY_IS_ATK_TEXT_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_TEXT)) -#define MY_ATK_TEXT_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_TEXT, MyAtkTextClass)) - -typedef struct _MyAtkText MyAtkText; -typedef struct _MyAtkTextClass MyAtkTextClass; - -//Struct, describing bounds of one selection. -typedef struct -{ - gint start_offset, end_offset; -}TextSelection; -//Struct, describing values, needed for determine extent of characters -typedef struct -{ - gint base_x, base_y;//coordinates of the top-left corner of text - gint pixels_above_line; - gint pixels_below_line; - gint size;//size of the character(height in pixels) - gint pixels_between_characters;//monoscaped font - gint width;//width of character -}TextBounds; - -struct _MyAtkText -{ - MyAtkObject parent; - - gchar* str;//string, containing text - GList* attributes;//running atributes - AtkAttributeSet *default_attributes;//default attributes - - TextBounds bounds; - - GArray* selections; - - gint caret_offset; -}; - -struct _MyAtkTextClass -{ - MyAtkObjectClass parent; - gchar* clipboard; -}; - -GType my_atk_text_get_type(); - -void my_atk_text_interface_init(gpointer g_iface, gpointer iface_data); -#endif /*MY_ATK_TEXT_H*/ diff --git a/tests/dummyatk/my-atk-value.c b/tests/dummyatk/my-atk-value.c deleted file mode 100644 index 3530d4f..0000000 --- a/tests/dummyatk/my-atk-value.c +++ /dev/null @@ -1,113 +0,0 @@ -#include -#include - -#include "my-atk-object.h" -#include "my-atk-value.h" - -//*************************implementation*********************** -//implementation of virtual functions -//******************get_current_value******************* -static void my_atk_value_get_current_value(AtkValue *obj, GValue *value) -{ - g_return_if_fail(MY_IS_ATK_VALUE(obj)); - MyAtkValue* self = (MyAtkValue*)obj; - - g_value_init(value, G_TYPE_INT); - g_value_set_int(value, self->current); -} -//******************get_maximum_value******************* -static void my_atk_value_get_maximum_value(AtkValue *obj, GValue *value) -{ - g_return_if_fail(MY_IS_ATK_VALUE(obj)); - MyAtkValue* self = (MyAtkValue*)obj; - - g_value_init(value, G_TYPE_INT); - g_value_set_int(value, self->maximum); -} -//******************get_minimum_value******************* -static void my_atk_value_get_minimum_value(AtkValue *obj, GValue *value) -{ - g_return_if_fail(MY_IS_ATK_VALUE(obj)); - MyAtkValue* self = (MyAtkValue*)obj; - - g_value_init(value, G_TYPE_INT); - g_value_set_int(value, self->minimum); -} -//******************set_current_value******************* -static gboolean my_atk_value_set_current_value(AtkValue *obj, const GValue *value) -{ - g_return_val_if_fail(MY_IS_ATK_VALUE(obj), FALSE); - MyAtkValue* self = (MyAtkValue*)obj; - - if(self->readonly) return FALSE; - - gint new_value = g_value_get_int(value); - if(new_value < self->minimum || new_value > self->maximum) return FALSE; - - self->current = new_value; - return TRUE; -} - -//others -MyAtkValue* my_atk_value_new(gint minimum, gint maximum, gint current) -{ - MyAtkValue* result = g_object_new(MY_TYPE_ATK_VALUE, NULL); - if(result == NULL) return NULL; - result->minimum = minimum; - result->maximum = maximum; - result->current = current; - - return result; -} -static void my_atk_value_instance_init(GTypeInstance *obj, gpointer g_class) -{ - MyAtkValue *self = (MyAtkValue*)obj; - - self->minimum = 0; - self->maximum = 0; - self->current = 0; - - self->readonly = FALSE; -} -static void my_atk_value_interface_init(gpointer g_iface, gpointer iface_data) -{ - AtkValueIface *klass = (AtkValueIface*)g_iface; - - klass->get_current_value = my_atk_value_get_current_value; - klass->get_minimum_value = my_atk_value_get_minimum_value; - klass->get_maximum_value = my_atk_value_get_maximum_value; - - klass->set_current_value = my_atk_value_set_current_value; -} - -GType my_atk_value_get_type() -{ - static GType type = 0; - if(type == 0) - { - static const GTypeInfo typeInfo = - { - sizeof(MyAtkValueClass), - NULL, //base_init - NULL, //base_finalize - NULL, //class_init - NULL, //class_finalize - NULL, //class_data - sizeof(MyAtkValue), - 0, //n_preallocs - my_atk_value_instance_init //instance_init - }; - - static const GInterfaceInfo iface_info = - { - my_atk_value_interface_init, /* interface_init*/ - NULL, /* interface_finalize*/ - NULL /* interface_data */ - }; - type = g_type_register_static(MY_TYPE_ATK_OBJECT, "MyAtkValue", &typeInfo, 0); - g_type_add_interface_static(type, - ATK_TYPE_VALUE, - &iface_info); - } - return type; -} diff --git a/tests/dummyatk/my-atk-value.h b/tests/dummyatk/my-atk-value.h deleted file mode 100644 index 03ed6d1..0000000 --- a/tests/dummyatk/my-atk-value.h +++ /dev/null @@ -1,34 +0,0 @@ -#ifndef MY_ATK_VALUE_H -#define MY_ATK_VALUE_H -/* - * MyAtkValue: derives AtkObject - * and implements AtkValue - */ -#include - -#define MY_TYPE_ATK_VALUE (my_atk_value_get_type ()) -#define MY_ATK_VALUE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), MY_TYPE_ATK_VALUE, MyAtkValue)) -#define MY_ATK_VALUE_CLASS(vtable) (G_TYPE_CHECK_CLASS_CAST ((vtable), MY_TYPE_ATK_VALUE, MyAtkValueClass)) -#define MY_IS_ATK_VALUE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), MY_TYPE_ATK_VALUE)) -#define MY_IS_ATK_VALUE_CLASS(vtable) (G_TYPE_CHECK_CLASS_TYPE ((vtable), MY_TYPE_ATK_VALUE)) -#define MY_ATK_VALUE_GET_CLASS(inst) (G_TYPE_INSTANCE_GET_CLASS ((inst), MY_TYPE_ATK_VALUE, MyAtkValueClass)) - -typedef struct _MyAtkValue MyAtkValue; -typedef struct _MyAtkValueClass MyAtkValueClass; - -struct _MyAtkValue -{ - MyAtkObject parent; - - gint minimum, maximum, current; - gboolean readonly; -}; - -struct _MyAtkValueClass -{ - MyAtkObjectClass parent; -}; - -MyAtkValue* my_atk_value_new(gint minimum, gint maximium, gint current); -GType my_atk_value_get_type(); -#endif /*MY_ATK_VALUE_H*/ diff --git a/tests/dummyatk/my-atk.h b/tests/dummyatk/my-atk.h deleted file mode 100644 index 935d3d8..0000000 --- a/tests/dummyatk/my-atk.h +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef MY_ATK_H -#define MY_ATK_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#endif /*MY_ATK_H*/ diff --git a/tests/dummyatk/resources_storage.c b/tests/dummyatk/resources_storage.c deleted file mode 100644 index e86051d..0000000 --- a/tests/dummyatk/resources_storage.c +++ /dev/null @@ -1,34 +0,0 @@ -#include - -GHashTable* resources = NULL; - -void resource_storage_init() -{ - if(resources == NULL) - resources = g_hash_table_new_full(g_str_hash, g_str_equal, - (GDestroyNotify)g_free, (GDestroyNotify)g_object_unref); -} - -void resource_storage_free() -{ - if(resources == NULL) return; - g_hash_table_destroy(resources); - resources = NULL; -} - -void resource_storage_add(const gchar* name, AtkObject* resource) -{ - if(resources == NULL) return; - g_hash_table_insert(resources, g_strdup(name), g_object_ref(resource)); -} - -AtkObject* resource_storage_get(const gchar* name) -{ - if(resources == NULL) return NULL; - return g_hash_table_lookup(resources, name); -} -void resources_storage_remove(const gchar* name) -{ - if(resources == NULL) return; - g_hash_table_remove(resources, name); -} diff --git a/tests/dummyatk/resources_storage.h b/tests/dummyatk/resources_storage.h deleted file mode 100644 index 3decd86..0000000 --- a/tests/dummyatk/resources_storage.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef RESOURCES_STORAGE_H -#define RESOURCES_STORAGE_H - -#include - -void resource_storage_init(); - -void resource_storage_free(); - -void resource_storage_add(const gchar* name, AtkObject* resource); - -AtkObject* resource_storage_get(const gchar* name); - -void resources_storage_remove(const gchar* name); - -#endif /*RESOURCES_STORAGE_H*/ diff --git a/tests/dummyatk/useful_functions.c b/tests/dummyatk/useful_functions.c deleted file mode 100644 index 49b6a82..0000000 --- a/tests/dummyatk/useful_functions.c +++ /dev/null @@ -1,29 +0,0 @@ -#include -#include -/* - * Functions and macros widely used in the tests. - */ - -//same as strcmp() == 0 but works properly for NULL pointers -gboolean my_strcmp(const gchar* str1, const gchar* str2) -{ - if(str1 == str2) return TRUE; - if(str1 == NULL || str2 == NULL) return FALSE; - - return strcmp(str1,str2) == 0; -} -//same as strlen but works properly for NULL pointer and returns gint instead of guint -gint my_strlen(const gchar* str) -{ - if(str == NULL)return 0; - return (gint)strlen(str); -} -//same as strncmp() == 0 but works properly for NULL pointers -gboolean my_strncmp(const gchar* str1, const gchar* str2, gint n) -{ - if(n <= 0)return TRUE; - if(str1 == str2)return TRUE; - if(str1 == NULL || str2 == NULL)return FALSE; - - return strncmp(str1, str2, n) == 0; -} diff --git a/tests/dummyatk/useful_functions.h b/tests/dummyatk/useful_functions.h deleted file mode 100644 index 4fbce6c..0000000 --- a/tests/dummyatk/useful_functions.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef USEFUL_FUNCTIONS_H -#define USEFUL_FUNCTIONS_H -/* - * Functions and macros widely used in the tests. - */ - -//macro for creating objects in startup section -#define OBJECT_NEW(obj, type, type_str) obj = g_object_new(type,NULL);\ - if(obj == NULL)\ - {\ - INIT_FAILED("Cannot create instance of type" type_str ".\n");\ - } -//macro for destroying object -#define OBJECT_UNREF(obj) if(obj != NULL)\ - {\ - g_object_unref((gpointer)obj);\ - } -//for testing signals -#define HANDLER_DISCONNECT(obj, h) if((h) != 0)\ - {\ - g_signal_handler_disconnect(obj, h);\ - } - -gboolean my_strcmp(const gchar* str1, const gchar* str2); - -gint my_strlen(const gchar* str); - -gboolean my_strncmp(const gchar* str1, const gchar* str2, gint n); - -#endif /*USEFUL_FUNCTIONS_H*/ diff --git a/tests/dummyatk/user_marshal.c b/tests/dummyatk/user_marshal.c deleted file mode 100644 index 1f8ecf0..0000000 --- a/tests/dummyatk/user_marshal.c +++ /dev/null @@ -1,41 +0,0 @@ -#include - -/* INT:BOXED (marshal.list:1) */ -void -g_cclosure_user_marshal_INT__BOXED (GClosure *closure, - GValue *return_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data) -{ - typedef gint (*GMarshalFunc_INT__BOXED) (gpointer data1, - gpointer arg_1, - gpointer data2); - register GMarshalFunc_INT__BOXED callback; - register GCClosure *cc = (GCClosure*) closure; - register gpointer data1, data2; - gint v_return; - - g_return_if_fail (return_value != NULL); - g_return_if_fail (n_param_values == 2); - - if (G_CCLOSURE_SWAP_DATA (closure)) - { - data1 = closure->data; - data2 = g_value_peek_pointer (param_values + 0); - } - else - { - data1 = g_value_peek_pointer (param_values + 0); - data2 = closure->data; - } - callback = (GMarshalFunc_INT__BOXED) (marshal_data ? marshal_data : cc->callback); - - v_return = callback (data1, - g_marshal_value_peek_boxed (param_values + 1), - data2); - - g_value_set_int (return_value, v_return); -} - diff --git a/tests/dummyatk/user_marshal.h b/tests/dummyatk/user_marshal.h deleted file mode 100644 index a845925..0000000 --- a/tests/dummyatk/user_marshal.h +++ /dev/null @@ -1,60 +0,0 @@ -#ifndef USER_MARSHAL_H -#define USER_MARSHAL_H - -#include - - -#ifdef G_ENABLE_DEBUG -#define g_marshal_value_peek_boolean(v) g_value_get_boolean (v) -#define g_marshal_value_peek_char(v) g_value_get_char (v) -#define g_marshal_value_peek_uchar(v) g_value_get_uchar (v) -#define g_marshal_value_peek_int(v) g_value_get_int (v) -#define g_marshal_value_peek_uint(v) g_value_get_uint (v) -#define g_marshal_value_peek_long(v) g_value_get_long (v) -#define g_marshal_value_peek_ulong(v) g_value_get_ulong (v) -#define g_marshal_value_peek_int64(v) g_value_get_int64 (v) -#define g_marshal_value_peek_uint64(v) g_value_get_uint64 (v) -#define g_marshal_value_peek_enum(v) g_value_get_enum (v) -#define g_marshal_value_peek_flags(v) g_value_get_flags (v) -#define g_marshal_value_peek_float(v) g_value_get_float (v) -#define g_marshal_value_peek_double(v) g_value_get_double (v) -#define g_marshal_value_peek_string(v) (char*) g_value_get_string (v) -#define g_marshal_value_peek_param(v) g_value_get_param (v) -#define g_marshal_value_peek_boxed(v) g_value_get_boxed (v) -#define g_marshal_value_peek_pointer(v) g_value_get_pointer (v) -#define g_marshal_value_peek_object(v) g_value_get_object (v) -#else /* !G_ENABLE_DEBUG */ -/* WARNING: This code accesses GValues directly, which is UNSUPPORTED API. - * Do not access GValues directly in your code. Instead, use the - * g_value_get_*() functions - */ -#define g_marshal_value_peek_boolean(v) (v)->data[0].v_int -#define g_marshal_value_peek_char(v) (v)->data[0].v_int -#define g_marshal_value_peek_uchar(v) (v)->data[0].v_uint -#define g_marshal_value_peek_int(v) (v)->data[0].v_int -#define g_marshal_value_peek_uint(v) (v)->data[0].v_uint -#define g_marshal_value_peek_long(v) (v)->data[0].v_long -#define g_marshal_value_peek_ulong(v) (v)->data[0].v_ulong -#define g_marshal_value_peek_int64(v) (v)->data[0].v_int64 -#define g_marshal_value_peek_uint64(v) (v)->data[0].v_uint64 -#define g_marshal_value_peek_enum(v) (v)->data[0].v_long -#define g_marshal_value_peek_flags(v) (v)->data[0].v_ulong -#define g_marshal_value_peek_float(v) (v)->data[0].v_float -#define g_marshal_value_peek_double(v) (v)->data[0].v_double -#define g_marshal_value_peek_string(v) (v)->data[0].v_pointer -#define g_marshal_value_peek_param(v) (v)->data[0].v_pointer -#define g_marshal_value_peek_boxed(v) (v)->data[0].v_pointer -#define g_marshal_value_peek_pointer(v) (v)->data[0].v_pointer -#define g_marshal_value_peek_object(v) (v)->data[0].v_pointer -#endif /* !G_ENABLE_DEBUG */ - - -void -g_cclosure_user_marshal_INT__BOXED (GClosure *closure, - GValue *return_value, - guint n_param_values, - const GValue *param_values, - gpointer invocation_hint, - gpointer marshal_data); - -#endif /*USER_MARSHAL_H*/ diff --git a/tests/pyatspi/Makefile.am b/tests/pyatspi/Makefile.am deleted file mode 100644 index 97213ce..0000000 --- a/tests/pyatspi/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ -SUBDIRS = pasytest - -EXTRA_DIST = \ - accessibletest.py\ - actiontest.py\ - componenttest.py\ - desktoptest.py\ - statetest.py\ - Makefile.am\ - Makefile.in\ - setvars.sh\ - relationtest.py\ - runtests.sh\ - testrunner - -TESTS_ENVIRONMENT = top_builddir=$(top_builddir) top_srcdir=$(top_srcdir) - -TESTS = runtests.sh - -CLEANFILES = *.pyc diff --git a/tests/pyatspi/accessibletest.py b/tests/pyatspi/accessibletest.py deleted file mode 100644 index 6cd2cdd..0000000 --- a/tests/pyatspi/accessibletest.py +++ /dev/null @@ -1,219 +0,0 @@ -import dbus -import gobject -import os.path - -from xml.dom import minidom -import os - -from pasytest import PasyTest as _PasyTest - -import pyatspi -from pyatspi import StateSet - -st = [pyatspi.STATE_MULTI_LINE, - pyatspi.STATE_MODAL, - pyatspi.STATE_INDETERMINATE, - pyatspi.STATE_SUPPORTS_AUTOCOMPLETION, - pyatspi.STATE_VERTICAL,] - -def _createNode(accessible, parentElement): - e = minidom.Element("accessible") - - e.attributes["name"] = accessible.name - e.attributes["role"] = str(int(accessible.getRole())) - e.attributes["description"] = accessible.description - - for i in range(0, accessible.childCount): - _createNode(accessible.getChildAtIndex(i), e) - - parentElement.appendChild(e) - -class AccessibleTest(_PasyTest): - - __tests__ = ["setup", - "test_name", - "test_getChildAtIndex", - "test_isEqual", - "test_getApplication", - "test_getAttributes", - "test_parent", - "test_getIndexInParent", - "test_getLocalizedRoleName", - "test_getRelationSet", - "test_getRole", - "test_getRoleName", - "test_getState", - "test_childCount", - "test_description", - "test_tree", - "teardown", - ] - - def __init__(self, bus, path): - _PasyTest.__init__(self, "Accessible", False) - self._bus = bus - self._path = path - - def setup(self, test): - self._registry = pyatspi.Registry() - print self._path - self._desktop = self._registry.getDesktop(0) - - def test_name(self, test): - root = self._desktop.getChildAtIndex(0) - test.assertEqual(root.name, "main", "Expected name - \"main\". Recieved - \"%s\"" % (root.name,)) - - def test_getChildAtIndex(self, test): - root = self._desktop.getChildAtIndex(0) - a = root.getChildAtIndex(0) - test.assertEqual(a.name, "gnome-settings-daemon", - "Expected name - \"gnome-settings-daemon\". Recieved - \"%s\"" % (a.name,)) - b = root.getChildAtIndex(1) - test.assertEqual(b.name, "gnome-panel", - "Expected name - \"gnome-panel\". Recieved - \"%s\"" % (b.name,)) - c = root.getChildAtIndex(2) - test.assertEqual(c.name, "nautilus", - "Expected name - \"nautilus\". Recieved - \"%s\"" % (c.name,)) - - def test_isEqual(self, test): - root = self._desktop.getChildAtIndex(0) - - a = root.getChildAtIndex(1) - if not a.isEqual(a): - test.fail("Same accessible found unequal to self") - - b = root.getChildAtIndex(1) - if not a.isEqual(b): - test.fail("Similar accessibles found unequal") - if not b.isEqual(a): - test.fail("Similar accessibles found unequal") - - c = root.getChildAtIndex(2) - if c.isEqual(a): - test.fail("Different accessibles found equal") - if a.isEqual(c): - test.fail("Different accessibles found equal") - - def test_getApplication(self, test): - root = self._desktop.getChildAtIndex(0) - application = root.getApplication() - if not root.isEqual(application): - test.fail("Root accessible does not provide itself as its Application") - - a = root.getChildAtIndex(1) - application = a.getApplication() - if not root.isEqual(application): - test.fail("Child accessible does not provide the root as its Application") - - - def test_getAttributes(self, test): - root = self._desktop.getChildAtIndex(0) - attr = root.getAttributes() - res = ["foo:bar", "baz:qux", "quux:corge"] - attr.sort() - res.sort() - test.assertEqual(attr, res, "Attributes expected %s, recieved %s" % (attr, res)) - - def test_parent(self, test): - root = self._desktop.getChildAtIndex(0) - - a = root.getChildAtIndex(1) - pa = a.parent - if not root.isEqual(pa): - test.fail("Child does not correctly report its parent") - - def test_getIndexInParent(self, test): - root = self._desktop.getChildAtIndex(0) - - for i in range(0, root.childCount): - child = root.getChildAtIndex(i) - test.assertEqual(i, child.getIndexInParent(), "Childs index in parent reported incorrectly") - - def test_getLocalizedRoleName(self, test): - root = self._desktop.getChildAtIndex(0) - - ans = "window" - res = root.getLocalizedRoleName() - test.assertEqual(ans, res, - "Expected LocalizedRoleName - \"%s\". Recieved - \"%s\"" % (ans, res,)) - - a = root.getChildAtIndex(1) - a = a.getChildAtIndex(0) - ans = "html container" - res = a.getLocalizedRoleName() - test.assertEqual(ans, res, - "Expected LocalizedRoleName - \"%s\". Recieved - \"%s\"" % (ans, res,)) - - def test_getRelationSet(self, test): - root = self._desktop.getChildAtIndex(0) - # Complete test of Relation interface is separate - rset = root.getRelationSet() - - def test_getRole(self, test): - root = self._desktop.getChildAtIndex(0) - test.assertEqual(root.getRole(), 69, - "Expected role - \"69\". Recieved - \"%d\"" % (int(root.getRole()),)) - - def test_getRoleName(self, test): - root = self._desktop.getChildAtIndex(0) - - ans = "window" - res = root.getRoleName() - test.assertEqual(ans, res, - "Expected roleName - \"%s\". Recieved - \"%s\"" % (ans, res,)) - - a = root.getChildAtIndex(1) - a = a.getChildAtIndex(0) - ans = "html container" - res = a.getRoleName() - test.assertEqual(ans, res, - "Expected roleName - \"%s\". Recieved - \"%s\"" % (ans, res,)) - - def test_getState(self, test): - root = self._desktop.getChildAtIndex(0) - state = root.getState() - res = StateSet(*st) - if not res.equals(state): - test.fail("States not reported correctly") - - def test_childCount(self, test): - root = self._desktop.getChildAtIndex(0) - test.assertEqual(root.childCount, 11, - "Expected role - \"11\". Recieved - \"%d\"" % (root.childCount,)) - - def test_description(self, test): - root = self._desktop.getChildAtIndex(0) - description = "The main accessible object, root of the accessible tree" - test.assertEqual(root.description, description, - "Expected description - \"%s\". Recieved - \"%s\"" % (description, root.description,)) - - def test_tree(self, test): - """ - This is a mild stress test for the - methods: - - getChildAtIndex - - And the attributes: - - name - description - - It checks a tree of these values is correctly - passed from Application to AT. - """ - root = self._desktop.getChildAtIndex(0) - - doc = minidom.Document() - _createNode(root, doc) - answer = doc.toprettyxml() - - correct = os.path.join(os.environ["TEST_DATA_DIRECTORY"], - "accessible-test-results.xml") - file = open(correct) - cstring = file.read() - - test.assertEqual(answer, cstring, "Object tree not passed correctly") - - def teardown(self, test): - pass diff --git a/tests/pyatspi/actiontest.py b/tests/pyatspi/actiontest.py deleted file mode 100644 index 405f898..0000000 --- a/tests/pyatspi/actiontest.py +++ /dev/null @@ -1,73 +0,0 @@ -import dbus -import gobject -import os.path - -from xml.dom import minidom -import os - -from pasytest import PasyTest as _PasyTest - -import pyatspi - -class ActionTest(_PasyTest): - - __tests__ = ["setup", - "test_nActions", - "test_getDescription", - "test_getName", - "test_doAction", - "test_getKeyBinding", - "teardown", - ] - - def __init__(self, bus, path): - _PasyTest.__init__(self, "Action", False) - self._bus = bus - self._path = path - - def setup(self, test): - self._registry = pyatspi.Registry() - self._desktop = self._registry.getDesktop(0) - - def test_nActions(self, test): - root = self._desktop[0] - root = root.queryAction() - nact = root.nActions - test.assertEqual(nact, 10, "nActions expected %d, recieved %d" % (10, nact)) - - def test_getName(self, test): - root = self._desktop[0] - root = root.queryAction() - name = root.getName(0) - test.assertEqual(name, "First action", "Name expected %s, recieved %s" % ("First action", name)) - name = root.getName(1) - test.assertEqual(name, "Action", "Name expected %s, recieved %s" % ("Action", name)) - - def test_getDescription(self, test): - root = self._desktop[0] - root = root.queryAction() - description = root.getDescription(0) - expected = "First action performed" - test.assertEqual(description, expected, "Description expected %s, recieved %s" % (expected, description)) - description = root.getDescription(1) - expected = "Description of action" - test.assertEqual(description, expected, "Description expected %s, recieved %s" % (expected, description)) - - def test_doAction(self, test): - root = self._desktop[0] - root = root.queryAction() - #TODO have event emitted to check action has been performed - for i in range(0, root.nActions): - root.doAction(i) - - def test_getKeyBinding(self, test): - root = self._desktop[0] - root = root.queryAction() - for i in range(0, root.nActions): - keybinding = root.getKeyBinding(i) - expected = "%s" % (i,) - test.assertEqual(keybinding, expected, - "Keybinding expected %s, recieved %s" % (expected, keybinding)) - - def teardown(self, test): - pass diff --git a/tests/pyatspi/componenttest.py b/tests/pyatspi/componenttest.py deleted file mode 100644 index fe30c88..0000000 --- a/tests/pyatspi/componenttest.py +++ /dev/null @@ -1,145 +0,0 @@ -import dbus -import gobject -import os.path - -from xml.dom import minidom -import os - -from pasytest import PasyTest as _PasyTest - -import pyatspi -from pyatspi import Accessible -from pyatspi import BoundingBox - -ATSPI_LAYER_WIDGET = 3 -ATSPI_LAYER_MDI = 4 -ATSPI_LAYER_WINDOW = 7 - -extents_expected = [(0,0,30,20), (40,30,30,40), (0,0,70,70)] -sizes_expected = [(30,20), (30,40), (70,70)] -positions_expected = [(0,0), (40,30), (0,0)] -layers_expected = [ATSPI_LAYER_WINDOW, ATSPI_LAYER_WIDGET, ATSPI_LAYER_MDI] -zorders_expected = [-100, 100] - -class ComponentTest(_PasyTest): - - __tests__ = ["setup", - "test_contains", - "test_getAccessibleAtPoint", - "test_getExtents", - "test_getPosition", - "test_getSize", - "test_getLayer", - "test_getMDIZOrder", - "test_grabFocus", - "test_registerFocusHandler", - "test_deregisterFocusHandler", - "test_getAlpha", - "teardown", - ] - - def __init__(self, bus, path): - _PasyTest.__init__(self, "Component", False) - self._bus = bus - self._path = path - - def setup(self, test): - self._registry = pyatspi.Registry() - self._desktop = self._registry.getDesktop(0) - - def test_contains(self, test): - pass - - def test_getAccessibleAtPoint(self, test): - pass - - def test_getExtents(self, test): - root = self._desktop.getChildAtIndex(0) - one = root.getChildAtIndex(0) - two = root.getChildAtIndex(1) - - comps = [one.queryComponent(), - two.queryComponent(), - root.queryComponent(),] - - for expected, comp in zip(extents_expected, comps): - extents = comp.getExtents(0) - test.assertEqual(extents, BoundingBox(*expected), - "Extents not correct. Expected (%d, %d, %d, %d), Recieved (%d, %d, %d, %d)" - % (expected[0], expected[1], expected[2], expected[3], - extents[0], extents[1], extents[2], extents[3])) - - def test_getPosition(self, test): - pass - root = self._desktop.getChildAtIndex(0) - one = root.getChildAtIndex(0) - two = root.getChildAtIndex(1) - - comps = [one.queryComponent(), - two.queryComponent(), - root.queryComponent(),] - - for expected, comp in zip(positions_expected, comps): - position = comp.getPosition(0) - test.assertEqual(position, expected, - "Position not correct. Expected (%d, %d) Recieved (%d, %d)" - % (expected[0], expected[1], position[0], position[1])) - - def test_getSize(self, test): - root = self._desktop.getChildAtIndex(0) - one = root.getChildAtIndex(0) - two = root.getChildAtIndex(1) - - comps = [one.queryComponent(), - two.queryComponent(), - root.queryComponent(),] - - for expected, comp in zip(sizes_expected, comps): - size = comp.getSize() - test.assertEqual(size, expected, - "Size not correct. Expected (%d, %d) Recieved (%d, %d)" - % (expected[0], expected[1], size[0], size[1])) - - def test_getLayer(self, test): - root = self._desktop.getChildAtIndex(0) - one = root.getChildAtIndex(0) - two = root.getChildAtIndex(1) - - comps = [one.queryComponent(), - two.queryComponent(), - root.queryComponent(),] - - for expected, comp in zip(layers_expected, comps): - layer = comp.getLayer() - test.assertEqual(layer, expected, - "Layer not correct. Expected %d, Recieved %d" - % (int(layer), int(expected))) - - def test_getMDIZOrder(self, test): - root = self._desktop.getChildAtIndex(0) - one = root.getChildAtIndex(0) - two = root.getChildAtIndex(1) - - comps = [two.queryComponent(), - root.queryComponent(),] - - for expected, comp in zip(zorders_expected, comps): - mdizo = comp.getMDIZOrder() - test.assertEqual(mdizo, expected, - "ZOrder not correct. Expected %d, Recieved %d" - % (expected, mdizo)) - - def test_grabFocus(self, test): - pass - - def test_registerFocusHandler(self, test): - pass - - def test_deregisterFocusHandler(self, test): - pass - - def test_getAlpha(self, test): - pass - - def teardown(self, test): - pass diff --git a/tests/pyatspi/desktoptest.py b/tests/pyatspi/desktoptest.py deleted file mode 100644 index 409f634..0000000 --- a/tests/pyatspi/desktoptest.py +++ /dev/null @@ -1,184 +0,0 @@ -import dbus -import gobject -import os.path - -from xml.dom import minidom -import os - -from pasytest import PasyTest as _PasyTest - -import pyatspi - -class DesktopTest(_PasyTest): - - __tests__ = ["setup", - "test_name", - "test_getChildAtIndex", - "test_isEqual", - "test_getApplication", - "test_getAttributes", - "test_parent", - "test_getIndexInParent", - "test_getLocalizedRoleName", - "test_getRelationSet", - "test_getRole", - "test_getRoleName", - "test_getState", - "test_childCount", - "test_description", - "test_contains", - "test_getAccessibleAtPoint", - "test_getExtents", - "test_getPosition", - "test_getSize", - "test_getLayer", - "test_getMDIZOrder", - "test_grabFocus", - "test_registerFocusHandler", - "test_deregisterFocusHandler", - "test_getAlpha", - "teardown", - ] - - def __init__(self, bus, path): - _PasyTest.__init__(self, "Desktop", False) - self._bus = bus - self._path = path - - def setup(self, test): - self._registry = pyatspi.Registry() - self._desktop = self._registry.getDesktop(0) - - def test_name(self, test): - name = self._desktop.name - test.assertEqual(name, "main", "Expected name - \"main\". Recieved - \"%s\"" % (name,)) - - def test_getChildAtIndex(self, test): - root = self._desktop.getChildAtIndex(0) - test.assertEqual(root.name, "main", - "Expected name - \"main\". Recieved - \"%s\"" % (root.name,)) - - def test_isEqual(self, test): - if not self._desktop.isEqual(self._desktop): - test.fail("Same accessible found unequal to self") - - root = self._desktop.getChildAtIndex(0) - if root.isEqual(self._desktop): - test.fail("Different accessibles found equal") - if self._desktop.isEqual(root): - test.fail("Different accessibles found equal") - - def test_getApplication(self, test): - test.assertEqual(self._desktop.getApplication(), None, - "Expected application - \"None\". Recieved - \"%s\"" % (self._desktop.getApplication(),)) - - def test_getAttributes(self, test): - test.assertEqual(self._desktop.getAttributes(), [], - "Expected attributes - \"[]\". Recieved - \"%s\"" % (self._desktop.getAttributes(),)) - - def test_parent(self, test): - test.assertEqual(self._desktop.parent, None, - "Expected parent - \"None\". Recieved - \"%s\"" % (self._desktop.parent,)) - - def test_getIndexInParent(self, test): - test.assertEqual(self._desktop.getIndexInParent(), -1, - "Expected index - \"-1\". Recieved - \"%d\"" % (self._desktop.getIndexInParent(),)) - - def test_getLocalizedRoleName(self, test): - ans = "unknown" - res = self._desktop.getLocalizedRoleName() - test.assertEqual(ans, res, - "Expected LocalizedRoleName - \"%s\". Recieved - \"%s\"" % (ans, res,)) - - def test_getRelationSet(self, test): - rset = self._desktop.getRelationSet() - test.assertEqual(rset, [], - "Expected relation set - \"[]\". Recieved - \"%s\"" % (rset,)) - - def test_getRole(self, test): - test.assertEqual(self._desktop.getRole(), pyatspi.ROLE_UNKNOWN, - "Expected role - \"ROLE_UNKNOWN\". Recieved - \"%s\"" % (self._desktop.getRole(),)) - - def test_getRoleName(self, test): - ans = "unknown" - res = self._desktop.getRoleName() - test.assertEqual(ans, res, - "Expected RoleName - \"%s\". Recieved - \"%s\"" % (ans, res,)) - - def test_getState(self, test): - state = self._desktop.getState() - res = pyatspi.StateSet() - if not state.equals(res): - test.fail("Desktop state set is not empty") - - def test_childCount(self, test): - test.assertEqual(self._desktop.childCount, 1, - "Expected childCount - \"1\". Recieved - \"%d\"" % (self._desktop.childCount,)) - - def test_description(self, test): - description = "" - test.assertEqual(self._desktop.description, description, - "Expected description - \"%s\". Recieved - \"%s\"" % (description, self._desktop.description,)) - - def test_contains(self, test): - pass - - def test_getAccessibleAtPoint(self, test): - pass - - def test_getExtents(self, test): - comp = self._desktop.queryComponent() - - extents = comp.getExtents(0) - expected = pyatspi.BoundingBox(*(0,0,1024, 768)) - test.assertEqual(extents, expected, - "Extents not correct. Expected (%d, %d, %d, %d), Recieved (%d, %d, %d, %d)" - % (expected[0], expected[1], expected[2], expected[3], - extents[0], extents[1], extents[2], extents[3])) - - def test_getPosition(self, test): - comp = self._desktop.queryComponent() - - position = comp.getPosition(0) - test.assertEqual(position, (0,0), - "Position not correct. Expected (%d, %d) Recieved (%d, %d)" - % (0, 0, position[0], position[1])) - - def test_getSize(self, test): - comp = self._desktop.queryComponent() - - size = comp.getSize() - test.assertEqual(size, (1024, 768), - "Size not correct. Expected (%d, %d) Recieved (%d, %d)" - % (1024, 768, size[0], size[1])) - - def test_getLayer(self, test): - comp = self._desktop.queryComponent() - - layer = comp.getLayer() - test.assertEqual(layer, pyatspi.LAYER_WIDGET, - "Layer not correct. Expected %d, Recieved %d" - % (layer, pyatspi.LAYER_WIDGET)) - - def test_getMDIZOrder(self, test): - comp = self._desktop.queryComponent() - - mdizo = comp.getMDIZOrder() - test.assertEqual(mdizo, 0, - "ZOrder not correct. Expected %d, Recieved %d" - % (0, mdizo)) - - def test_grabFocus(self, test): - pass - - def test_registerFocusHandler(self, test): - pass - - def test_deregisterFocusHandler(self, test): - pass - - def test_getAlpha(self, test): - pass - - def teardown(self, test): - pass diff --git a/tests/pyatspi/pasytest/Events.py b/tests/pyatspi/pasytest/Events.py deleted file mode 100644 index 8e340ff..0000000 --- a/tests/pyatspi/pasytest/Events.py +++ /dev/null @@ -1,78 +0,0 @@ -#C#-Style Events in Python -#Taken from http://code.activestate.com/recipes/410686/ -#By Zoran Isailovski - -class Events: - def __getattr__(self, name): - if hasattr(self.__class__, '__events__'): - assert name in self.__class__.__events__, \ - "Event '%s' is not declared" % name - self.__dict__[name] = ev = _EventSlot(name) - return ev - def __repr__(self): return 'Events' + str(list(self)) - __str__ = __repr__ - def __len__(self): return NotImplemented - def __iter__(self): - def gen(dictitems=self.__dict__.items()): - for attr, val in dictitems: - if isinstance(val, _EventSlot): - yield val - return gen() - -#------------------------------------------------------------------------------ - -class _EventSlot: - def __init__(self, name): - self.targets = [] - self.__name__ = name - def __repr__(self): - return 'event ' + self.__name__ - def __call__(self, *a, **kw): - for f in self.targets: f(*a, **kw) - def __iadd__(self, f): - self.targets.append(f) - return self - def __isub__(self, f): - while f in self.targets: self.targets.remove(f) - return self - -#------------------------------------------------------------------------------ - -if __name__ == '__main__': - - class MyEvents(Events): - __events__ = ('OnChange', ) - - class ValueModel(object): - def __init__(self): - self.events = MyEvents() - self.__value = None - def __set(self, value): - if (self.__value == value): return - self.__value = value - self.events.OnChange() - ##self.events.OnChange2() # would fail - def __get(self): - return self.__value - Value = property(__get, __set, None, 'The actual value') - - class SillyView(object): - def __init__(self, model): - self.model = model - model.events.OnChange += self.DisplayValue - ##model.events.OnChange2 += self.DisplayValue # would raise exeception - def DisplayValue(self): - print self.model.Value - - - model = ValueModel() - view = SillyView(model) - - print '\n--- Events Demo ---' - # Events in action - for i in range(5): - model.Value = 2*i + 1 - # Events introspection - print model.events - for event in model.events: - print event diff --git a/tests/pyatspi/pasytest/Makefile.am b/tests/pyatspi/pasytest/Makefile.am deleted file mode 100644 index 1fa89ed..0000000 --- a/tests/pyatspi/pasytest/Makefile.am +++ /dev/null @@ -1,6 +0,0 @@ -EXTRA_DIST = \ - Events.py\ - Pasy.py\ - __init__.py - -CLEANFILES = *.pyc diff --git a/tests/pyatspi/pasytest/Pasy.py b/tests/pyatspi/pasytest/Pasy.py deleted file mode 100644 index 80318ee..0000000 --- a/tests/pyatspi/pasytest/Pasy.py +++ /dev/null @@ -1,146 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#his program is free software; you can redistribute it and/or modify -#it under the terms of the GNU General Public License as published by -#the Free Software Foundation; either version 2 of the License, or -#(at your option) any later version. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -import gobject -from Events import Events - -import traceback - -PASY_TEST_NOT_STARTED = 0 -PASY_TEST_IN_PROGRESS = 1 -PASY_TEST_FAIL = 2 -PASY_TEST_WIN = 3 - -class PasyEvents(Events): - __events__ = ('finished', ) - -class PasyTestStep(object): - - def __init__(self, name): - self.events = PasyEvents() - self._state = PASY_TEST_NOT_STARTED - - self._name = name - - def win(self): - if self._state == PASY_TEST_IN_PROGRESS: - self._state = PASY_TEST_WIN - self.events.finished() - - def fail(self, msg): - if self._state == PASY_TEST_IN_PROGRESS: - self._state = PASY_TEST_FAIL - self.failMsg = msg - self.events.finished() - - def assertEqual(self, a, b, msg): - if a != b: - self.fail(msg) - - def assertNotEqual(self, a, b, msg): - if a == b: - self.fail(msg) - - def run(self): - self._state = PASY_TEST_IN_PROGRESS - self.entry() - - def report(self): - if self._state == PASY_TEST_WIN: - return "%s - PASSED" % (self._name,) - elif self._state == PASY_TEST_FAIL: - return "%s - FAILED - %s" % (self._name, self.failMsg) - else: - return "%s - INCOMPLETE" % (self._name,) - - @property - def state(self): - return self._state - -class PasyTestFunc(PasyTestStep): - - def __init__(self, name, func): - PasyTestStep.__init__(self, name) - self._func = func - - def entry(self): - try: - self._func(self) - except Exception, e: - self.fail(e.message) - traceback.print_exc() - self.win() - -class PasyTest(PasyTestStep): - - __tests__ = [] - - def __init__(self, name, cont): - PasyTestStep.__init__(self, name) - - self._cont = cont - self._tests = [] - - for name in self.__tests__: - func = getattr(self, name) - self._addfunc(func.func_name, func) - - def _addfunc(self, name, func): - functest = PasyTestFunc(func.func_name, func) - self._tests.append(functest) - - def entry(self): - self._iter = self._test_iterator() - gobject.idle_add(self.idle_handler) - - def idle_handler(self): - try: - step = self._iter.next() - def finished_handler(): - if step.state == PASY_TEST_WIN or self._cont == True: - gobject.idle_add(self.idle_handler) - elif step.state == PASY_TEST_FAIL and self._cont == False: - self.fail("Sub test %s Failed" % step._name) - step.events.finished += finished_handler - step.run() - except StopIteration: - # No More tests, check for success or fail - succeeded = True - for test in self._tests: - succeeded = succeeded and (test.state == PASY_TEST_WIN) - if succeeded: - self.win() - else: - self.fail() - return False - - def _test_iterator(self): - for test in self._tests: - yield test - - def report(self): - if self._state == PASY_TEST_WIN: - header = "%s - PASSED" % (self._name,) - elif self._state == PASY_TEST_FAIL: - header = "%s - FAILED" % (self._name,) - else: - header = "%s - INCOMPLETE" %s (self._name,) - - step_messages = [] - for test in self._tests: - step_messages.append(test.report()) - - step_report = "\n\t".join(step_messages) - return header + "\n\t" + step_report diff --git a/tests/pyatspi/pasytest/__init__.py b/tests/pyatspi/pasytest/__init__.py deleted file mode 100644 index c54bff1..0000000 --- a/tests/pyatspi/pasytest/__init__.py +++ /dev/null @@ -1,16 +0,0 @@ -#Copyright (C) 2008 Codethink Ltd - -#his program is free software; you can redistribute it and/or modify -#it under the terms of the GNU General Public License as published by -#the Free Software Foundation; either version 2 of the License, or -#(at your option) any later version. - -#This program is distributed in the hope that it will be useful, -#but WITHOUT ANY WARRANTY; without even the implied warranty of -#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -#GNU General Public License for more details. -#You should have received a copy of the GNU General Public License -#along with this program; if not, write to the Free Software -#Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -from Pasy import PasyTestStep, PasyTestFunc, PasyTest diff --git a/tests/pyatspi/relationtest.py b/tests/pyatspi/relationtest.py deleted file mode 100644 index 77ce31c..0000000 --- a/tests/pyatspi/relationtest.py +++ /dev/null @@ -1,70 +0,0 @@ -import dbus -import gobject -import os.path - -from xml.dom import minidom -import os - -from pasytest import PasyTest as _PasyTest - -import pyatspi - -class RelationTest(_PasyTest): - - __tests__ = ["setup", - "teardown", - "test_getRelationType", - "test_getRelationTypeName", - "test_getNTargets", - "test_getTarget", - ] - - def __init__(self, bus, path): - _PasyTest.__init__(self, "Relation", False) - self._bus = bus - self._path = path - - def setup(self, test): - self._registry = pyatspi.Registry() - self._desktop = self._registry.getDesktop(0) - self._root = self._desktop[0] - self._rset = self._root.getRelationSet() - test.assertEqual(len(self._rset), 4, "Num relations expected %d, recieved %d" % (6, len(self._rset))) - - def test_getRelationType(self, test): - expected = [pyatspi.RELATION_EMBEDS, - pyatspi.RELATION_PARENT_WINDOW_OF, - pyatspi.RELATION_DESCRIBED_BY, - pyatspi.RELATION_POPUP_FOR,] - rtypes = [rel.getRelationType() for rel in self._rset] - for exp, type in zip(expected, rtypes): - test.assertEqual(exp, type, "Relation type expected %s, recieved %s" % (exp, type)) - - def test_getRelationTypeName(self, test): - # FIXME This may not have been implemented in CORBA. - # Completely unused? - pass - - def test_getNTargets(self, test): - expected = [1, 1, 1, 3] - ntargs = [rel.getNTargets() for rel in self._rset] - for exp, ntarg in zip(expected, ntargs): - test.assertEqual(exp, ntarg, "Number of targets expected %s, recieved %s" % (exp, ntarg)) - - def test_getTarget(self, test): - rone = self._rset[0] - tone = rone.getTarget(0) - tonename = tone.name - test.assertEqual(tonename, "r1", "Target name expected %s, recieved %s" % ("r1", tonename)) - tonerole = tone.getRoleName() - test.assertEqual(tonerole, "invalid", "Target RoleName expected %s, recieved %s" % ("invalid", tonename)) - - rtwo = self._rset[3] - ttwo = rtwo.getTarget(2) - ttwoname = ttwo.name - test.assertEqual(ttwoname, "m3", "Target name expected %s, recieved %s" % ("m3", ttwoname)) - ttworole = ttwo.getRoleName() - test.assertEqual(ttworole, "invalid", "Target RoleName expected %s, recieved %s" % ("invalid", ttwoname)) - - def teardown(self, test): - pass diff --git a/tests/pyatspi/runtests.sh b/tests/pyatspi/runtests.sh deleted file mode 100755 index 1ef1295..0000000 --- a/tests/pyatspi/runtests.sh +++ /dev/null @@ -1,12 +0,0 @@ -export PYTHONPATH=$top_srcdir - -export TEST_DATA_DIRECTORY=$top_srcdir/tests/data -export TEST_ATSPI_LIBRARY=$top_builddir/atk-adaptor/.libs/libspiatk.so -export TEST_MODULES_DIRECTORY=$top_builddir/tests/apps/.libs -export TEST_APPLICATION=$top_builddir/tests/apps/test-application - -$PYTHON $top_srcdir/tests/pyatspi/testrunner -l libaccessibleapp.so -m accessibletest -n AccessibleTest -$PYTHON $top_srcdir/tests/pyatspi/testrunner -l libactionapp.so -m actiontest -n ActionTest -$PYTHON $top_srcdir/tests/pyatspi/testrunner -l libcomponentapp.so -m componenttest -n ComponentTest -$PYTHON $top_srcdir/tests/pyatspi/testrunner -l librelationapp.so -m relationtest -n RelationTest -$PYTHON $top_srcdir/tests/pyatspi/testrunner -l libaccessibleapp.so -m statetest -n StateTest diff --git a/tests/pyatspi/setvars.sh b/tests/pyatspi/setvars.sh deleted file mode 100644 index d9638a2..0000000 --- a/tests/pyatspi/setvars.sh +++ /dev/null @@ -1,6 +0,0 @@ -export PYTHONPATH=../../ - -export TEST_DATA_DIRECTORY=../data -export TEST_ATSPI_LIBRARY=../../atk-adaptor/.libs/libspiatk.so -export TEST_MODULES_DIRECTORY=../apps/.libs -export TEST_APPLICATION=../apps/test-application diff --git a/tests/pyatspi/statetest.py b/tests/pyatspi/statetest.py deleted file mode 100644 index 223cf6e..0000000 --- a/tests/pyatspi/statetest.py +++ /dev/null @@ -1,101 +0,0 @@ -import dbus -import gobject -import os.path - -from xml.dom import minidom -import os - -from pasytest import PasyTest as _PasyTest - -import pyatspi -from pyatspi import StateSet - -os = [pyatspi.STATE_MULTISELECTABLE, - pyatspi.STATE_PRESSED, - pyatspi.STATE_SHOWING, - pyatspi.STATE_TRANSIENT, - pyatspi.STATE_COLLAPSED, - pyatspi.STATE_EDITABLE,] - -class StateTest(_PasyTest): - - __tests__ = ["setup", - "test_contains", - "test_add", - "test_remove", - "test_equals", - "test_compare", - "test_isEmpty", - "test_getStates", - "teardown", - ] - - def __init__(self, bus, path): - _PasyTest.__init__(self, "State", False) - - def setup(self, test): - pass - - def test_contains(self, test): - state = StateSet(*os) - if not state.contains(pyatspi.STATE_PRESSED): - test.fail("Does not find contained state") - if state.contains(pyatspi.STATE_ACTIVE): - test.fail("Finds state not contained") - - def test_add(self, test): - state = StateSet() - state.add(pyatspi.STATE_PRESSED) - if not state.contains(pyatspi.STATE_PRESSED): - test.fail("State not added") - - def test_remove(self, test): - state = StateSet(*os) - state.remove(pyatspi.STATE_PRESSED) - if state.contains(pyatspi.STATE_PRESSED): - test.fail("State not removed") - - def test_equals(self, test): - one = StateSet(*os) - two = StateSet(*os) - if not one.equals(two): - test.fail("Same states not found equal") - two.remove(pyatspi.STATE_PRESSED) - if two.equals(one): - test.fail("Unequal states found equal") - - def test_isEmpty(self, test): - emp = StateSet() - if not emp.isEmpty(): - test.fail("Empty state found non-empty") - emp.add(pyatspi.STATE_PRESSED) - if emp.isEmpty(): - test.fail("State incorrectly found empty") - - def test_compare(self, test): - one = StateSet(*os) - two = StateSet(*os) - - onemtwo = one.compare(two) - if not onemtwo.isEmpty(): - test.fail("Equal states when compared yeilds non-empty state") - - one.add(pyatspi.STATE_ACTIVE) - onemtwo = one.compare(two) - - act = StateSet(pyatspi.STATE_ACTIVE) - if not onemtwo.equals(act): - test.fail("Compared states do not yeild correct state") - - def test_getStates(self, test): - state = StateSet(*os) - - states = state.getStates() - cone = set(states) - ctwo = set(os) - - if not (cone.issubset(ctwo) and ctwo.issubset(cone)): - test.fail("States not reported correctly") - - def teardown(self, test): - pass diff --git a/tests/pyatspi/testrunner b/tests/pyatspi/testrunner deleted file mode 100755 index 92531e2..0000000 --- a/tests/pyatspi/testrunner +++ /dev/null @@ -1,94 +0,0 @@ -#!/usr/bin/python - -import gobject -import dbus -import sys -import os -import time -from random import randint - -from optparse import OptionParser -from pasytest import PasyTest - -from dbus.mainloop.glib import DBusGMainLoop - -DBusGMainLoop(set_as_default=True) - -def run_test_app(module_name, dbus_name=None, wait_for_debug=False): - import os - from subprocess import Popen - - test_data_directory = os.environ["TEST_DATA_DIRECTORY"] - test_modules_directory = os.environ["TEST_MODULES_DIRECTORY"] - test_atspi_library = os.environ["TEST_ATSPI_LIBRARY"] - test_application = os.environ["TEST_APPLICATION"] - - test_module = os.path.join(test_modules_directory, module_name) - - if (dbus_name): - print " ".join([test_application, - "--atspi-dbus-name", dbus_name, - "--test-atspi-library", test_atspi_library, - "--test-module", test_module, - "--test-data-directory", test_data_directory,]) - pop = Popen([test_application, - "--atspi-dbus-name", dbus_name, - "--test-atspi-library", test_atspi_library, - "--test-module", test_module, - "--test-data-directory", test_data_directory,]) - else: - print " ".join([test_application, - "--test-atspi-library", test_atspi_library, - "--test-module", test_module, - "--test-data-directory", test_data_directory,]) - pop = Popen([test_application, - "--test-atspi-library", test_atspi_library, - "--test-module", test_module, - "--test-data-directory", test_data_directory,]) - - wait_message = """ - The test application %s has been started with PID %d. - - To continue the test press ENTER.\n\n - """ - if (wait_for_debug): - raw_input(wait_message % (module_name, pop.pid)) - -def main(argv): - parser = OptionParser() - parser.add_option("-l", "--library", dest="test_library") - parser.add_option("-m", "--module", dest="test_module") - parser.add_option("-n", "--name", dest="test_name") - parser.add_option("-w", "--wait", action="store_true", dest="wait", default=False) - (options, args) = parser.parse_args() - - bus = dbus.SessionBus() - name = "test.atspi.R" + str(randint(1, 1000)) - - app = run_test_app(options.test_library, name, wait_for_debug=options.wait) - time.sleep(1) - print "Started test app on bus name %s" % (name,) - - to = bus.get_object(name, "/org/codethink/atspi/test") - test = dbus.Interface(to, "org.codethink.atspi.test") - - # Run the test script here - os.environ["ATSPI_TEST_APP_NAME"] = name - module = __import__(options.test_module) - test_class = getattr(module, options.test_name) - test_object = test_class(bus, name) - test_object.run() - - loop = gobject.MainLoop() - - def finished_handler(): - loop.quit() - print "\n" + test_object.report() + "\n" - test.finish() - - test_object.events.finished += finished_handler - - loop.run() - -if __name__=="__main__": - sys.exit(main(sys.argv)) -- 2.7.4