mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-18 22:54:00 +00:00
1693 lines
50 KiB
Diff
1693 lines
50 KiB
Diff
diff -Naur pyspi-0.6.1-old/cspi.pxd pyspi-0.6.1/cspi.pxd
|
|
--- pyspi-0.6.1-old/cspi.pxd 2006-08-04 06:27:10.000000000 +1000
|
|
+++ pyspi-0.6.1/cspi.pxd 2009-05-09 15:24:31.000000000 +1000
|
|
@@ -14,9 +14,7 @@
|
|
|
|
ctypedef struct AccessibleTextRange
|
|
ctypedef struct AccessibleKeySet
|
|
- ctypedef enum SPIBoolean:
|
|
- FALSE = 0,
|
|
- TRUE
|
|
+ ctypedef unsigned int SPIBoolean
|
|
|
|
ctypedef struct AccessibleEvent:
|
|
char *type
|
|
diff -Naur pyspi-0.6.1-old/pyspi.pyx pyspi-0.6.1/pyspi.pyx
|
|
--- pyspi-0.6.1-old/pyspi.pyx 2006-10-03 02:46:41.000000000 +1000
|
|
+++ pyspi-0.6.1/pyspi.pyx 2009-05-09 15:24:31.000000000 +1000
|
|
@@ -25,9 +25,15 @@
|
|
cdef class Event (EventBase)
|
|
cdef class DeviceEvent
|
|
|
|
-ctypedef enum bool:
|
|
+ctypedef unsigned int bool
|
|
+
|
|
+import __builtin__
|
|
+try:
|
|
+ False = __builtin__.False
|
|
+ True = __builtin__.True
|
|
+except AttributeError:
|
|
False = 0
|
|
- True
|
|
+ True = 1
|
|
|
|
# SPIExceptionCode values:
|
|
(SPI_EXCEPTION_UNSPECIFIED, SPI_EXCEPTION_DISCONNECT, SPI_EXCEPTION_NO_IMPL, SPI_EXCEPTION_IO, SPI_EXCEPTION_BAD_DATA)=range(5)
|
|
@@ -731,7 +737,7 @@
|
|
Wrapper around the low-level cspi.AccessibleComponent_ functions,
|
|
giving an OO-style API.
|
|
"""
|
|
- def getExtents (self, type=0):
|
|
+ def getExtents (self, key_type=0):
|
|
"""
|
|
Wraps cspi.AccessibleComponent_getExtents, returning an
|
|
(x,y,w,h) tuple.
|
|
@@ -741,7 +747,7 @@
|
|
cspi.AccessibleComponent_getExtents (self.__item, &x, &y, &w, &h, type)
|
|
return (x, y, w, h)
|
|
|
|
- def getPosition (self, type = 0):
|
|
+ def getPosition (self, key_type = 0):
|
|
"""
|
|
Wraps cspi.AccessibleComponent_getPosition, returning an
|
|
(x,y) tuple.
|
|
@@ -991,11 +997,11 @@
|
|
Wraps cspi.AccessibleHyperlink_getObject
|
|
"""
|
|
self.__checkSelf ()
|
|
- cdef Accessible object
|
|
- object = Accessible ()
|
|
- object.__setItem (cspi.AccessibleHyperlink_getObject (self.__item, i))
|
|
- object.__checkSelf ()
|
|
- return object
|
|
+ cdef Accessible obj
|
|
+ obj = Accessible ()
|
|
+ obj.__setItem (cspi.AccessibleHyperlink_getObject (self.__item, i))
|
|
+ obj.__checkSelf ()
|
|
+ return obj
|
|
|
|
def getURI (self, i):
|
|
"""
|
|
@@ -1032,7 +1038,7 @@
|
|
cspi.AccessibleImage_getImageSize(self.__item, &w, &h);
|
|
return [w, h]
|
|
|
|
- def getImagePosition (self, type=0):
|
|
+ def getImagePosition (self, key_type=0):
|
|
"""
|
|
Wraps cspi.AccessibleImage_getImagePosition, returning a (x,y)
|
|
pair
|
|
@@ -1042,7 +1048,7 @@
|
|
cspi.AccessibleImage_getImagePosition(self.__item, &x, &y, type)
|
|
return [x, y]
|
|
|
|
- def getImageExtents (self, type=0):
|
|
+ def getImageExtents (self, key_type=0):
|
|
"""
|
|
Wraps cspi.AccessibleImage_getImageExtents, returning a
|
|
(x,y,w,h) tuple
|
|
@@ -1551,7 +1557,7 @@
|
|
cdef cspi.AccessibleDeviceListener *__item
|
|
cdef public object modMasks
|
|
|
|
- def __init__ (self, callback, eventMask = cspi.SPI_KEY_PRESSED | cspi.SPI_KEY_RELEASED):
|
|
+ def __init__ (self, callback, eventMask = <int> cspi.SPI_KEY_PRESSED | <int> cspi.SPI_KEY_RELEASED):
|
|
"""
|
|
Registers a python callback function to be called.
|
|
|
|
diff -Naur pyspi-0.6.1-old/pyspi.pyx.orig pyspi-0.6.1/pyspi.pyx.orig
|
|
--- pyspi-0.6.1-old/pyspi.pyx.orig 1970-01-01 10:00:00.000000000 +1000
|
|
+++ pyspi-0.6.1/pyspi.pyx.orig 2006-10-03 02:46:41.000000000 +1000
|
|
@@ -0,0 +1,1592 @@
|
|
+# Authors:
|
|
+# Zack Cerza <zcerza@redhat.com>
|
|
+# Chris Lee <clee@redhat.com>
|
|
+# Lawrence Lim <llim@redhat.com>
|
|
+# David Malcolm <dmalcolm@redhat.com>
|
|
+
|
|
+cdef class Registry
|
|
+
|
|
+cdef class Base
|
|
+cdef class EventBase
|
|
+cdef class StateSet
|
|
+cdef class Accessible (Base)
|
|
+cdef class Desktop (Accessible)
|
|
+cdef class Application (Accessible)
|
|
+cdef class Component (Accessible)
|
|
+cdef class Action (Base)
|
|
+cdef class Text (Base)
|
|
+cdef class EditableText (Text)
|
|
+cdef class Hypertext (Text)
|
|
+cdef class Hyperlink (Base)
|
|
+cdef class Image (Base)
|
|
+cdef class Value (Base)
|
|
+cdef class Selection (Base)
|
|
+cdef class Table (Base)
|
|
+cdef class Event (EventBase)
|
|
+cdef class DeviceEvent
|
|
+
|
|
+ctypedef enum bool:
|
|
+ False = 0
|
|
+ True
|
|
+
|
|
+# SPIExceptionCode values:
|
|
+(SPI_EXCEPTION_UNSPECIFIED, SPI_EXCEPTION_DISCONNECT, SPI_EXCEPTION_NO_IMPL, SPI_EXCEPTION_IO, SPI_EXCEPTION_BAD_DATA)=range(5)
|
|
+
|
|
+# SPIExceptionType values:
|
|
+(SPI_EXCEPTION_SOURCE_UNSPECIFIED, SPI_EXCEPTION_SOURCE_ACCESSIBLE, SPI_EXCEPTION_SOURCE_REGISTRY, SPI_EXCEPTION_SOURCE_DEVICE)=range(4)
|
|
+
|
|
+# Accessible roles
|
|
+(SPI_ROLE_INVALID, SPI_ROLE_ACCEL_LABEL, SPI_ROLE_ALERT, SPI_ROLE_ANIMATION, SPI_ROLE_ARROW, SPI_ROLE_CALENDAR, SPI_ROLE_CANVAS, SPI_ROLE_CHECK_BOX, SPI_ROLE_CHECK_MENU_ITEM, SPI_ROLE_COLOR_CHOOSER, SPI_ROLE_COLUMN_HEADER, SPI_ROLE_COMBO_BOX, SPI_ROLE_DATE_EDITOR, SPI_ROLE_DESKTOP_ICON, SPI_ROLE_DESKTOP_FRAME, SPI_ROLE_DIAL, SPI_ROLE_DIALOG, SPI_ROLE_DIRECTORY_PANE, SPI_ROLE_DRAWING_AREA, SPI_ROLE_FILE_CHOOSER, SPI_ROLE_FILLER, SPI_ROLE_FONT_CHOOSER, SPI_ROLE_FRAME, SPI_ROLE_GLASS_PANE, SPI_ROLE_HTML_CONTAINER, SPI_ROLE_ICON, SPI_ROLE_IMAGE, SPI_ROLE_INTERNAL_FRAME, SPI_ROLE_LABEL, SPI_ROLE_LAYERED_PANE, SPI_ROLE_LIST, SPI_ROLE_LIST_ITEM, SPI_ROLE_MENU, SPI_ROLE_MENU_BAR, SPI_ROLE_MENU_ITEM, SPI_ROLE_OPTION_PANE, SPI_ROLE_PAGE_TAB, SPI_ROLE_PAGE_TAB_LIST, SPI_ROLE_PANEL, SPI_ROLE_PASSWORD_TEXT, SPI_ROLE_POPUP_MENU, SPI_ROLE_PROGRESS_BAR, SPI_ROLE_PUSH_BUTTON, SPI_ROLE_RADIO_BUTTON, SPI_ROLE_RADIO_MENU_ITEM, SPI_ROLE_ROOT_PANE, SPI_ROLE_ROW_HEADER, SPI_ROLE_SCROLL_BAR, SPI_ROLE_SCROLL_PANE, SPI_ROLE_SEPARATOR, SPI_ROLE_SLIDER, SPI_ROLE_SPIN_BUTTON, SPI_ROLE_SPLIT_PANE, SPI_ROLE_STATUS_BAR, SPI_ROLE_TABLE, SPI_ROLE_TABLE_CELL, SPI_ROLE_TABLE_COLUMN_HEADER, SPI_ROLE_TABLE_ROW_HEADER, SPI_ROLE_TEAROFF_MENU_ITEM, SPI_ROLE_TERMINAL, SPI_ROLE_TEXT, SPI_ROLE_TOGGLE_BUTTON, SPI_ROLE_TOOL_BAR, SPI_ROLE_TOOL_TIP, SPI_ROLE_TREE, SPI_ROLE_TREE_TABLE, SPI_ROLE_UNKNOWN, SPI_ROLE_VIEWPORT, SPI_ROLE_WINDOW, SPI_ROLE_EXTENDED, SPI_ROLE_HEADER, SPI_ROLE_FOOTER, SPI_ROLE_PARAGRAPH, SPI_ROLE_RULER, SPI_ROLE_APPLICATION, SPI_ROLE_AUTOCOMPLETE, SPI_ROLE_EDITBAR, SPI_ROLE_EMBEDDED, SPI_ROLE_LAST_DEFINED)=range(79)
|
|
+
|
|
+# Accessible states
|
|
+(SPI_STATE_INVALID, SPI_STATE_ACTIVE, SPI_STATE_ARMED, SPI_STATE_BUSY, SPI_STATE_CHECKED, SPI_STATE_COLLAPSED, SPI_STATE_DEFUNCT, SPI_STATE_EDITABLE, SPI_STATE_ENABLED, SPI_STATE_EXPANDABLE, SPI_STATE_EXPANDED, SPI_STATE_FOCUSABLE, SPI_STATE_FOCUSED, SPI_STATE_HORIZONTAL, SPI_STATE_ICONIFIED, SPI_STATE_MODAL, SPI_STATE_MULTI_LINE, SPI_STATE_MULTISELECTABLE, SPI_STATE_OPAQUE, SPI_STATE_PRESSED, SPI_STATE_RESIZABLE, SPI_STATE_SELECTABLE, SPI_STATE_SELECTED, SPI_STATE_SENSITIVE, SPI_STATE_SHOWING, SPI_STATE_SINGLE_LINE, SPI_STATE_STALE, SPI_STATE_TRANSIENT, SPI_STATE_VERTICAL, SPI_STATE_VISIBLE, SPI_STATE_MANAGES_DESCENDANTS, SPI_STATE_INDETERMINATE) = range(32);
|
|
+
|
|
+# Accessible relation types
|
|
+(SPI_RELATION_NULL, SPI_RELATION_LABEL_FOR, SPI_RELATION_LABELED_BY, SPI_RELATION_CONTROLLER_FOR, SPI_RELATION_CONTROLLED_BY, SPI_RELATION_MEMBER_OF, SPI_RELATION_NODE_CHILD_OF, SPI_RELATION_EXTENDED, SPI_RELATION_FLOWS_TO, SPI_RELATION_FLOWS_FROM, SPI_RELATION_SUBWINDOW_OF, SPI_RELATION_EMBEDS, SPI_RELATION_EMBEDDED_BY, SPI_RELATION_POPUP_FOR, SPI_RELATION_LAST_DEFINED) = range (15);
|
|
+
|
|
+# AccessibleComponent layers
|
|
+(SPI_LAYER_INVALID, SPI_LAYER_BACKGROUND, SPI_LAYER_CANVAS, SPI_LAYER_WIDGET, SPI_LAYER_MDI, SPI_LAYER_POPUP, SPI_LAYER_OVERLAY, SPI_LAYER_WINDOW, SPI_LAYER_LAST_DEFINED) = range(9)
|
|
+
|
|
+#AccessibleKeySynthType
|
|
+(SPI_KEY_PRESS, SPI_KEY_RELEASE, SPI_KEY_PRESSRELEASE, SPI_KEY_SYM, SPI_KEY_STRING) = range(5)
|
|
+
|
|
+# AccessibleKeyListenerSyncType
|
|
+(SPI_KEYLISTENER_NOSYNC, SPI_KEYLISTENER_SYNCHRONOUS, SPI_KEYLISTENER_CANCONSUME, SPI_KEYLISTENER_ALL_WINDOWS) = range(4)
|
|
+
|
|
+# AccessibleDeviceEventType
|
|
+SPI_KEY_PRESSED = 1<<0
|
|
+SPI_KEY_RELEASED = 1<<1
|
|
+SPI_BUTTON_PRESSED = 1<<2
|
|
+SPI_BUTTON_RELEASED = 1<<3
|
|
+
|
|
+cdef cspi.AccessibleKeySet *SPI_KEYSET_ALL_KEYS
|
|
+SPI_KEYSET_ALL_KEYS = NULL
|
|
+
|
|
+Accessibility_MODIFIER_SHIFT = 1 << 0
|
|
+Accessibility_MODIFIER_SHIFTLOCK = 1 << 1
|
|
+Accessibility_MODIFIER_CONTROL = 1 << 2
|
|
+Accessibility_MODIFIER_ALT = 1 << 3
|
|
+Accessibility_MODIFIER_META = 1 << 4
|
|
+Accessibility_MODIFIER_META2 = 1 << 5
|
|
+Accessibility_MODIFIER_META3 = 1 << 6
|
|
+Accessibility_MODIFIER_NUMLOCK = 1 << 7
|
|
+
|
|
+
|
|
+cdef object string(char * string):
|
|
+ cdef object pyString
|
|
+ pyString = string
|
|
+ cspi.SPI_freeString(string)
|
|
+ return pyString
|
|
+
|
|
+import os
|
|
+class X11Exception(Exception):
|
|
+ def __init__(self, display = os.environ.get('DISPLAY', None)):
|
|
+ self.display = display
|
|
+ def __str__(self):
|
|
+ msg = "Cannot open display"
|
|
+ if self.display: return msg + ': ' + self.display
|
|
+ else: return msg
|
|
+
|
|
+class AtspiException(Exception):
|
|
+ """
|
|
+ Exceptions raised when calls to the AT-SPI C bindings return FALSE to
|
|
+ indicate failure.
|
|
+ """
|
|
+ def __init__(self, message):
|
|
+ self.message = message
|
|
+
|
|
+ def __str__(self):
|
|
+ return "AtspiException: %s"%self.message
|
|
+
|
|
+class SpiException(Exception):
|
|
+ """
|
|
+ Exceptions to be raised in response to an installed
|
|
+ SPIExceptionHandler, corresponding to a SPIException. These appear to
|
|
+ be short-lived structs, so we gather all applicable data immediately
|
|
+ """
|
|
+ def __init__(self, is_fatal, sourceType, exceptionCode, description):
|
|
+ # print "got to __init__"
|
|
+ self.fatal = is_fatal
|
|
+ self.sourceType = sourceType
|
|
+ self.exceptionCode = exceptionCode
|
|
+ self.description = description
|
|
+
|
|
+ # print "leaving __init__"
|
|
+ # print self.fatal
|
|
+ # print self.sourceType
|
|
+ # print self.exceptionCode
|
|
+ # print self.description
|
|
+
|
|
+ def __str__(self):
|
|
+ if self.fatal:
|
|
+ fatalStr = "Fatal"
|
|
+ else:
|
|
+ fatalStr = "Non-fatal"
|
|
+ result = '%s SPIException: type:%s source:%s "%s"'%(fatalStr, self.sourceType, self.exceptionCode, self.description)
|
|
+ return result
|
|
+
|
|
+cdef make_exception(cspi.SPIException *err, cspi.SPIBoolean is_fatal):
|
|
+ # Don't attempt to use SPIAccessibleException_getSource; this is error
|
|
+ # handling code, we don't want to introduce further complications
|
|
+ return SpiException(is_fatal,
|
|
+ cspi.SPIException_getSourceType (err),
|
|
+ cspi.SPIException_getExceptionCode (err),
|
|
+ cspi.SPIException_getDescription (err))
|
|
+
|
|
+
|
|
+def event_main():
|
|
+ cspi.SPI_event_main()
|
|
+
|
|
+def event_quit():
|
|
+ cspi.SPI_event_quit()
|
|
+
|
|
+cdef cspi.SPIBoolean exception_handler (cspi.SPIException *err, cspi.SPIBoolean is_fatal) except *:
|
|
+ # print "got exception!!!"
|
|
+ e = make_exception(err, is_fatal)
|
|
+ raise e
|
|
+
|
|
+# at-spi-<version>/cpsi.h contains:
|
|
+# typedef SPIBoolean (*SPIExceptionHandler) (SPIException *err, SPIBoolean is_fatal);
|
|
+# and
|
|
+# SPIBoolean SPI_exceptionHandlerPush (SPIExceptionHandler *handler);
|
|
+# There's thus an extra unnecessary level of indirection.
|
|
+# We have to jump through the following hoops to get pyrex to deal with this:
|
|
+cdef cspi.SPIExceptionHandler exception_handler_as_type
|
|
+cdef cspi.SPIExceptionHandler* exception_handler_ptr
|
|
+exception_handler_as_type = exception_handler
|
|
+exception_handler_ptr = &exception_handler_as_type
|
|
+
|
|
+global_exception = None
|
|
+
|
|
+cdef class Registry:
|
|
+ def __init__ (self):
|
|
+ cdef Xlib.Display *display
|
|
+ display = Xlib.XOpenDisplay(NULL)
|
|
+ if display == NULL:
|
|
+ raise X11Exception
|
|
+ else:
|
|
+ Xlib.XCloseDisplay(display)
|
|
+
|
|
+ result = cspi.SPI_init ()
|
|
+ #if result!=0:
|
|
+ # raise AtspiException("SPI_init: exit code %s" % str(result))
|
|
+
|
|
+ result = cspi.SPI_exceptionHandlerPush (exception_handler_ptr)
|
|
+ if not result:
|
|
+ raise AtspiException("Unable to install SPI exception handler")
|
|
+
|
|
+ def __dealloc (self):
|
|
+ result = cspi.SPI_exit ()
|
|
+ if result!=0:
|
|
+ raise AtspiException("SPI_init: exit code %s" % str(result))
|
|
+
|
|
+ def getDesktopCount (self):
|
|
+ return cspi.SPI_getDesktopCount()
|
|
+
|
|
+ def getDesktop (self, index = 0):
|
|
+ cdef Desktop desktop
|
|
+ desktop = Desktop ()
|
|
+ if not desktop.__setItem (cspi.SPI_getDesktop (index)):
|
|
+ return False
|
|
+ return desktop
|
|
+
|
|
+ def getDesktopList (self):
|
|
+ # Using the bonobo.activation bindings, getDesktopList() returns a
|
|
+ # Python list of Desktop objects. The C bindings seem to do it differently,
|
|
+ # and Pyrex doesn't like that method. So we're re-implementing the function
|
|
+ # using getDesktopCount() and getDesktop() to work around that.
|
|
+ # Yay for Zack!
|
|
+ #
|
|
+ # -Zack
|
|
+ cdef Desktop desktop
|
|
+ desktops = []
|
|
+ desktop = Desktop ()
|
|
+ for i in xrange (cspi.SPI_getDesktopCount ()):
|
|
+ desktop.__setItem (cspi.SPI_getDesktop (i))
|
|
+ desktops = desktops + [desktop]
|
|
+ return desktops
|
|
+
|
|
+registry = Registry()
|
|
+
|
|
+cdef class Base:
|
|
+ """
|
|
+ Wrapper around a cspi.Accessible
|
|
+ """
|
|
+
|
|
+ cdef cspi.Accessible *__item
|
|
+
|
|
+ def __new__ (self):
|
|
+ self.__item = NULL
|
|
+
|
|
+ def __dealloc__ (self):
|
|
+ if self.__item != NULL:
|
|
+ cspi.Accessible_unref (self.__item)
|
|
+
|
|
+ cdef bool __setItem (self, cspi.Accessible *obj):
|
|
+ if self.__item != NULL:
|
|
+ cspi.Accessible_unref (self.__item)
|
|
+ if obj != NULL:
|
|
+ self.__item = obj
|
|
+ cspi.Accessible_ref (self.__item)
|
|
+ return True
|
|
+ else:
|
|
+ return False
|
|
+
|
|
+ def __checkSelf (self):
|
|
+ assert self.__item != NULL
|
|
+
|
|
+# WHY OH WHY won't this work? :(
|
|
+# I need to be able to find out of two Accessible classes contain
|
|
+# the same cspi.Accessible objects.
|
|
+#
|
|
+# def isSameAs (self, base):
|
|
+# cdef bool foo
|
|
+# foo = self.__item == base.__item
|
|
+# return foo
|
|
+
|
|
+cdef class EventBase:
|
|
+ """
|
|
+ Wrapper around a cspi.AccessibleEvent
|
|
+ """
|
|
+ cdef cspi.AccessibleEvent *__item
|
|
+
|
|
+ def __new__ (self):
|
|
+ self.__item = NULL
|
|
+
|
|
+ def __dealloc__ (self):
|
|
+ if self.__item != NULL:
|
|
+ cspi.AccessibleEvent_unref (self.__item)
|
|
+
|
|
+ cdef bool __setItem (self, cspi.AccessibleEvent *obj):
|
|
+ if self.__item != NULL:
|
|
+ cspi.AccessibleEvent_unref (self.__item)
|
|
+ if obj != NULL:
|
|
+ self.__item = obj
|
|
+ cspi.AccessibleEvent_ref (self.__item)
|
|
+ return True
|
|
+ else:
|
|
+ return False
|
|
+
|
|
+ def __checkSelf (self):
|
|
+ if self.__item == NULL:
|
|
+ raise AttributeError, "__item must not be NULL"
|
|
+
|
|
+ def __getattr__ (self, attrName):
|
|
+ cdef cspi.Accessible* acc
|
|
+ cdef Accessible result
|
|
+ if attrName == "source":
|
|
+ acc = self.__item.source
|
|
+ if acc!=NULL:
|
|
+ result = Accessible ()
|
|
+ result.__setItem (acc)
|
|
+ return result
|
|
+ elif attrName == "detail1":
|
|
+ detail1 = self.__item.detail1
|
|
+ return detail1
|
|
+ elif attrName == "detail2":
|
|
+ detail1 = self.__item.detail2
|
|
+ return detail1
|
|
+ elif attrName == "type":
|
|
+ return self.__item.type
|
|
+
|
|
+cdef class StateSet:
|
|
+ """
|
|
+ Wrapper around a cspi.AccessibleStateSet
|
|
+ """
|
|
+ cdef cspi.AccessibleStateSet *__item
|
|
+
|
|
+ def __new__ (self):
|
|
+ self.__item = NULL
|
|
+
|
|
+ def __dealloc__ (self):
|
|
+ if self.__item != NULL:
|
|
+ cspi.AccessibleStateSet_unref (self.__item)
|
|
+
|
|
+ def __checkSelf (self):
|
|
+ if self.__item == NULL:
|
|
+ raise AttributeError, "__item must not be NULL"
|
|
+
|
|
+ cdef bool __setItem (self, cspi.AccessibleStateSet *obj):
|
|
+ if self.__item != NULL:
|
|
+ cspi.AccessibleStateSet_unref (self.__item)
|
|
+ if obj != NULL:
|
|
+ self.__item = obj
|
|
+ cspi.AccessibleStateSet_ref (self.__item)
|
|
+ return True
|
|
+ else:
|
|
+ return False
|
|
+
|
|
+ cdef bool __contains (self, cspi.AccessibleState s):
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleStateSet_contains (self.__item, s)
|
|
+
|
|
+ def contains (self, state):
|
|
+ self.__checkSelf ()
|
|
+ return self.__contains(state)
|
|
+
|
|
+ cdef void __add (self, cspi.AccessibleState s):
|
|
+ self.__checkSelf ()
|
|
+ cspi.AccessibleStateSet_add(self.__item, s)
|
|
+
|
|
+ def add (self, state):
|
|
+ self.__checkSelf ()
|
|
+ self.__add (state)
|
|
+
|
|
+ cdef void __remove (self, cspi.AccessibleState s):
|
|
+ self.__checkSelf ()
|
|
+ cspi.AccessibleStateSet_remove (self.__item, s)
|
|
+
|
|
+ def remove (self, state):
|
|
+ self.__checkSelf ()
|
|
+ self.__remove (state)
|
|
+
|
|
+ def __str__ (self):
|
|
+ self.__checkSelf ()
|
|
+ return str(self.states)
|
|
+
|
|
+ def __getattr__(self, name):
|
|
+ if name == "states":
|
|
+ result = []
|
|
+ for state in range(SPI_STATE_INVALID, SPI_STATE_INDETERMINATE):
|
|
+ if self.contains(state):
|
|
+ result.append(state)
|
|
+ return result
|
|
+ else:
|
|
+ raise AttributeError, name
|
|
+
|
|
+cdef class Relation:
|
|
+ """
|
|
+ Wrapper around a cspi.AccessibleRelation
|
|
+ """
|
|
+ cdef cspi.AccessibleRelation *__item
|
|
+
|
|
+ def __new__ (self):
|
|
+ self.__item = NULL
|
|
+
|
|
+ def __dealloc__ (self):
|
|
+ if self.__item != NULL:
|
|
+ cspi.AccessibleRelation_unref (self.__item)
|
|
+
|
|
+ def __checkSelf (self):
|
|
+ if self.__item == NULL:
|
|
+ raise AttributeError, "__item must not be NULL"
|
|
+
|
|
+ def __str__ (self):
|
|
+ self.__checkSelf ()
|
|
+ return "relation %s -> %s"%(self.getRelationType (), self.getTargets())
|
|
+
|
|
+ def __repr__ (self):
|
|
+ self.__checkSelf ()
|
|
+ return "relation %s -> %s"%(self.getRelationType (), self.getTargets())
|
|
+
|
|
+ cdef bool __setItem (self, cspi.AccessibleRelation *obj):
|
|
+ if self.__item != NULL:
|
|
+ cspi.AccessibleRelation_unref (self.__item)
|
|
+ if obj != NULL:
|
|
+ self.__item = obj
|
|
+ cspi.AccessibleRelation_ref (self.__item)
|
|
+ return True
|
|
+ else:
|
|
+ return False
|
|
+
|
|
+ def getNTargets (self):
|
|
+ """
|
|
+ Wrapper around cspi.AccessibleRelation_getNTargets
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleRelation_getNTargets (self.__item)
|
|
+
|
|
+ def getTarget (self, i):
|
|
+ """
|
|
+ Wrapper around cspi.AccessibleRelation_getTarget
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef Accessible target
|
|
+ target = Accessible ()
|
|
+ target.__setItem (cspi.AccessibleRelation_getTarget (self.__item, i))
|
|
+ target.__checkSelf ()
|
|
+ return target
|
|
+
|
|
+ def getTargets (self):
|
|
+ """
|
|
+ Gets the targets of this AccessibleRelation as a list of atspi.Accessible
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ result = []
|
|
+ count = self.getNTargets()
|
|
+ for i in range(count):
|
|
+ result.append(self.getTarget(i))
|
|
+ return result
|
|
+
|
|
+ def getRelationType (self):
|
|
+ """
|
|
+ Wrapper around cspi.AccessibleRelation_getRelationType
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleRelation_getRelationType (self.__item)
|
|
+
|
|
+cdef class Accessible (Base):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible
|
|
+ """
|
|
+ def __getattr__ (self, name):
|
|
+ if name == "name":
|
|
+ return self.getName ()
|
|
+ elif name == "role":
|
|
+ return self.getRole ()
|
|
+ elif name == "roleName":
|
|
+ return self.getRoleName ()
|
|
+ elif name == "description":
|
|
+ return self.getDescription ()
|
|
+ elif name == "parent":
|
|
+ return self.getParent ()
|
|
+ elif name == "childCount":
|
|
+ return self.getChildCount ()
|
|
+ elif name == "indexInParent":
|
|
+ return self.getIndexInParent ()
|
|
+ elif name == "stateSet":
|
|
+ return self.getStateSet ()
|
|
+ else:
|
|
+ raise AttributeError, name
|
|
+
|
|
+ def getName (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getName
|
|
+ """
|
|
+ self.__checkSelf()
|
|
+ return string(cspi.Accessible_getName(self.__item))
|
|
+
|
|
+ def getDescription (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getDescription
|
|
+ """
|
|
+ self.__checkSelf()
|
|
+ return string(cspi.Accessible_getDescription(self.__item))
|
|
+
|
|
+ def getParent (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getParent, returning an
|
|
+ atspi.Accessible or None
|
|
+ """
|
|
+ self.__checkSelf()
|
|
+ cdef Accessible parent
|
|
+ cdef cspi.Accessible* spiParent
|
|
+
|
|
+ spiParent = cspi.Accessible_getParent (self.__item)
|
|
+ if spiParent!=NULL:
|
|
+ parent = Accessible ()
|
|
+ parent.__setItem (spiParent)
|
|
+ parent.__checkSelf ()
|
|
+ return parent
|
|
+ else:
|
|
+ return None
|
|
+
|
|
+ def getChildAtIndex (self, index):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getChildAtIndex, returning an
|
|
+ atspi.Accessible, atspi.Application, or None
|
|
+ """
|
|
+ self.__checkSelf()
|
|
+ cdef int i
|
|
+ i = index
|
|
+
|
|
+ # This hairiness is due to the fact that Pyrex doesn't allow cdefs
|
|
+ # inside if blocks.
|
|
+
|
|
+ cdef cspi.Accessible* spiChild
|
|
+ spiChild = cspi.Accessible_getChildAtIndex (self.__item, i)
|
|
+ # Workaround for GNOME bug #321273
|
|
+ # http://bugzilla.gnome.org/show_bug.cgi?id=321273
|
|
+ if spiChild == NULL: return None
|
|
+
|
|
+ cdef object child
|
|
+ cdef Application app
|
|
+ cdef Accessible acc
|
|
+ cdef Text text
|
|
+
|
|
+ if cspi.Accessible_isApplication (spiChild):
|
|
+ app = Application ()
|
|
+ app.__setItem (spiChild)
|
|
+ child = app
|
|
+ else:
|
|
+ acc = Accessible ()
|
|
+ acc.__setItem (spiChild)
|
|
+ child = acc
|
|
+
|
|
+ return child
|
|
+
|
|
+ def getIndexInParent (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getIndexInParent
|
|
+ """
|
|
+ self.__checkSelf()
|
|
+ return cspi.Accessible_getIndexInParent (self.__item)
|
|
+
|
|
+ def getRole (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getRole
|
|
+ """
|
|
+ self.__checkSelf()
|
|
+ return cspi.Accessible_getRole (self.__item)
|
|
+
|
|
+ def getRoleName (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getRoleName
|
|
+ """
|
|
+ self.__checkSelf()
|
|
+ return string(cspi.Accessible_getRoleName (self.__item))
|
|
+
|
|
+ def getChildCount (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getChildCount
|
|
+ """
|
|
+ self.__checkSelf()
|
|
+ return cspi.Accessible_getChildCount (self.__item)
|
|
+
|
|
+ def getStateSet (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getStateSet, returning an
|
|
+ atspi.StateSet
|
|
+ """
|
|
+ self.__checkSelf()
|
|
+ cdef StateSet set
|
|
+ set = StateSet()
|
|
+ set.__setItem (cspi.Accessible_getStateSet (self.__item))
|
|
+ return set
|
|
+
|
|
+ def getInterface (self, interface):
|
|
+ """
|
|
+ This is NOT part of cspi, it is just for compatibility with
|
|
+ the bonobo bindings and will probably go away soon.
|
|
+ """
|
|
+ self.__checkSelf()
|
|
+ return getattr(self, "get%s" % interface) ()
|
|
+
|
|
+ def getAction (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getAction, returning
|
|
+ an atspi.Action or None
|
|
+ """
|
|
+ self.__checkSelf()
|
|
+ cdef Action action
|
|
+ action = Action ()
|
|
+ action.__setItem (cspi.Accessible_getAction (self.__item))
|
|
+ if action.__item != NULL:
|
|
+ return action
|
|
+
|
|
+ def getText (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getText, returning an atspi.Text
|
|
+ or None
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef Text text
|
|
+ text = Text ()
|
|
+ text.__setItem (cspi.Accessible_getText (self.__item))
|
|
+ if text.__item != NULL:
|
|
+ return text
|
|
+
|
|
+ def getEditableText (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getText, returning an
|
|
+ atspi.EditableText or None
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef EditableText etext
|
|
+ etext = EditableText ()
|
|
+ etext.__setItem (cspi.Accessible_getEditableText (self.__item))
|
|
+ if etext.__item != NULL:
|
|
+ return etext
|
|
+
|
|
+ def getHypertext (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getHypertext, returning an
|
|
+ atspi.Hypertext or None
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef Hypertext hypertext
|
|
+ hypertext = Hypertext ()
|
|
+ hypertext.__setItem (cspi.Accessible_getHypertext (self.__item))
|
|
+ if hypertext.__item != NULL:
|
|
+ return hypertext
|
|
+
|
|
+ def getImage (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getImage, returning an
|
|
+ atspi.Image or None
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef Image image
|
|
+ image = Image ()
|
|
+ image.__setItem (cspi.Accessible_getImage (self.__item))
|
|
+ if image.__item != NULL:
|
|
+ return image
|
|
+
|
|
+ def getValue (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getValue, returning an
|
|
+ atspi.Value or None
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef Value value
|
|
+ value = Value ()
|
|
+ value.__setItem (cspi.Accessible_getValue (self.__item))
|
|
+ if value.__item != NULL:
|
|
+ return value
|
|
+
|
|
+ def getSelection (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getSelection, returning an
|
|
+ atspi.Selection or None
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef Selection selection
|
|
+ selection = Selection ()
|
|
+ selection.__setItem (cspi.Accessible_getSelection (self.__item))
|
|
+ if selection.__item != NULL:
|
|
+ return selection
|
|
+
|
|
+ def getComponent (self):
|
|
+ """
|
|
+ Wrapper around cspi.Accessible_getComponent, returning an
|
|
+ atspi.Component or None
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef Component component
|
|
+ component = Component ()
|
|
+ component.__setItem (cspi.Accessible_getComponent (self.__item))
|
|
+ if component.__item != NULL:
|
|
+ return component
|
|
+
|
|
+ def getRelationSet (self):
|
|
+ """
|
|
+ Wraps Accessible_getRelationSet, returning a list
|
|
+ of atspi.Relation
|
|
+ """
|
|
+ # looking at at-poke, result from C API appears to be a NULL-terminated list of pointers, and that we should free the buffer
|
|
+ self.__checkSelf ()
|
|
+ cdef Relation relation
|
|
+
|
|
+ relations = []
|
|
+ cdef cspi.AccessibleRelation **relationSet
|
|
+ relationSet = cspi.Accessible_getRelationSet (self.__item)
|
|
+
|
|
+ i=0
|
|
+ while relationSet[i]:
|
|
+ relation = Relation ()
|
|
+ relation.__setItem (relationSet[i])
|
|
+ relations.append(relation)
|
|
+ i=i+1
|
|
+ cspi.free (relationSet)
|
|
+
|
|
+ return relations
|
|
+
|
|
+
|
|
+cdef class Desktop (Accessible):
|
|
+ pass
|
|
+
|
|
+
|
|
+cdef class Application (Accessible):
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleApplication_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+ def getToolkit (self):
|
|
+ """
|
|
+ Wraps AccessibleApplication_getToolkitName, returning a string
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleApplication_getToolkitName (self.__item)
|
|
+
|
|
+ def getVersion (self):
|
|
+ """
|
|
+ Wraps AccessibleApplication_getVersion, returning a string
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleApplication_getVersion(self.__item)
|
|
+
|
|
+ def getID (self):
|
|
+ """
|
|
+ Wraps AccessibleApplication_getID, returning a string
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleApplication_getID (self.__item)
|
|
+
|
|
+ def pause (self):
|
|
+ """
|
|
+ Wraps AccessibleApplication_pause
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleApplication_pause (self.__item)
|
|
+
|
|
+ def resume (self):
|
|
+ """
|
|
+ Wraps AccessibleApplication_resume
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleApplication_resume (self.__item)
|
|
+
|
|
+cdef class Component (Accessible):
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleComponent_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+ def getExtents (self, type=0):
|
|
+ """
|
|
+ Wraps cspi.AccessibleComponent_getExtents, returning an
|
|
+ (x,y,w,h) tuple.
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef long x, y, w, h
|
|
+ cspi.AccessibleComponent_getExtents (self.__item, &x, &y, &w, &h, type)
|
|
+ return (x, y, w, h)
|
|
+
|
|
+ def getPosition (self, type = 0):
|
|
+ """
|
|
+ Wraps cspi.AccessibleComponent_getPosition, returning an
|
|
+ (x,y) tuple.
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef long x, y
|
|
+ cspi.AccessibleComponent_getPosition (self.__item, &x, &y, type)
|
|
+ return (x, y)
|
|
+
|
|
+ def getSize (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleComponent_getSize, returning a
|
|
+ (w,h) tuple.
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef long w, h
|
|
+ cspi.AccessibleComponent_getSize (self.__item, &w, &h)
|
|
+ return (w, h)
|
|
+
|
|
+ def getLayer (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleComponent_getLayer, returning an
|
|
+ AccessibleComponentLayer.
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleComponent_getLayer (self.__item)
|
|
+
|
|
+ def grabFocus (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleComponent_grabFocus, raising AtspiException
|
|
+ if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ if not cspi.AccessibleComponent_grabFocus (self.__item):
|
|
+ raise AtspiException("AccessibleComponent_grabFocus")
|
|
+
|
|
+ def getMDIZOrder (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleComponent_getMDIZOrder, returning an integer.
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleComponent_getMDIZOrder(self.__item)
|
|
+
|
|
+cdef class Action (Base):
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleAction_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+ def __getattr__ (self, name):
|
|
+ if name == "nActions":
|
|
+ return self.getNActions ()
|
|
+ else:
|
|
+ raise AttributeError, name
|
|
+
|
|
+ def getNActions (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleAction_getNActions
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleAction_getNActions (self.__item)
|
|
+
|
|
+ def doAction (self, index):
|
|
+ """
|
|
+ Wraps cspi.AccessibleAction_doAction
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleAction_doAction (self.__item, index)
|
|
+
|
|
+ def getKeyBinding (self, index):
|
|
+ """
|
|
+ Wraps cspi.AccessibleAction_getKeyBinding
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleAction_getKeyBinding (self.__item, index)
|
|
+
|
|
+ def getName (self, index):
|
|
+ """
|
|
+ Wraps cspi.AccessibleAction_getName
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return string(cspi.AccessibleAction_getName (self.__item, index))
|
|
+
|
|
+ def getDescription (self, index):
|
|
+ """
|
|
+ Wraps cspi.AccessibleAction_getDescription
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return string(cspi.AccessibleAction_getDescription (self.__item, index))
|
|
+
|
|
+
|
|
+cdef class Text (Base):
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleText_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+ def addSelection (self, startOffset, endOffset):
|
|
+ """
|
|
+ Wraps cspi.AccessibleText_addSelection
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ if not cspi.AccessibleText_addSelection (self.__item, startOffset, endOffset):
|
|
+ raise AtspiException("AccessibleText_addSelection")
|
|
+
|
|
+
|
|
+ #def getAttributes (self, offset, startOffset, endOffset):
|
|
+ # self.__checkSelf ()
|
|
+ # return cspi.AccessibleText_getAttributes (self.__item, offset, startOffset, endOffset)
|
|
+ def getCaretOffset (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleText_getCaretOffset
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleText_getCaretOffset (self.__item)
|
|
+
|
|
+ def getCharacterCount (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleText_getCharacterCount
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleText_getCharacterCount (self.__item)
|
|
+
|
|
+ def getNSelections (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleText_getNSelections
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleText_getNSelections (self.__item)
|
|
+
|
|
+ #def getSelection (self, selectionNum, startOffset, endOffset):
|
|
+ # self.__checkSelf ()
|
|
+ # return cspi.AccessibleText_getSelection (self.__item, selectionNum, startOffset, endOffset)
|
|
+
|
|
+ def getText (self, startOffset, endOffset):
|
|
+ """
|
|
+ Wraps cspi.AccessibleText_getText
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return string(cspi.AccessibleText_getText (self.__item, startOffset, endOffset))
|
|
+
|
|
+ def removeSelection (self, selectionNum):
|
|
+ """
|
|
+ Wraps cspi.AccessibleText_removeSelection, raising AtspiException if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ if not cspi.AccessibleText_removeSelection (self.__item, selectionNum):
|
|
+ raise AtspiException("AccessibleText_removeSelection")
|
|
+
|
|
+ def setSelection (self, selectionNum, startOffset, endOffset):
|
|
+ """
|
|
+ Wraps cspi.AccessibleText_setSelection, raising AtspiException if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ if not cspi.AccessibleText_setSelection (self.__item, selectionNum, startOffset, endOffset):
|
|
+ raise AtspiException("AccessibleText_setSelection")
|
|
+
|
|
+ def setCaretOffset (self, position):
|
|
+ """
|
|
+ Wraps cspi.AccessibleText_setCaretOffset, raising AtspiException if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ if not cspi.AccessibleText_setCaretOffset (self.__item, position):
|
|
+ raise AtspiException("AccessibleText_setCaretOffset")
|
|
+
|
|
+cdef class EditableText (Text):
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleEditableText_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+ def setTextContents (self, newContents):
|
|
+ """
|
|
+ Wraps cspi.AccessibleEditableText_setTextContents, raising AtspiException if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ if not cspi.AccessibleEditableText_setTextContents (self.__item, newContents):
|
|
+ raise AtspiException("AccessibleEditableText_setTextContents")
|
|
+
|
|
+ def setAttributes (self, attributes, startOffset, endOffset):
|
|
+ """
|
|
+ Wraps cspi.AccessibleEditableText_setAttributes, raising AtspiException if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ if not cspi.AccessibleEditableText_setAttributes (self.__item, attributes, startOffset, endOffset):
|
|
+ raise AtspiException("AccessibleEditableText_setAttributes")
|
|
+
|
|
+ def insertText (self, position, text):
|
|
+ """
|
|
+ Wraps cspi.AccessibleEditableText_insertText, raising AtspiException if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ if not cspi.AccessibleEditableText_insertText (self.__item, position, text, cspi.strlen(text)):
|
|
+ raise AtspiException("AccessibleEditableText_insertText")
|
|
+
|
|
+cdef class Hypertext (Text):
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleHypertext_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+ def getNLinks (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleHypertext_getNLinks, raising AtspiException if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleHypertext_getNLinks (self.__item)
|
|
+
|
|
+ def getLink (self, linkIndex):
|
|
+ """
|
|
+ Wraps cspi.AccessibleHypertext_getLink, raising AtspiException if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef Hyperlink hyperlink
|
|
+ hyperlink = Hyperlink ()
|
|
+ hyperlink.__setItem (cspi.AccessibleHypertext_getLink (self.__item, linkIndex))
|
|
+ if hyperlink.__item != NULL:
|
|
+ return hyperlink
|
|
+
|
|
+ def getLinkIndex (self, characterOffset):
|
|
+ """
|
|
+ Wraps cspi.AccessibleHypertext_getLinkIndex, raising AtspiException if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleHypertext_getLinkIndex (self.__item, characterOffset)
|
|
+
|
|
+cdef class Hyperlink (Base):
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleHyperlink_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+ def getNAnchors (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleHyperlink_getNAnchors, raising AtspiException if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleHyperlink_getNAnchors (self.__item)
|
|
+
|
|
+ def getIndexRange (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleHyperlink_getIndexRange, returning [startIndex, endIndex] pair
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef long startIndex, endIndex
|
|
+ cspi.AccessibleHyperlink_getIndexRange(self.__item, &startIndex, &endIndex)
|
|
+ return [startIndex, endIndex]
|
|
+
|
|
+
|
|
+ def getObject (self, i):
|
|
+ """
|
|
+ Wraps cspi.AccessibleHyperlink_getObject
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef Accessible object
|
|
+ object = Accessible ()
|
|
+ object.__setItem (cspi.AccessibleHyperlink_getObject (self.__item, i))
|
|
+ object.__checkSelf ()
|
|
+ return object
|
|
+
|
|
+ def getURI (self, i):
|
|
+ """
|
|
+ Wraps cspi.AccessibleHyperlink_getURI, raising AtspiException if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleHyperlink_getURI (self.__item, i)
|
|
+
|
|
+ def isValid (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleHyperlink_isValid, raising AtspiException if it fails
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleHyperlink_isValid (self.__item)
|
|
+
|
|
+cdef class Image (Base):
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleImage_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+ def getImageDescription (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleImage_getImageDescription
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleImage_getImageDescription (self.__item)
|
|
+
|
|
+ def getImageSize (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleImage_getImageSize, returning a (w,h) pair
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef long w, h
|
|
+ cspi.AccessibleImage_getImageSize(self.__item, &w, &h);
|
|
+ return [w, h]
|
|
+
|
|
+ def getImagePosition (self, type=0):
|
|
+ """
|
|
+ Wraps cspi.AccessibleImage_getImagePosition, returning a (x,y)
|
|
+ pair
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef long x, y
|
|
+ cspi.AccessibleImage_getImagePosition(self.__item, &x, &y, type)
|
|
+ return [x, y]
|
|
+
|
|
+ def getImageExtents (self, type=0):
|
|
+ """
|
|
+ Wraps cspi.AccessibleImage_getImageExtents, returning a
|
|
+ (x,y,w,h) tuple
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ cdef long x, y, w, h
|
|
+ cspi.AccessibleImage_getImageExtents(self.__item, &x, &y, &w, &h, type)
|
|
+ return [x, y, w, h]
|
|
+
|
|
+cdef class Value (Base):
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleValue_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+ def getMinimumValue (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleValue_getMinimumValue
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleValue_getMinimumValue(self.__item)
|
|
+
|
|
+ def getCurrentValue (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleValue_getMinimumValue
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleValue_getCurrentValue(self.__item)
|
|
+
|
|
+ def getMaximumValue (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleValue_getMinimumValue
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleValue_getMaximumValue(self.__item)
|
|
+
|
|
+ def setCurrentValue (self, newValue):
|
|
+ """
|
|
+ Wraps cspi.AccessibleValue_setCurrentValue
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ if not cspi.AccessibleValue_setCurrentValue (self.__item, newValue):
|
|
+ raise AtspiException("AccessibleValue_setCurrentValue")
|
|
+
|
|
+cdef class Selection (Base):
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleSelection_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+
|
|
+ def getNSelectedChildren (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleSelection_getNSelectedChildren
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleSelection_getNSelectedChildren (self.__item)
|
|
+
|
|
+ def getSelectedChild (self, index):
|
|
+ """
|
|
+ Wraps cspi.AccessibleSelection_getSelectedChild
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+
|
|
+ cdef cspi.Accessible* spiChild
|
|
+ spiChild = cspi.AccessibleSelection_getSelectedChild (self.__item, index)
|
|
+
|
|
+ assert spiChild != NULL
|
|
+
|
|
+ cdef object child
|
|
+ cdef Application app
|
|
+ cdef Accessible acc
|
|
+ cdef Text text
|
|
+
|
|
+ if cspi.Accessible_isApplication (spiChild):
|
|
+ app = Application ()
|
|
+ app.__setItem (spiChild)
|
|
+ child = app
|
|
+ else:
|
|
+ acc = Accessible ()
|
|
+ acc.__setItem (spiChild)
|
|
+ child = acc
|
|
+
|
|
+ return child
|
|
+
|
|
+ def selectChild (self, index):
|
|
+ """
|
|
+ Wraps cspi.AccessibleSelection_selectChild
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleSelection_selectChild (self.__item, index)
|
|
+
|
|
+ def deselectSelectedChild (self, index):
|
|
+ """
|
|
+ Wraps cspi.AccessibleSelection_deselectSelectedChild
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleSelection_deselectSelectedChild (self.__item, index)
|
|
+
|
|
+ def isChildSelected (self, index):
|
|
+ """
|
|
+ Wraps cspi.AccessibleSelection_isChildSelected
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleSelection_isChildSelected (self.__item, index)
|
|
+
|
|
+ def selectAll (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleSelection_selectAll
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleSelection_selectAll( self.__item)
|
|
+
|
|
+ def clearSelection (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleSelection_clearSelection
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleSelection_clearSelection (self.__item)
|
|
+
|
|
+cdef class Table (Base):
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleTable_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+
|
|
+ # def getTableAccessibleAt (self, row, column):
|
|
+ # def getTableCaption (self):
|
|
+
|
|
+ def getTableColumnAtIndex (self, index):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_getColumnAtIndex
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_getColumnAtIndex(self.__item, index)
|
|
+
|
|
+ def getTableColumnDescription (self, column):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_getColumnDescription
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_getColumnDescription(self.__item, column)
|
|
+
|
|
+ def getTableColumnExtentAt (self, row, column):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_getColumnExtentAt
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_getColumnExtentAt(self.__item, row, column)
|
|
+
|
|
+ # def getTableColumnHeader (self, column):
|
|
+
|
|
+ def getTableIndexAt (self, row, column):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_getIndexAt
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_getIndexAt(self.__item, row, column)
|
|
+
|
|
+ def getTableNColumns (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_getNColumns
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_getNColumns(self.__item)
|
|
+
|
|
+ def getTableNRows (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_getNRows
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_getNRows(self.__item)
|
|
+
|
|
+ def getTableNSelectedColumns (self):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_getNSelectedColumns
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_getNSelectedColumns(self.__item)
|
|
+
|
|
+ def getTableNSelectedRows (self):
|
|
+ """
|
|
+x Wraps cspi.AccessibleTable_getNSelectedRows
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_getNSelectedRows(self.__item)
|
|
+
|
|
+ def getTableRowAtIndex (self, index):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_getRowAtIndex
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_getRowAtIndex(self.__item, index)
|
|
+
|
|
+ def getTableRowDescription (self, row):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_getRowDescription
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_getRowDescription(self.__item, row)
|
|
+
|
|
+ def getTableRowExtentAt (self, row, column):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_getRowExtentAt
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_getRowExtentAt(self.__item, row, column)
|
|
+
|
|
+ # def getTableRowHeader (self, row):
|
|
+ # def getTableSelectedRows (self, **selectedRows): - Not sure if the variable which is a pointer to a pointer is acceptable
|
|
+ # def getTableSelectedColumns (self, **selectedColumns): - Same issue as above
|
|
+ # def getTableSummary (self):
|
|
+
|
|
+ def isTableColumnSelected (self, column):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_isColumnSelected
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_isColumnSelected(self.__item, column)
|
|
+
|
|
+ def isTableRowSelected (self, row):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_isRowSelected
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_isRowSelected(self.__item, row)
|
|
+
|
|
+ def isTableSelected (self, row, column):
|
|
+ """
|
|
+ Wraps cspi.AccessibleTable_isSelected
|
|
+ """
|
|
+ self.__checkSelf ()
|
|
+ return cspi.AccessibleTable_isSelected(self.__item, row, column)
|
|
+
|
|
+
|
|
+cdef class Event (EventBase):
|
|
+ #def AccessibleEventListener* SPI_createAccessibleEventListener (AccessibleEventListenerCB callback, void *user_data)
|
|
+ #void AccessibleEventListener_unref (AccessibleEventListener *listener)
|
|
+ #SPIBoolean AccessibleEventListener_addCallback (AccessibleEventListener *listener, AccessibleEventListenerCB callback, void *user_data)
|
|
+ #SPIBoolean AccessibleEventListener_removeCallback (AccessibleEventListener *listener, AccessibleEventListenerCB callback)
|
|
+
|
|
+ #Accessible* AccessibleActiveDescendantChangedEvent_getActiveDescendant (AccessibleEvent *event)
|
|
+ #Accessible* AccessibleChildChangedEvent_getChildAccessible (AccessibleEvent *event)
|
|
+
|
|
+ def getDescriptionChangedEventDescriptionString (self):
|
|
+ self.__checkSelf()
|
|
+ return string(cspi.AccessibleDescriptionChangedEvent_getDescriptionString(self.__item))
|
|
+
|
|
+ def getNameChangedEventNameString (self):
|
|
+ self.__checkSelf()
|
|
+ return string(cspi.AccessibleNameChangedEvent_getNameString(self.__item))
|
|
+
|
|
+ # Accessible* AccessibleParentChangedEvent_getParentAccessible (AccessibleEvent *event)
|
|
+
|
|
+ def getTableCaptionChangedEventCaptionString(self):
|
|
+ self.__checkSelf()
|
|
+ return string(cspi.AccessibleTableCaptionChangedEvent_getCaptionString(self.__item))
|
|
+
|
|
+ def getTableColumnDescriptionChangedEventDescriptionString(self):
|
|
+ self.__checkSelf ()
|
|
+ return string(cspi.AccessibleTableColumnDescriptionChangedEvent_getDescriptionString(self.__item))
|
|
+
|
|
+ # Accessible* AccessibleTableHeaderChangedEvent_getHeaderAccessible (AccessibleEvent *event)
|
|
+
|
|
+ def getTableRowDescriptionChangedEventDescriptionString(self):
|
|
+ self.__checkSelf ()
|
|
+ return string(cspi.AccessibleTableRowDescriptionChangedEvent_getDescriptionString(self.__item))
|
|
+
|
|
+ #Accessible* AccessibleTableSummaryChangedEvent_getSummaryAccessible (AccessibleEvent *event)
|
|
+
|
|
+ def getTextChangedEventChangeString (self):
|
|
+ self.__checkSelf ()
|
|
+ return string(cspi.AccessibleTextChangedEvent_getChangeString(self.__item))
|
|
+
|
|
+ def getTextSelectionChangedEventSelectionString (self):
|
|
+ self.__checkSelf ()
|
|
+ return string(cspi.AccessibleTextSelectionChangedEvent_getSelectionString(self.__item))
|
|
+
|
|
+ def getWindowEventTitleString (self):
|
|
+ self.__checkSelf ()
|
|
+ return string(cspi.AccessibleWindowEvent_getTitleString(self.__item))
|
|
+
|
|
+class EventGenerator:
|
|
+ """
|
|
+ Wrapper layer around SPI_generateKeyboardEvent and
|
|
+ SPI_generateMouseEvent, used for generating input events.
|
|
+
|
|
+ Use AccessibleAction in preference to this.
|
|
+ """
|
|
+ def injectKeyboardString (self, string):
|
|
+ """
|
|
+ Inject a string as if it had been typed using an input method.
|
|
+ """
|
|
+ # Seems to only work if you do it one character at a time...
|
|
+ for char in string:
|
|
+ self.__generateKeystringEvent (str(char), cspi.SPI_KEY_STRING)
|
|
+
|
|
+ def __keyStringToKeyCode(self, keyString):
|
|
+ cdef Xlib.Display *display
|
|
+ display = Xlib.XOpenDisplay(NULL)
|
|
+
|
|
+ cdef Xlib.KeySym sym
|
|
+ sym = Xlib.XStringToKeysym(keyString)
|
|
+ cdef Xlib.KeyCode code
|
|
+ code = Xlib.XKeysymToKeycode(display, sym)
|
|
+
|
|
+ #print str(keyString), str(int(sym)), code
|
|
+
|
|
+ Xlib.XCloseDisplay(display)
|
|
+ return int(code)
|
|
+
|
|
+ def generateKeyCombo (self, keyStrings):
|
|
+ modifiers = keyStrings[:-1]
|
|
+ finalKey = keyStrings[-1]
|
|
+
|
|
+ for modifier in modifiers:
|
|
+ code = self.__keyStringToKeyCode(modifier)
|
|
+ self.generateKeyboardEvent(code, '', cspi.SPI_KEY_PRESS)
|
|
+
|
|
+ code = self.__keyStringToKeyCode(finalKey)
|
|
+ self.generateKeyboardEvent(code, '', cspi.SPI_KEY_PRESSRELEASE)
|
|
+
|
|
+ for modifier in modifiers:
|
|
+ code = self.__keyStringToKeyCode(modifier)
|
|
+ self.generateKeyboardEvent(code, '', cspi.SPI_KEY_RELEASE)
|
|
+
|
|
+
|
|
+ def __generateKeyvalEvent (self, keyval, synthType):
|
|
+ self.generateKeyboardEvent (keyval, None, synthType)
|
|
+
|
|
+ def __generateKeystringEvent (self, keystring, synthType):
|
|
+ self.generateKeyboardEvent (0, keystring, synthType)
|
|
+
|
|
+ def generateKeyboardEvent (self, keyval, keystring, synthType):
|
|
+ if not cspi.SPI_generateKeyboardEvent (keyval, keystring, synthType):
|
|
+ raise AtspiException("SPI_generateKeyboardEvent")
|
|
+
|
|
+ def click (self, x, y, button):
|
|
+ """
|
|
+ Synthesize a mouse button click at (x,y)
|
|
+ """
|
|
+ self.__generateButtonEvent (x, y, button, "c")
|
|
+
|
|
+ def doubleClick (self, x, y, button):
|
|
+ """
|
|
+ Synthesize a mouse button double-click at (x,y)
|
|
+ """
|
|
+ self.__generateButtonEvent (x, y, button, "d")
|
|
+
|
|
+ def press (self, x, y, button):
|
|
+ """
|
|
+ Synthesize a mouse button press at (x,y)
|
|
+ """
|
|
+ self.__generateButtonEvent (x, y, button, "p")
|
|
+
|
|
+ def release (self, x, y, button):
|
|
+ """
|
|
+ Synthesize a mouse button release at (x,y)
|
|
+ """
|
|
+ self.__generateButtonEvent (x, y, button, "r")
|
|
+
|
|
+ def absoluteMotion (self, x, y):
|
|
+ """
|
|
+ Synthesize mouse absolute motion to (x,y)
|
|
+ """
|
|
+ self.__generateEvent (x, y, "abs")
|
|
+
|
|
+ def relativeMotion (self, x, y):
|
|
+ """
|
|
+ Synthesize mouse relative motion of (x,y)
|
|
+ """
|
|
+ self.__generateEvent (x, y, "rel")
|
|
+
|
|
+ def drag (self, fromXY, toXY, button):
|
|
+ """
|
|
+ Synthesize a drag (press, move and release) from (x,y) to (x,y).
|
|
+
|
|
+ These are absolute screen coordinates
|
|
+ """
|
|
+ (x,y) = fromXY
|
|
+ self.press (x, y, button)
|
|
+
|
|
+ (x,y) = toXY
|
|
+ self.absoluteMotion(x,y)
|
|
+
|
|
+ self.release (x, y, button)
|
|
+
|
|
+ def __generateEvent (self, x, y, name):
|
|
+ """
|
|
+ Thin wrapper around SPI_generateMouseEvent.
|
|
+
|
|
+ Event names: b1p = button 1 press; b2r = button 2 release;
|
|
+ b3c = button 3 click; b2d = button 2 double-click;
|
|
+ abs = absolute motion; rel = relative motion.
|
|
+ """
|
|
+ if not cspi.SPI_generateMouseEvent (x, y, name):
|
|
+ raise AtspiException("Error generating mouse event")
|
|
+
|
|
+ def __generateButtonEvent (self, x, y, button, suffix):
|
|
+ self.__generateEvent (x, y, self.__generateButtonName(button)+suffix)
|
|
+
|
|
+ def __generateButtonName(self, button):
|
|
+ if button==1:
|
|
+ return "b1"
|
|
+ elif button==2:
|
|
+ return "b2"
|
|
+ elif button==3:
|
|
+ return "b3"
|
|
+ else: raise ValueError, "Unknown button"
|
|
+
|
|
+# We use this C function to marshal a call to a python function. The Python callback
|
|
+# function is installed as the userdata of this C callback function. See the
|
|
+# "cheesefinder" demo in the Pyrex sources.
|
|
+# We ignore the "const"ness of the AccessibleEvent
|
|
+cdef void marshalAccessibleEventCallback (cspi.AccessibleEvent *event, void *python_fn) except *:
|
|
+ e = Event()
|
|
+ EventBase.__setItem(e, event)
|
|
+ (<object>python_fn) (e)
|
|
+
|
|
+cdef class EventListener:
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleEventListener_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+ cdef cspi.AccessibleEventListener *__item
|
|
+ cdef public object eventTypes
|
|
+
|
|
+ def __init__ (self, callback, eventTypes):
|
|
+ """
|
|
+ Registers a python callback function to be called.
|
|
+ The callback is expected to have one input, of type atspi.Event, and no return value.
|
|
+ See documentation of SPI_registerGlobalEventListener for the event names
|
|
+ """
|
|
+ self.eventTypes = eventTypes
|
|
+ self.__item = cspi.SPI_createAccessibleEventListener (marshalAccessibleEventCallback, <void*>callback)
|
|
+ for eventType in self.eventTypes:
|
|
+ #char *e
|
|
+ e = eventType
|
|
+ if not cspi.SPI_registerGlobalEventListener (self.__item, e):
|
|
+ raise AtspiException("Unable to register event listener")
|
|
+
|
|
+ def deregister(self):
|
|
+ for eventType in self.eventTypes:
|
|
+ cspi.SPI_deregisterGlobalEventListener(self.__item, eventType)
|
|
+
|
|
+ def __dealloc__ (self):
|
|
+ if self.__item != NULL:
|
|
+ self.deregister()
|
|
+ cspi.AccessibleEventListener_unref (self.__item)
|
|
+
|
|
+ def __checkSelf (self):
|
|
+ if self.__item == NULL:
|
|
+ raise AttributeError, "__item must not be NULL"
|
|
+
|
|
+cdef class DeviceEvent:
|
|
+ """
|
|
+ Wrapper around a cspi.AccessibleDeviceEvent
|
|
+ """
|
|
+ cdef cspi.AccessibleDeviceEvent *__item
|
|
+ cdef public object keyID
|
|
+ cdef public object keyCode
|
|
+ cdef public object keyString
|
|
+ cdef public object timeStamp
|
|
+ cdef public object type
|
|
+ cdef public object modifiers
|
|
+ cdef public object isText
|
|
+
|
|
+ def __new__ (self):
|
|
+ self.__item = NULL
|
|
+
|
|
+ cdef bool __setItem (self, cspi.AccessibleDeviceEvent *obj):
|
|
+ if obj != NULL:
|
|
+ self.__item = obj
|
|
+ self.keyID = self.__item.keyID
|
|
+ self.keyCode = self.__item.keycode
|
|
+ self.keyString = self.__item.keystring
|
|
+ self.timeStamp = self.__item.timestamp
|
|
+ self.type = self.__item.type
|
|
+ self.modifiers = self.__item.modifiers
|
|
+ if self.__item.is_text: self.isText = True
|
|
+ else: self.isText = False
|
|
+ return True
|
|
+ else:
|
|
+ return False
|
|
+
|
|
+ def __checkSelf (self):
|
|
+ if self.__item == NULL:
|
|
+ raise AttributeError, "__item must not be NULL"
|
|
+
|
|
+# def __dealloc__ (self):
|
|
+# if self.__item != NULL:
|
|
+# cspi.AccessibleDeviceEvent_unref (self.__item)
|
|
+
|
|
+
|
|
+cdef cspi.SPIBoolean marshalAccessibleDeviceEventCallback (cspi.AccessibleDeviceEvent *event, void *python_fn) except 1:
|
|
+ k = DeviceEvent()
|
|
+ #k.__setItem(event)
|
|
+ DeviceEvent.__setItem(k, event)
|
|
+ k.__checkSelf()
|
|
+ (<object>python_fn) (k)
|
|
+ return False
|
|
+
|
|
+cdef class DeviceListener:
|
|
+ """
|
|
+ Wrapper around the low-level cspi.AccessibleDeviceListener_ functions,
|
|
+ giving an OO-style API.
|
|
+ """
|
|
+ cdef cspi.AccessibleDeviceListener *__item
|
|
+ cdef public object modMasks
|
|
+
|
|
+ def __init__ (self, callback, eventMask = cspi.SPI_KEY_PRESSED | cspi.SPI_KEY_RELEASED):
|
|
+ """
|
|
+ Registers a python callback function to be called.
|
|
+
|
|
+ eventMask may be one of the following:
|
|
+ key pressed: 1
|
|
+ key released: 2
|
|
+ key pressed or released (default): 3
|
|
+ """
|
|
+ self.__item = cspi.SPI_createAccessibleDeviceListener (marshalAccessibleDeviceEventCallback, <void*>callback)
|
|
+ cdef cspi.AccessibleKeySet *keySet
|
|
+ keySet = SPI_KEYSET_ALL_KEYS
|
|
+ self.modMasks = []
|
|
+ cdef short int modMask
|
|
+ syncType = SPI_KEYLISTENER_SYNCHRONOUS | SPI_KEYLISTENER_CANCONSUME
|
|
+ #syncType = SPI_KEYLISTENER_NOSYNC
|
|
+ for modMask from 0 <= modMask < (1 << 8):
|
|
+ self.modMasks.append(modMask)
|
|
+ desc = "keySet "+str(<int> keySet)+" modMask "+str(modMask)+" eventMask "+str(eventMask)+" syncType "+str(syncType)
|
|
+ desc = str(desc)
|
|
+ if not cspi.SPI_registerAccessibleKeystrokeListener (self.__item, keySet, modMask, eventMask, syncType):
|
|
+ raise AtspiException("Unable to register keystroke listener", desc)
|
|
+
|
|
+ def deregister(self):
|
|
+ if self.__item != NULL:
|
|
+ for modMask in self.modMasks:
|
|
+ cspi.SPI_deregisterAccessibleKeystrokeListener(self.__item, modMask)
|
|
+
|
|
+ def __dealloc__ (self):
|
|
+ if self.__item != NULL:
|
|
+ self.deregister()
|
|
+ cspi.AccessibleDeviceListener_unref (self.__item)
|
|
+
|
|
+ def __checkSelf (self):
|
|
+ if self.__item == NULL:
|
|
+ raise AttributeError, "__item must not be NULL"
|
|
+
|
|
+
|
|
+# vim: sw=4 ts=4 sts=4 noet ai
|