diff --git a/source/virtualBuffers/__init__.py b/source/virtualBuffers/__init__.py index 47557255027..92ca30da326 100644 --- a/source/virtualBuffers/__init__.py +++ b/source/virtualBuffers/__init__.py @@ -35,6 +35,10 @@ VBufRemote_nodeHandle_t = ctypes.c_ulonglong +def _normalizeIdentifier(docHandle: int | None, ID: int | None) -> tuple[int, int]: + return docHandle if docHandle is not None else 0, ID if ID is not None else 0 + + class VBufStorage_findMatch_word(str): pass @@ -223,7 +227,7 @@ def _getNVDAObjectFromOffset(self, offset): return self.obj.getNVDAObjectFromIdentifier(docHandle, ID) def _getOffsetsFromNVDAObjectInBuffer(self, obj): - docHandle, ID = self.obj.getIdentifierFromNVDAObject(obj) + docHandle, ID = _normalizeIdentifier(*self.obj.getIdentifierFromNVDAObject(obj)) return self._getOffsetsFromFieldIdentifier(docHandle, ID) def _getOffsetsFromNVDAObject(self, obj): @@ -520,7 +524,9 @@ def __init__(self, rootNVDAObject, backendName=None): self.backendName = backendName self.VBufHandle = None self.isLoading = False - self.rootDocHandle, self.rootID = self.getIdentifierFromNVDAObject(self.rootNVDAObject) + self.rootDocHandle, self.rootID = _normalizeIdentifier( + *self.getIdentifierFromNVDAObject(self.rootNVDAObject), + ) self.rootIdentifiers[self.rootDocHandle, self.rootID] = self def prepare(self): @@ -629,7 +635,7 @@ def unloadBuffer(self): self.VBufHandle = None def isNVDAObjectPartOfLayoutTable(self, obj): - docHandle, ID = self.getIdentifierFromNVDAObject(obj) + docHandle, ID = _normalizeIdentifier(*self.getIdentifierFromNVDAObject(obj)) ID = str(ID) info = self.makeTextInfo(obj) info.collapse() @@ -869,7 +875,7 @@ def _handleUpdate(self): braille.handler.handleUpdate(self) def getControlFieldForNVDAObject(self, obj): - docHandle, objId = self.getIdentifierFromNVDAObject(obj) + docHandle, objId = _normalizeIdentifier(*self.getIdentifierFromNVDAObject(obj)) objId = str(objId) info = self.makeTextInfo(obj) info.collapse() @@ -888,7 +894,7 @@ def _isNVDAObjectInApplication_noWalk(self, obj): return inApp # If the object is in the buffer, it's definitely not in an application. try: - docHandle, objId = self.getIdentifierFromNVDAObject(obj) + docHandle, objId = _normalizeIdentifier(*self.getIdentifierFromNVDAObject(obj)) except: # noqa: E722 log.debugWarning( "getIdentifierFromNVDAObject failed. Object probably died while walking ancestors.", @@ -901,8 +907,8 @@ def _isNVDAObjectInApplication_noWalk(self, obj): try: NVDAHelper.localLib.VBuf_getControlFieldNodeWithIdentifier( self.VBufHandle, - docHandle if docHandle is not None else 0, - objId if objId is not None else 0, + docHandle, + objId, ctypes.byref(node), ) except WindowsError: diff --git a/user_docs/en/changes.md b/user_docs/en/changes.md index 264bda4570b..078cf76b560 100644 --- a/user_docs/en/changes.md +++ b/user_docs/en/changes.md @@ -88,6 +88,7 @@ The setting is disabled by default. (#20013, @LeonarddeR) * Fixed an error that could occur when NVDA checked whether a language is supported for a synthesizer with invalid languages. (#20080, @nvdaes) * NVDA will attempt to recover more quickly from freezes in some applications, especially those written in Java. (#14396, @thgcode) * In Firefox browse mode, the accessible name of form controls (such as checkboxes and radio buttons) is now correctly announced when the control has an `aria-label` and an associated `