Skip to content

Commit

Permalink
Fix _getTextLines for 21H1 UIA console (PR #11760)
Browse files Browse the repository at this point in the history
Fixes #11740
  • Loading branch information
codeofdusk authored Oct 16, 2020
1 parent aead5ce commit 6ceb8ac
Showing 1 changed file with 8 additions and 4 deletions.
12 changes: 8 additions & 4 deletions source/NVDAObjects/UIA/winConsoleUIA.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,10 +48,8 @@ def _getBoundingRange(self, obj, position):
if position == textInfos.POSITION_FIRST:
collapseToEnd = False
elif position == textInfos.POSITION_LAST:
# We must pull back the end by one character otherwise when we collapse to end,
# a console bug results in a textRange covering the entire console buffer!
# Strangely the *very* last character is a special blank point
# so we never seem to miss a real character.
# The exclusive end hangs off the end of the visible ranges.
# Move back one character to remain within bounds.
_rangeObj.MoveEndpointByUnit(
UIAHandler.TextPatternRangeEndpoint_End,
UIAHandler.NVDAUnitsToUIAUnits['character'],
Expand Down Expand Up @@ -366,13 +364,19 @@ def _get_TextInfo(self):
return consoleUIATextInfo if self.is21H1Plus else consoleUIATextInfoPre21H1

def _getTextLines(self):
if self.is21H1Plus:
# #11760: the 21H1 UIA console wraps across lines.
# When text wraps, NVDA starts reading from the beginning of the visible text for every new line of output.
# Use the superclass _getTextLines instead.
return super()._getTextLines()
# This override of _getTextLines takes advantage of the fact that
# the console text contains linefeeds for every line
# Thus a simple string splitlines is much faster than splitting by unit line.
ti = self.makeTextInfo(textInfos.POSITION_ALL)
text = ti.text or ""
return text.splitlines()


def detectPossibleSelectionChange(self):
try:
return super().detectPossibleSelectionChange()
Expand Down

0 comments on commit 6ceb8ac

Please sign in to comment.