diff --git a/source/IAccessibleHandler/__init__.py b/source/IAccessibleHandler/__init__.py
index beba0bab96d..9a32972a1bd 100644
--- a/source/IAccessibleHandler/__init__.py
+++ b/source/IAccessibleHandler/__init__.py
@@ -1,4 +1,3 @@
-# IAccessibleHandler.py
# A part of NonVisual Desktop Access (NVDA)
# Copyright (C) 2006-2007 NVDA Contributors
# This file is covered by the GNU General Public License.
@@ -7,8 +6,6 @@
from typing import Tuple
import struct
import weakref
-# Kept for backwards compatibility
-from ctypes import * # noqa: F401, F403
from ctypes import (
wintypes,
windll,
@@ -26,80 +23,9 @@
import oleacc
import UIAHandler
-# Kept for backwards compatibility
-from comInterfaces.Accessibility import * # noqa: F401, F403
-# Specific imports for items we know we use, hopefully in the future we can remove the import for this module.
-from comInterfaces.Accessibility import (
- IAccessible,
- IAccIdentity,
- CAccPropServices,
-)
-# Kept for backwards compatibility
-from comInterfaces.IAccessible2Lib import * # noqa: F401, F403
-# Specific imports for items we know we use, hopefully in the future we can remove the import for this module.
-from comInterfaces.IAccessible2Lib import (
- IAccessibleText,
- IAccessibleHypertext,
- IAccessible2,
- IA2_STATE_REQUIRED,
- IA2_STATE_INVALID_ENTRY,
- IA2_STATE_MODAL,
- IA2_STATE_DEFUNCT,
- IA2_STATE_SUPPORTS_AUTOCOMPLETION,
- IA2_STATE_MULTI_LINE,
- IA2_STATE_ICONIFIED,
- IA2_STATE_EDITABLE,
- IA2_STATE_PINNED,
- IA2_STATE_CHECKABLE,
- IA2_ROLE_UNKNOWN,
- IA2_ROLE_CANVAS,
- IA2_ROLE_CAPTION,
- IA2_ROLE_CHECK_MENU_ITEM,
- IA2_ROLE_COLOR_CHOOSER,
- IA2_ROLE_DATE_EDITOR,
- IA2_ROLE_DIRECTORY_PANE,
- IA2_ROLE_DESKTOP_PANE,
- IA2_ROLE_EDITBAR,
- IA2_ROLE_EMBEDDED_OBJECT,
- IA2_ROLE_ENDNOTE,
- IA2_ROLE_FILE_CHOOSER,
- IA2_ROLE_FONT_CHOOSER,
- IA2_ROLE_FRAME,
- IA2_ROLE_FOOTNOTE,
- IA2_ROLE_FORM,
- IA2_ROLE_GLASS_PANE,
- IA2_ROLE_HEADER,
- IA2_ROLE_HEADING,
- IA2_ROLE_ICON,
- IA2_ROLE_IMAGE_MAP,
- IA2_ROLE_INPUT_METHOD_WINDOW,
- IA2_ROLE_INTERNAL_FRAME,
- IA2_ROLE_LABEL,
- IA2_ROLE_LAYERED_PANE,
- IA2_ROLE_NOTE,
- IA2_ROLE_OPTION_PANE,
- IA2_ROLE_PAGE,
- IA2_ROLE_PARAGRAPH,
- IA2_ROLE_RADIO_MENU_ITEM,
- IA2_ROLE_REDUNDANT_OBJECT,
- IA2_ROLE_ROOT_PANE,
- IA2_ROLE_RULER,
- IA2_ROLE_SCROLL_PANE,
- IA2_ROLE_SECTION,
- IA2_ROLE_SHAPE,
- IA2_ROLE_SPLIT_PANE,
- IA2_ROLE_TEAR_OFF_MENU,
- IA2_ROLE_TERMINAL,
- IA2_ROLE_TEXT_FRAME,
- IA2_ROLE_TOGGLE_BUTTON,
- IA2_ROLE_VIEW_PORT,
- IA2_ROLE_CONTENT_DELETION,
- IA2_ROLE_CONTENT_INSERTION,
- IA2_ROLE_BLOCK_QUOTE,
- IA2_ROLE_DESKTOP_ICON,
- IA2_ROLE_FOOTER,
- IA2_ROLE_MARK,
-)
+from comInterfaces import Accessibility as IA
+
+from comInterfaces import IAccessible2Lib as IA2
import config
@@ -170,15 +96,7 @@ def isMSAADebugLoggingEnabled():
]
from . import internalWinEventHandler
-# Imported for backwards compat
-from .internalWinEventHandler import ( # noqa: F401
- winEventHookIDs,
- winEventLimiter,
- winEventIDsToNVDAEventNames,
- _shouldGetEvents,
-)
-from comInterfaces import IAccessible2Lib as IA2
from logHandler import log
import JABHandler
import eventHandler
@@ -276,55 +194,55 @@ def isMSAADebugLoggingEnabled():
oleacc.ROLE_SYSTEM_OUTLINEBUTTON: controlTypes.ROLE_TREEVIEWBUTTON,
oleacc.ROLE_SYSTEM_CLOCK: controlTypes.ROLE_CLOCK,
# IAccessible2 roles
- IA2_ROLE_UNKNOWN: controlTypes.ROLE_UNKNOWN,
- IA2_ROLE_CANVAS: controlTypes.ROLE_CANVAS,
- IA2_ROLE_CAPTION: controlTypes.ROLE_CAPTION,
- IA2_ROLE_CHECK_MENU_ITEM: controlTypes.ROLE_CHECKMENUITEM,
- IA2_ROLE_COLOR_CHOOSER: controlTypes.ROLE_COLORCHOOSER,
- IA2_ROLE_DATE_EDITOR: controlTypes.ROLE_DATEEDITOR,
- IA2_ROLE_DESKTOP_ICON: controlTypes.ROLE_DESKTOPICON,
- IA2_ROLE_DESKTOP_PANE: controlTypes.ROLE_DESKTOPPANE,
- IA2_ROLE_DIRECTORY_PANE: controlTypes.ROLE_DIRECTORYPANE,
- IA2_ROLE_EDITBAR: controlTypes.ROLE_EDITBAR,
- IA2_ROLE_EMBEDDED_OBJECT: controlTypes.ROLE_EMBEDDEDOBJECT,
- IA2_ROLE_ENDNOTE: controlTypes.ROLE_ENDNOTE,
- IA2_ROLE_FILE_CHOOSER: controlTypes.ROLE_FILECHOOSER,
- IA2_ROLE_FONT_CHOOSER: controlTypes.ROLE_FONTCHOOSER,
- IA2_ROLE_FOOTER: controlTypes.ROLE_FOOTER,
- IA2_ROLE_FOOTNOTE: controlTypes.ROLE_FOOTNOTE,
- IA2_ROLE_FORM: controlTypes.ROLE_FORM,
- IA2_ROLE_FRAME: controlTypes.ROLE_FRAME,
- IA2_ROLE_GLASS_PANE: controlTypes.ROLE_GLASSPANE,
- IA2_ROLE_HEADER: controlTypes.ROLE_HEADER,
- IA2_ROLE_HEADING: controlTypes.ROLE_HEADING,
- IA2_ROLE_ICON: controlTypes.ROLE_ICON,
- IA2_ROLE_IMAGE_MAP: controlTypes.ROLE_IMAGEMAP,
- IA2_ROLE_INPUT_METHOD_WINDOW: controlTypes.ROLE_INPUTWINDOW,
- IA2_ROLE_INTERNAL_FRAME: controlTypes.ROLE_INTERNALFRAME,
- IA2_ROLE_LABEL: controlTypes.ROLE_LABEL,
- IA2_ROLE_LAYERED_PANE: controlTypes.ROLE_LAYEREDPANE,
- IA2_ROLE_NOTE: controlTypes.ROLE_NOTE,
- IA2_ROLE_OPTION_PANE: controlTypes.ROLE_OPTIONPANE,
- IA2_ROLE_PAGE: controlTypes.ROLE_PAGE,
- IA2_ROLE_PARAGRAPH: controlTypes.ROLE_PARAGRAPH,
- IA2_ROLE_RADIO_MENU_ITEM: controlTypes.ROLE_RADIOMENUITEM,
- IA2_ROLE_REDUNDANT_OBJECT: controlTypes.ROLE_REDUNDANTOBJECT,
- IA2_ROLE_ROOT_PANE: controlTypes.ROLE_ROOTPANE,
- IA2_ROLE_RULER: controlTypes.ROLE_RULER,
- IA2_ROLE_SCROLL_PANE: controlTypes.ROLE_SCROLLPANE,
- IA2_ROLE_SECTION: controlTypes.ROLE_SECTION,
- IA2_ROLE_SHAPE: controlTypes.ROLE_SHAPE,
- IA2_ROLE_SPLIT_PANE: controlTypes.ROLE_SPLITPANE,
- IA2_ROLE_TEAR_OFF_MENU: controlTypes.ROLE_TEAROFFMENU,
- IA2_ROLE_TERMINAL: controlTypes.ROLE_TERMINAL,
- IA2_ROLE_TEXT_FRAME: controlTypes.ROLE_TEXTFRAME,
- IA2_ROLE_TOGGLE_BUTTON: controlTypes.ROLE_TOGGLEBUTTON,
- IA2_ROLE_VIEW_PORT: controlTypes.ROLE_VIEWPORT,
- IA2_ROLE_CONTENT_DELETION: controlTypes.ROLE_DELETED_CONTENT,
- IA2_ROLE_CONTENT_INSERTION: controlTypes.ROLE_INSERTED_CONTENT,
- IA2_ROLE_BLOCK_QUOTE: controlTypes.ROLE_BLOCKQUOTE,
+ IA2.IA2_ROLE_UNKNOWN: controlTypes.ROLE_UNKNOWN,
+ IA2.IA2_ROLE_CANVAS: controlTypes.ROLE_CANVAS,
+ IA2.IA2_ROLE_CAPTION: controlTypes.ROLE_CAPTION,
+ IA2.IA2_ROLE_CHECK_MENU_ITEM: controlTypes.ROLE_CHECKMENUITEM,
+ IA2.IA2_ROLE_COLOR_CHOOSER: controlTypes.ROLE_COLORCHOOSER,
+ IA2.IA2_ROLE_DATE_EDITOR: controlTypes.ROLE_DATEEDITOR,
+ IA2.IA2_ROLE_DESKTOP_ICON: controlTypes.ROLE_DESKTOPICON,
+ IA2.IA2_ROLE_DESKTOP_PANE: controlTypes.ROLE_DESKTOPPANE,
+ IA2.IA2_ROLE_DIRECTORY_PANE: controlTypes.ROLE_DIRECTORYPANE,
+ IA2.IA2_ROLE_EDITBAR: controlTypes.ROLE_EDITBAR,
+ IA2.IA2_ROLE_EMBEDDED_OBJECT: controlTypes.ROLE_EMBEDDEDOBJECT,
+ IA2.IA2_ROLE_ENDNOTE: controlTypes.ROLE_ENDNOTE,
+ IA2.IA2_ROLE_FILE_CHOOSER: controlTypes.ROLE_FILECHOOSER,
+ IA2.IA2_ROLE_FONT_CHOOSER: controlTypes.ROLE_FONTCHOOSER,
+ IA2.IA2_ROLE_FOOTER: controlTypes.ROLE_FOOTER,
+ IA2.IA2_ROLE_FOOTNOTE: controlTypes.ROLE_FOOTNOTE,
+ IA2.IA2_ROLE_FORM: controlTypes.ROLE_FORM,
+ IA2.IA2_ROLE_FRAME: controlTypes.ROLE_FRAME,
+ IA2.IA2_ROLE_GLASS_PANE: controlTypes.ROLE_GLASSPANE,
+ IA2.IA2_ROLE_HEADER: controlTypes.ROLE_HEADER,
+ IA2.IA2_ROLE_HEADING: controlTypes.ROLE_HEADING,
+ IA2.IA2_ROLE_ICON: controlTypes.ROLE_ICON,
+ IA2.IA2_ROLE_IMAGE_MAP: controlTypes.ROLE_IMAGEMAP,
+ IA2.IA2_ROLE_INPUT_METHOD_WINDOW: controlTypes.ROLE_INPUTWINDOW,
+ IA2.IA2_ROLE_INTERNAL_FRAME: controlTypes.ROLE_INTERNALFRAME,
+ IA2.IA2_ROLE_LABEL: controlTypes.ROLE_LABEL,
+ IA2.IA2_ROLE_LAYERED_PANE: controlTypes.ROLE_LAYEREDPANE,
+ IA2.IA2_ROLE_NOTE: controlTypes.ROLE_NOTE,
+ IA2.IA2_ROLE_OPTION_PANE: controlTypes.ROLE_OPTIONPANE,
+ IA2.IA2_ROLE_PAGE: controlTypes.ROLE_PAGE,
+ IA2.IA2_ROLE_PARAGRAPH: controlTypes.ROLE_PARAGRAPH,
+ IA2.IA2_ROLE_RADIO_MENU_ITEM: controlTypes.ROLE_RADIOMENUITEM,
+ IA2.IA2_ROLE_REDUNDANT_OBJECT: controlTypes.ROLE_REDUNDANTOBJECT,
+ IA2.IA2_ROLE_ROOT_PANE: controlTypes.ROLE_ROOTPANE,
+ IA2.IA2_ROLE_RULER: controlTypes.ROLE_RULER,
+ IA2.IA2_ROLE_SCROLL_PANE: controlTypes.ROLE_SCROLLPANE,
+ IA2.IA2_ROLE_SECTION: controlTypes.ROLE_SECTION,
+ IA2.IA2_ROLE_SHAPE: controlTypes.ROLE_SHAPE,
+ IA2.IA2_ROLE_SPLIT_PANE: controlTypes.ROLE_SPLITPANE,
+ IA2.IA2_ROLE_TEAR_OFF_MENU: controlTypes.ROLE_TEAROFFMENU,
+ IA2.IA2_ROLE_TERMINAL: controlTypes.ROLE_TERMINAL,
+ IA2.IA2_ROLE_TEXT_FRAME: controlTypes.ROLE_TEXTFRAME,
+ IA2.IA2_ROLE_TOGGLE_BUTTON: controlTypes.ROLE_TOGGLEBUTTON,
+ IA2.IA2_ROLE_VIEW_PORT: controlTypes.ROLE_VIEWPORT,
+ IA2.IA2_ROLE_CONTENT_DELETION: controlTypes.ROLE_DELETED_CONTENT,
+ IA2.IA2_ROLE_CONTENT_INSERTION: controlTypes.ROLE_INSERTED_CONTENT,
+ IA2.IA2_ROLE_BLOCK_QUOTE: controlTypes.ROLE_BLOCKQUOTE,
IA2.IA2_ROLE_LANDMARK: controlTypes.ROLE_LANDMARK,
- IA2_ROLE_MARK: controlTypes.ROLE_MARKED_CONTENT,
+ IA2.IA2_ROLE_MARK: controlTypes.ROLE_MARKED_CONTENT,
# some common string roles
"frame": controlTypes.ROLE_FRAME,
"iframe": controlTypes.ROLE_INTERNALFRAME,
@@ -371,32 +289,32 @@ def isMSAADebugLoggingEnabled():
}
IAccessible2StatesToNVDAStates = {
- IA2_STATE_REQUIRED: controlTypes.STATE_REQUIRED,
- IA2_STATE_DEFUNCT: controlTypes.STATE_DEFUNCT,
- # IA2_STATE_STALE:controlTypes.STATE_DEFUNCT,
- IA2_STATE_INVALID_ENTRY: controlTypes.STATE_INVALID_ENTRY,
- IA2_STATE_MODAL: controlTypes.STATE_MODAL,
- IA2_STATE_SUPPORTS_AUTOCOMPLETION: controlTypes.STATE_AUTOCOMPLETE,
- IA2_STATE_MULTI_LINE: controlTypes.STATE_MULTILINE,
- IA2_STATE_ICONIFIED: controlTypes.STATE_ICONIFIED,
- IA2_STATE_EDITABLE: controlTypes.STATE_EDITABLE,
- IA2_STATE_PINNED: controlTypes.STATE_PINNED,
- IA2_STATE_CHECKABLE: controlTypes.STATE_CHECKABLE,
+ IA2.IA2_STATE_REQUIRED: controlTypes.STATE_REQUIRED,
+ IA2.IA2_STATE_DEFUNCT: controlTypes.STATE_DEFUNCT,
+ # IA2.IA2_STATE_STALE:controlTypes.STATE_DEFUNCT,
+ IA2.IA2_STATE_INVALID_ENTRY: controlTypes.STATE_INVALID_ENTRY,
+ IA2.IA2_STATE_MODAL: controlTypes.STATE_MODAL,
+ IA2.IA2_STATE_SUPPORTS_AUTOCOMPLETION: controlTypes.STATE_AUTOCOMPLETE,
+ IA2.IA2_STATE_MULTI_LINE: controlTypes.STATE_MULTILINE,
+ IA2.IA2_STATE_ICONIFIED: controlTypes.STATE_ICONIFIED,
+ IA2.IA2_STATE_EDITABLE: controlTypes.STATE_EDITABLE,
+ IA2.IA2_STATE_PINNED: controlTypes.STATE_PINNED,
+ IA2.IA2_STATE_CHECKABLE: controlTypes.STATE_CHECKABLE,
}
def normalizeIAccessible(pacc, childID=0):
- if not isinstance(pacc, IAccessible):
+ if not isinstance(pacc, IA.IAccessible):
try:
- pacc = pacc.QueryInterface(IAccessible)
+ pacc = pacc.QueryInterface(IA.IAccessible)
except COMError:
raise RuntimeError("%s Not an IAccessible" % pacc)
# #2558: IAccessible2 doesn't support simple children.
# Therefore, it doesn't make sense to use IA2 if the child ID is non-0.
- if childID == 0 and not isinstance(pacc, IAccessible2):
+ if childID == 0 and not isinstance(pacc, IA2.IAccessible2):
try:
s = pacc.QueryInterface(IServiceProvider)
- pacc2 = s.QueryService(IAccessible._iid_, IAccessible2)
+ pacc2 = s.QueryService(IA.IAccessible._iid_, IA2.IAccessible2)
if not pacc2:
# QueryService should fail if IA2 is not supported, but some applications such as AIM 7 misbehave
# and return a null COM pointer. Treat this as if QueryService failed.
@@ -595,7 +513,7 @@ def winEventToNVDAEvent(eventID, window, objectID, childID, useCache=True):
f"Creating NVDA event from winEvent: {getWinEventLogInfo(window, objectID, childID, eventID)}, "
f"use cache {useCache}"
)
- NVDAEventName = winEventIDsToNVDAEventNames.get(eventID, None)
+ NVDAEventName = internalWinEventHandler.winEventIDsToNVDAEventNames.get(eventID, None)
if not NVDAEventName:
log.debugWarning(f"No NVDA event name for {getWinEventName(eventID)}")
return None
@@ -1036,7 +954,7 @@ def _fakeFocus(oldFocus):
def initialize():
global accPropServices
try:
- accPropServices = comtypes.client.CreateObject(CAccPropServices)
+ accPropServices = comtypes.client.CreateObject(IA.CAccPropServices)
except (WindowsError, COMError) as e:
log.debugWarning("AccPropServices is not available: %s" % e)
internalWinEventHandler.initialize(processDestroyWinEvent)
@@ -1044,7 +962,7 @@ def initialize():
# C901 'pumpAll' is too complex
def pumpAll(): # noqa: C901
- if not _shouldGetEvents():
+ if not internalWinEventHandler._shouldGetEvents():
return
focusWinEvents = []
validFocus = False
@@ -1058,7 +976,7 @@ def pumpAll(): # noqa: C901
alwaysAllowedObjects.append((focus.event_windowHandle, focus.event_objectID, focus.event_childID))
# Receive all the winEvents from the limiter for this cycle
- winEvents = winEventLimiter.flushEvents(alwaysAllowedObjects)
+ winEvents = internalWinEventHandler.winEventLimiter.flushEvents(alwaysAllowedObjects)
for winEvent in winEvents:
isEventOnCaret = winEvent[2] == winUser.OBJID_CARET
@@ -1074,7 +992,7 @@ def pumpAll(): # noqa: C901
if not focus.shouldAcceptShowHideCaretEvent:
continue
elif not eventHandler.shouldAcceptEvent(
- winEventIDsToNVDAEventNames[winEvent[0]],
+ internalWinEventHandler.winEventIDsToNVDAEventNames[winEvent[0]],
windowHandle=winEvent[1]
):
continue
@@ -1128,7 +1046,7 @@ def terminate():
def getIAccIdentity(pacc, childID):
- IAccIdentityObject = pacc.QueryInterface(IAccIdentity)
+ IAccIdentityObject = pacc.QueryInterface(IA.IAccIdentity)
stringPtr, stringSize = IAccIdentityObject.getIdentityString(childID)
try:
if accPropServices:
@@ -1186,16 +1104,16 @@ def findGroupboxObject(obj):
# C901 'getRecursiveTextFromIAccessibleTextObject'
def getRecursiveTextFromIAccessibleTextObject(obj, startOffset=0, endOffset=-1): # noqa: C901
- if not isinstance(obj, IAccessibleText):
+ if not isinstance(obj, IA2.IAccessibleText):
try:
- textObject = obj.QueryInterface(IAccessibleText)
+ textObject = obj.QueryInterface(IA2.IAccessibleText)
except: # noqa: E722 Bare except
textObject = None
else:
textObject = obj
- if not isinstance(obj, IAccessible):
+ if not isinstance(obj, IA.IAccessible):
try:
- accObject = obj.QueryInterface(IAccessible)
+ accObject = obj.QueryInterface(IA.IAccessible)
except: # noqa: E722 Bare except
return ""
else:
@@ -1219,7 +1137,7 @@ def getRecursiveTextFromIAccessibleTextObject(obj, startOffset=0, endOffset=-1):
description = None
return " ".join([x for x in [name, value, description] if x and not x.isspace()])
try:
- hypertextObject = accObject.QueryInterface(IAccessibleHypertext)
+ hypertextObject = accObject.QueryInterface(IA2.IAccessibleHypertext)
except: # noqa: E722 Bare except
return text
textList = []
@@ -1227,7 +1145,7 @@ def getRecursiveTextFromIAccessibleTextObject(obj, startOffset=0, endOffset=-1):
if ord(t) == 0xFFFC:
try:
index = hypertextObject.hyperlinkIndex(i + startOffset)
- childTextObject = hypertextObject.hyperlink(index).QueryInterface(IAccessible)
+ childTextObject = hypertextObject.hyperlink(index).QueryInterface(IA.IAccessible)
t = " %s " % getRecursiveTextFromIAccessibleTextObject(childTextObject)
except: # noqa: E722 Bare except
pass
@@ -1322,7 +1240,7 @@ def isMarshalledIAccessible(IAccessibleObject):
"""Looks at the location of the first function in the IAccessible object's vtable (IUnknown::AddRef) to
see if it was implemented in oleacc.dll (its local) or ole32.dll (its marshalled).
"""
- if not isinstance(IAccessibleObject, IAccessible):
+ if not isinstance(IAccessibleObject, IA.IAccessible):
raise TypeError("object should be of type IAccessible, not %s" % IAccessibleObject)
buf = create_unicode_buffer(1024)
addr = POINTER(c_void_p).from_address(
diff --git a/source/IAccessibleHandler/internalWinEventHandler.py b/source/IAccessibleHandler/internalWinEventHandler.py
index 9765ea8213b..43ab1376b97 100644
--- a/source/IAccessibleHandler/internalWinEventHandler.py
+++ b/source/IAccessibleHandler/internalWinEventHandler.py
@@ -16,13 +16,8 @@
from . import getWinEventLogInfo
from . import isMSAADebugLoggingEnabled
+from comInterfaces import IAccessible2Lib as IA2
-from comInterfaces.IAccessible2Lib import (
- IA2_EVENT_TEXT_CARET_MOVED,
- IA2_EVENT_DOCUMENT_LOAD_COMPLETE,
- IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED,
- IA2_EVENT_PAGE_CHANGED,
-)
from .orderedWinEventLimiter import OrderedWinEventLimiter, MENU_EVENTIDS
from logHandler import log
@@ -61,10 +56,10 @@
winUser.EVENT_OBJECT_STATECHANGE: "stateChange",
winUser.EVENT_OBJECT_VALUECHANGE: "valueChange",
winUser.EVENT_OBJECT_LIVEREGIONCHANGED: "liveRegionChange",
- IA2_EVENT_TEXT_CARET_MOVED: "caret",
- IA2_EVENT_DOCUMENT_LOAD_COMPLETE: "documentLoadComplete",
- IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED: "IA2AttributeChange",
- IA2_EVENT_PAGE_CHANGED: "pageChange",
+ IA2.IA2_EVENT_TEXT_CARET_MOVED: "caret",
+ IA2.IA2_EVENT_DOCUMENT_LOAD_COMPLETE: "documentLoadComplete",
+ IA2.IA2_EVENT_OBJECT_ATTRIBUTE_CHANGED: "IA2AttributeChange",
+ IA2.IA2_EVENT_PAGE_CHANGED: "pageChange",
}
_processDestroyWinEvent = None
diff --git a/source/NVDAObjects/IAccessible/__init__.py b/source/NVDAObjects/IAccessible/__init__.py
index 0486fdce660..4e1f83f1589 100644
--- a/source/NVDAObjects/IAccessible/__init__.py
+++ b/source/NVDAObjects/IAccessible/__init__.py
@@ -12,6 +12,7 @@
import itertools
import importlib
from comInterfaces.tom import ITextDocument
+from comInterfaces import IAccessible2Lib as IA2
import tones
import languageHandler
import textInfos.offsets
@@ -124,7 +125,9 @@ def _get_encoding(self):
def _getOffsetFromPoint(self,x,y):
if self.obj.IAccessibleTextObject.nCharacters>0:
- offset = self.obj.IAccessibleTextObject.OffsetAtPoint(x,y,IAccessibleHandler.IA2_COORDTYPE_SCREEN_RELATIVE)
+ offset = self.obj.IAccessibleTextObject.OffsetAtPoint(
+ x, y, IA2.IA2_COORDTYPE_SCREEN_RELATIVE
+ )
# IA2 specifies that a result of -1 indicates that
# the point is invalid or there is no character under the point.
# Note that Chromium does not follow the spec and returns 0 for invalid or no character points.
@@ -138,7 +141,9 @@ def _getOffsetFromPoint(self,x,y):
@classmethod
def _getBoundingRectFromOffsetInObject(cls,obj,offset):
try:
- res=RectLTWH(*obj.IAccessibleTextObject.characterExtents(offset,IAccessibleHandler.IA2_COORDTYPE_SCREEN_RELATIVE))
+ res = RectLTWH(*obj.IAccessibleTextObject.characterExtents(
+ offset, IA2.IA2_COORDTYPE_SCREEN_RELATIVE
+ ))
except COMError:
raise NotImplementedError
if not any(res[2:]):
@@ -259,7 +264,7 @@ def _getCharacterOffsets(self,offset):
except COMError:
pass
try:
- start,end,text = self.obj.IAccessibleTextObject.TextAtOffset(offset,IAccessibleHandler.IA2_TEXT_BOUNDARY_CHAR)
+ start, end, text = self.obj.IAccessibleTextObject.TextAtOffset(offset, IA2.IA2_TEXT_BOUNDARY_CHAR)
except COMError:
return super(IA2TextTextInfo,self)._getCharacterOffsets(offset)
if text and (textUtils.isHighSurrogate(text) or textUtils.isLowSurrogate(text)):
@@ -275,7 +280,7 @@ def _getWordOffsets(self,offset):
except COMError:
pass
try:
- start,end,text=self.obj.IAccessibleTextObject.TextAtOffset(offset,IAccessibleHandler.IA2_TEXT_BOUNDARY_WORD)
+ start, end, text = self.obj.IAccessibleTextObject.TextAtOffset(offset, IA2.IA2_TEXT_BOUNDARY_WORD)
except COMError:
return super(IA2TextTextInfo,self)._getWordOffsets(offset)
if start>offset or offset>end:
@@ -285,7 +290,7 @@ def _getWordOffsets(self,offset):
def _getLineOffsets(self,offset):
try:
- start,end,text=self.obj.IAccessibleTextObject.TextAtOffset(offset,IAccessibleHandler.IA2_TEXT_BOUNDARY_LINE)
+ start, end, text = self.obj.IAccessibleTextObject.TextAtOffset(offset, IA2.IA2_TEXT_BOUNDARY_LINE)
return start,end
except COMError:
log.debugWarning("IAccessibleText::textAtOffset failed",exc_info=True)
@@ -298,7 +303,7 @@ def _getSentenceOffsets(self,offset):
except COMError:
pass
try:
- start,end,text=self.obj.IAccessibleTextObject.TextAtOffset(offset,IAccessibleHandler.IA2_TEXT_BOUNDARY_SENTENCE)
+ start, end, text = self.obj.IAccessibleTextObject.TextAtOffset(offset, IA2.IA2_TEXT_BOUNDARY_SENTENCE)
if start==end:
raise NotImplementedError
return start,end
@@ -312,7 +317,7 @@ def _getParagraphOffsets(self,offset):
except COMError:
pass
try:
- start,end,text=self.obj.IAccessibleTextObject.TextAtOffset(offset,IAccessibleHandler.IA2_TEXT_BOUNDARY_PARAGRAPH)
+ start, end, text = self.obj.IAccessibleTextObject.TextAtOffset(offset, IA2.IA2_TEXT_BOUNDARY_PARAGRAPH)
if start>=end:
raise RuntimeError("did not expand to paragraph correctly")
return start,end
@@ -564,7 +569,11 @@ def findOverlayClasses(self,clsList):
clsList.append(IAccessible)
- if self.event_objectID==winUser.OBJID_CLIENT and self.event_childID==0 and not isinstance(self.IAccessibleObject,IAccessibleHandler.IAccessible2):
+ if(
+ self.event_objectID == winUser.OBJID_CLIENT
+ and self.event_childID == 0
+ and not isinstance(self.IAccessibleObject, IA2.IAccessible2)
+ ):
# This is the main (client) area of the window, so we can use other classes at the window level.
# #3872: However, don't do this for IAccessible2 because
# IA2 supersedes window level APIs and might conflict with them.
@@ -588,7 +597,7 @@ def __init__(self,windowHandle=None,IAccessibleObject=None,IAccessibleChildID=No
self.IAccessibleChildID=IAccessibleChildID
# Try every trick in the book to get the window handle if we don't have it.
- if not windowHandle and isinstance(IAccessibleObject,IAccessibleHandler.IAccessible2):
+ if not windowHandle and isinstance(IAccessibleObject, IA2.IAccessible2):
windowHandle=self.IA2WindowHandle
try:
Identity=IAccessibleHandler.getIAccIdentity(IAccessibleObject,IAccessibleChildID)
@@ -614,7 +623,7 @@ def __init__(self,windowHandle=None,IAccessibleObject=None,IAccessibleChildID=No
if not windowHandle:
raise InvalidNVDAObject("Can't get a window handle from IAccessible")
- if isinstance(IAccessibleObject,IAccessibleHandler.IAccessible2):
+ if isinstance(IAccessibleObject, IA2.IAccessible2):
try:
self.IA2UniqueID=IAccessibleObject.uniqueID
except COMError:
@@ -623,7 +632,7 @@ def __init__(self,windowHandle=None,IAccessibleObject=None,IAccessibleChildID=No
# Set the event params based on our calculated/construction info if we must.
if event_windowHandle is None:
event_windowHandle=windowHandle
- if event_objectID is None and isinstance(IAccessibleObject,IAccessibleHandler.IAccessible2):
+ if event_objectID is None and isinstance(IAccessibleObject, IA2.IAccessible2):
event_objectID=winUser.OBJID_CLIENT
if event_childID is None:
if self.IA2UniqueID is not None:
@@ -637,18 +646,18 @@ def __init__(self,windowHandle=None,IAccessibleObject=None,IAccessibleChildID=No
super(IAccessible,self).__init__(windowHandle=windowHandle)
try:
- self.IAccessibleActionObject=IAccessibleObject.QueryInterface(IAccessibleHandler.IAccessibleAction)
+ self.IAccessibleActionObject = IAccessibleObject.QueryInterface(IA2.IAccessibleAction)
except COMError:
pass
try:
- self.IAccessibleTable2Object=self.IAccessibleObject.QueryInterface(IAccessibleHandler.IAccessibleTable2)
+ self.IAccessibleTable2Object = self.IAccessibleObject.QueryInterface(IA2.IAccessibleTable2)
except COMError:
try:
- self.IAccessibleTableObject=self.IAccessibleObject.QueryInterface(IAccessibleHandler.IAccessibleTable)
+ self.IAccessibleTableObject = self.IAccessibleObject.QueryInterface(IA2.IAccessibleTable)
except COMError:
pass
try:
- self.IAccessibleTextObject=IAccessibleObject.QueryInterface(IAccessibleHandler.IAccessibleText)
+ self.IAccessibleTextObject = IAccessibleObject.QueryInterface(IA2.IAccessibleText)
except COMError:
pass
if None not in (event_windowHandle,event_objectID,event_childID):
@@ -698,7 +707,10 @@ def _isEqual(self,other):
return False
if self.IAccessibleObject==other.IAccessibleObject:
return True
- if isinstance(self.IAccessibleObject,IAccessibleHandler.IAccessible2) and isinstance(other.IAccessibleObject,IAccessibleHandler.IAccessible2):
+ if (
+ isinstance(self.IAccessibleObject, IA2.IAccessible2)
+ and isinstance(other.IAccessibleObject, IA2.IAccessible2)
+ ):
# These are both IAccessible2 objects, so we can test unique ID.
# Unique ID is only guaranteed to be unique within a given window, so we must check window handle as well.
selfIA2Window=self.IA2WindowHandle
@@ -810,7 +822,7 @@ def _get_IAccessibleIdentity(self):
return self._IAccessibleIdentity
def _get_IAccessibleRole(self):
- if isinstance(self.IAccessibleObject,IAccessibleHandler.IAccessible2):
+ if isinstance(self.IAccessibleObject, IA2.IAccessible2):
try:
role=self.IAccessibleObject.role()
except COMError:
@@ -857,7 +869,7 @@ def _get_states(self):
log.debugWarning("could not get IAccessible states",exc_info=True)
else:
states.update(IAccessibleHandler.IAccessibleStatesToNVDAStates[x] for x in (y for y in (1<