Skip to content

Commit

Permalink
Remove backwards compat code from IAccessibleHandler (#12232)
Browse files Browse the repository at this point in the history
removes code marked as deprecated in #10934

PR #10934 refactored IAccessibleHandler into a package. This necessitated keeping some unused imports but marking them as deprecated. Also various parts of NVDA relied on the fact that IAccessibleHandler star imported all variables from IAccessible and IAccessible2 COM interfaces.

Unused imports are removed from IAccessibleHandler
NVDA's source has been modified to use IAccessible2 names from the COM interface rather than from IAccessibleHandler.
  • Loading branch information
lukaszgo1 authored Mar 26, 2021
1 parent d90b24e commit 6a0839d
Show file tree
Hide file tree
Showing 13 changed files with 208 additions and 250 deletions.
240 changes: 79 additions & 161 deletions source/IAccessibleHandler/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
# IAccessibleHandler.py
# A part of NonVisual Desktop Access (NVDA)
# Copyright (C) 2006-2007 NVDA Contributors <http://www.nvda-project.org/>
# This file is covered by the GNU General Public License.
Expand All @@ -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,
Expand All @@ -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


Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -1036,15 +954,15 @@ 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)


# C901 'pumpAll' is too complex
def pumpAll(): # noqa: C901
if not _shouldGetEvents():
if not internalWinEventHandler._shouldGetEvents():
return
focusWinEvents = []
validFocus = False
Expand All @@ -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
Expand All @@ -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
Expand Down Expand Up @@ -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:
Expand Down Expand Up @@ -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:
Expand All @@ -1219,15 +1137,15 @@ 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 = []
for i, t in enumerate(text):
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
Expand Down Expand Up @@ -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(
Expand Down
15 changes: 5 additions & 10 deletions source/IAccessibleHandler/internalWinEventHandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
Loading

0 comments on commit 6a0839d

Please sign in to comment.