From c6662e243b408348d51e20e0ef73b798cfea03ab Mon Sep 17 00:00:00 2001 From: Bill Dengler Date: Mon, 25 May 2026 19:39:37 -0700 Subject: [PATCH 01/16] Fixup attribution, add a skip-lines beep, and hidden config flags for the new LiveText speech generator --- source/NVDAObjects/behaviors.py | 58 +++++++++++++++++++++++++-------- source/config/configSpec.py | 6 ++++ source/gui/settingsDialogs.py | 21 ++++++++++++ user_docs/en/changes.md | 2 +- user_docs/en/userGuide.md | 10 ++++++ 5 files changed, 83 insertions(+), 14 deletions(-) diff --git a/source/NVDAObjects/behaviors.py b/source/NVDAObjects/behaviors.py index 45e0cfe1aa6..6974bbb63e7 100755 --- a/source/NVDAObjects/behaviors.py +++ b/source/NVDAObjects/behaviors.py @@ -1,8 +1,8 @@ # A part of NonVisual Desktop Access (NVDA) # This file is covered by the GNU General Public License. # See the file COPYING for more details. -# Copyright (C) 2006-2025 NV Access Limited, Peter Vágner, Joseph Lee, Bill Dengler, -# Burman's Computer and Education Ltd, Cary-rowen, Cyrille Bougot +# Copyright (C) 2006-2026 NV Access Limited, Peter Vágner, Joseph Lee, Bill Dengler, +# Burman's Computer and Education Ltd, Cary-rowen, Cyrille Bougot, Ethin Probst """Mix-in classes which provide common behaviour for particular types of controls across different APIs. Behaviors described in this mix-in include providing table navigation commands for certain table rows, terminal input and output support, announcing notifications and suggestion items and so on. @@ -11,6 +11,7 @@ import os import time import threading +import math import tones import queueHandler import eventHandler @@ -384,10 +385,6 @@ class LiveText(NVDAObject): # If the text is live, this is definitely content. presentationType = NVDAObject.presType_content - MAX_LINES: int = 100 - """The maximum number of lines that will be reported when a large number of lines are queued. - Subclasses may override this to allow custom line reporting batches. - """ announceNewLineText = False def initOverlayClass(self): @@ -469,20 +466,55 @@ def _reportNewLines(self, lines: list[str]) -> None: Subclasses may override this method to provide custom filtering of new text, where logic depends on multiple lines. """ - droppedCount = len(lines) - self.MAX_LINES - if droppedCount > 0: - lines = lines[-self.MAX_LINES :] + maxNewLines: int = config.conf["terminals"]["maxNewLines"] + if maxNewLines: + droppedCount = len(lines) - maxNewLines + if droppedCount > 0: + if ( + config.conf["terminals"]["beepForSkippedLines"] + and speech.getState().speechMode == speech.SpeechMode.talk + ): + tones.beep( + config.conf["terminals"]["skippedLinesBeepHz"], + self._getSkippedLinesBeepLength(droppedCount), + ) + lines = lines[-maxNewLines:] if self._reportNewLinesGenID is not None: queueHandler.cancelGeneratorObject(self._reportNewLinesGenID) self._reportNewLinesGenID = None - self._reportNewLinesGenID = queueHandler.registerGeneratorObject(self._reportNewLinesGenerator(lines)) + newLinesBatchSize: int = config.conf["terminals"]["newLinesBatchSize"] + if newLinesBatchSize <= 0: # Report synchronously + for line in lines: + self._reportNewText(line) + else: + self._reportNewLinesGenID = queueHandler.registerGeneratorObject( + self._reportNewLinesGenerator( + lines, + newLinesBatchSize, + ), + ) - def _reportNewLinesGenerator(self, lines: list[str]) -> Generator[None, None, None]: - YIELD_EVERY = 5 # Sweet spot between yielding on every line and a batch + @staticmethod + def _getSkippedLinesBeepLength(droppedCount: int) -> int: + minLengthMs: int = config.conf["terminals"]["skippedLinesBeepMinDurationMs"] + maxLengthMs: int = config.conf["terminals"]["skippedLinesBeepMaxDurationMs"] + if maxLengthMs < minLengthMs: + maxLengthMs = minLengthMs + droppedCount = max(droppedCount, 1) + maxNewLines: int = config.conf["terminals"]["maxNewLines"] + ratio = 1.0 if maxNewLines <= 1 else min(1.0, math.log(droppedCount, maxNewLines)) + lengthRange = maxLengthMs - minLengthMs + return round(minLengthMs + lengthRange * ratio) + + def _reportNewLinesGenerator( + self, + lines: list[str], + batchSize: int, + ) -> Generator[None, None, None]: try: for i, line in enumerate(lines, 1): self._reportNewText(line) - if i % YIELD_EVERY == 0: + if i % batchSize == 0: yield finally: self._reportNewLinesGenID = None diff --git a/source/config/configSpec.py b/source/config/configSpec.py index 4f4143521b8..7e2c411c789 100644 --- a/source/config/configSpec.py +++ b/source/config/configSpec.py @@ -314,6 +314,12 @@ [terminals] speakPasswords = boolean(default=false) keyboardSupportInLegacy = boolean(default=True) + maxNewLines = integer(min=0, default=100) + newLinesBatchSize = integer(min=0, default=5) + beepForSkippedLines = boolean(default=true) + skippedLinesBeepHz = integer(default=550, min=20) + skippedLinesBeepMinDurationMs = integer(default=10, min=5, max=5000) + skippedLinesBeepMaxDurationMs = integer(default=100, min=5, max=5000) diffAlgo = option("auto", "dmp", "difflib", default="auto") wtStrategy = featureFlag(optionsEnum="WindowsTerminalStrategyFlag", behaviorOfDefault="diffing") diff --git a/source/gui/settingsDialogs.py b/source/gui/settingsDialogs.py index 75ec49d59f1..df56389b635 100644 --- a/source/gui/settingsDialogs.py +++ b/source/gui/settingsDialogs.py @@ -4533,6 +4533,22 @@ def __init__(self, parent): ["terminals", "keyboardSupportInLegacy"], ) self.keyboardSupportInLegacyCheckBox.Enable(winVersion.getWinVer() >= winVersion.WIN10_1607) + # Translators: This is the label for a checkbox in the + # Advanced settings panel. + label = _("Beep for &skipped lines") + self.beepForSkippedLinesCheckBox = terminalsGroup.addItem( + wx.CheckBox(terminalsBox, label=label), + ) + self.bindHelpEvent( + "AdvancedSettingsBeepForSkippedLines", + self.beepForSkippedLinesCheckBox, + ) + self.beepForSkippedLinesCheckBox.SetValue( + config.conf["terminals"]["beepForSkippedLines"], + ) + self.beepForSkippedLinesCheckBox.defaultValue = self._getDefaultValue( + ["terminals", "beepForSkippedLines"], + ) # Translators: This is the label for a combo box for selecting a # method of detecting changed content in terminals in the advanced @@ -4829,6 +4845,7 @@ def haveConfigDefaultsBeenRestored(self): == self.keyboardSupportInLegacyCheckBox.defaultValue and self.winConsoleSpeakPasswordsCheckBox.IsChecked() == self.winConsoleSpeakPasswordsCheckBox.defaultValue + and self.beepForSkippedLinesCheckBox.IsChecked() == self.beepForSkippedLinesCheckBox.defaultValue and self.diffAlgoCombo.GetSelection() == self.diffAlgoCombo.defaultValue and self.wtStrategyCombo.isValueConfigSpecDefault() and self.cancelExpiredFocusSpeechCombo.GetSelection() @@ -4861,6 +4878,9 @@ def restoreToDefaults(self): self.brailleLiveRegionsCombo.resetToConfigSpecDefault() self.winConsoleSpeakPasswordsCheckBox.SetValue(self.winConsoleSpeakPasswordsCheckBox.defaultValue) self.keyboardSupportInLegacyCheckBox.SetValue(self.keyboardSupportInLegacyCheckBox.defaultValue) + self.beepForSkippedLinesCheckBox.SetValue( + self.beepForSkippedLinesCheckBox.defaultValue, + ) self.diffAlgoCombo.SetSelection(self.diffAlgoCombo.defaultValue) self.wtStrategyCombo.resetToConfigSpecDefault() self.cancelExpiredFocusSpeechCombo.SetSelection(self.cancelExpiredFocusSpeechCombo.defaultValue) @@ -4903,6 +4923,7 @@ def onSave(self): self.enhancedEventProcessingComboBox.saveCurrentValueToConf() config.conf["terminals"]["speakPasswords"] = self.winConsoleSpeakPasswordsCheckBox.IsChecked() config.conf["terminals"]["keyboardSupportInLegacy"] = self.keyboardSupportInLegacyCheckBox.IsChecked() + config.conf["terminals"]["beepForSkippedLines"] = self.beepForSkippedLinesCheckBox.IsChecked() diffAlgoChoice = self.diffAlgoCombo.GetSelection() config.conf["terminals"]["diffAlgo"] = self.diffAlgoVals[diffAlgoChoice] self.wtStrategyCombo.saveCurrentValueToConf() diff --git a/user_docs/en/changes.md b/user_docs/en/changes.md index 016f21a52ee..c2255e26013 100644 --- a/user_docs/en/changes.md +++ b/user_docs/en/changes.md @@ -52,7 +52,7 @@ * In PowerPoint and other Office applications, NVDA will now correctly read and navigate the edit fields in the insert hyperlink dialog. (#17390, @aryanchoudharypro) * The actions button can now be used when selecting multiple add-ons in the Add-on Store to perform batch actions, instead of just via the context menu in the add-ons list. (#19971, @amirmahdifard) * When moving to an ARIA grid cell in focus mode in web browsers, NVDA no longer reports both the row and column headers even if only the row or only the column changed. (#17750, @jcsteh) -* In live text regions, such as terminals, NVDA no longer freezes when substantial amounts of text are dumped to the screen. (#20177) +* In live text regions, such as terminals, NVDA no longer freezes when substantial amounts of text are dumped to the screen. (#20177, #20649, @ethindp, @codeofdusk) * In Windows Terminal, NVDA is less likely to report stale characters when moving the caret in delayed remote sessions such as SSH. (#19503, @sheldon-im) * When an application stops responding, NVDA no longer freezes or floods its log with errors; it stays responsive and drops UIA and MSAA events from the unresponsive application until it recovers. (#16749, @heath-toby) * Reduced lag on UI Automation text change events, improving the responsiveness of controls such as combo boxes and of File Explorer, by using the cached element class name instead of a live cross-process fetch. (#16749, @heath-toby) diff --git a/user_docs/en/userGuide.md b/user_docs/en/userGuide.md index dc24f87284f..a183596e2de 100644 --- a/user_docs/en/userGuide.md +++ b/user_docs/en/userGuide.md @@ -4289,6 +4289,16 @@ This feature is available and enabled by default on Windows 10 versions 1607 and Warning: with this option enabled, typed characters that do not appear onscreen, such as passwords, will not be suppressed. In untrusted environments, you may temporarily disable [speak typed characters](#KeyboardSettingsSpeakTypedCharacters) and [speak typed words](#KeyboardSettingsSpeakTypedWords) when entering passwords. +##### Beep for skipped lines {#AdvancedSettingsBeepForSkippedLines} + +| . {.hideHeaderRow} |.| +|---|---| +|Options |Disabled, Enabled| +|Default |Enabled| + +This setting controls whether NVDA plays a short beep when too many new lines arrive before they can all be reported. +The beep indicates that some lines were skipped, and becomes slightly longer as more lines are skipped. + ##### Diff algorithm {#DiffAlgo} This setting controls how NVDA determines the new text to speak in terminals. From aefc46674dd760e5433b401f9185fe1cfb3f079f Mon Sep 17 00:00:00 2001 From: Bill Dengler Date: Mon, 15 Jun 2026 17:17:10 -0700 Subject: [PATCH 02/16] Update user_docs/en/userGuide.md Co-authored-by: Sean Budd --- user_docs/en/userGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/user_docs/en/userGuide.md b/user_docs/en/userGuide.md index a183596e2de..3831e402562 100644 --- a/user_docs/en/userGuide.md +++ b/user_docs/en/userGuide.md @@ -4293,8 +4293,8 @@ In untrusted environments, you may temporarily disable [speak typed characters]( | . {.hideHeaderRow} |.| |---|---| -|Options |Disabled, Enabled| -|Default |Enabled| +| Options | Disabled, Enabled | +| Default | Enabled | This setting controls whether NVDA plays a short beep when too many new lines arrive before they can all be reported. The beep indicates that some lines were skipped, and becomes slightly longer as more lines are skipped. From cde26b653b6646ebe91b7be8cefa58f50b37596c Mon Sep 17 00:00:00 2001 From: Bill Dengler Date: Mon, 15 Jun 2026 17:18:46 -0700 Subject: [PATCH 03/16] Update source/gui/settingsDialogs.py Co-authored-by: Sean Budd --- source/gui/settingsDialogs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/gui/settingsDialogs.py b/source/gui/settingsDialogs.py index df56389b635..f7e40e4f376 100644 --- a/source/gui/settingsDialogs.py +++ b/source/gui/settingsDialogs.py @@ -4534,7 +4534,7 @@ def __init__(self, parent): ) self.keyboardSupportInLegacyCheckBox.Enable(winVersion.getWinVer() >= winVersion.WIN10_1607) # Translators: This is the label for a checkbox in the - # Advanced settings panel. + # Advanced settings panel. label = _("Beep for &skipped lines") self.beepForSkippedLinesCheckBox = terminalsGroup.addItem( wx.CheckBox(terminalsBox, label=label), From 0194edce7099ea9976c6ec7b93f626953ebee506 Mon Sep 17 00:00:00 2001 From: Bill Dengler Date: Thu, 18 Jun 2026 16:28:06 -0700 Subject: [PATCH 04/16] Review action --- user_docs/en/userGuide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/user_docs/en/userGuide.md b/user_docs/en/userGuide.md index 3831e402562..caf28cc3bc6 100644 --- a/user_docs/en/userGuide.md +++ b/user_docs/en/userGuide.md @@ -4291,14 +4291,14 @@ In untrusted environments, you may temporarily disable [speak typed characters]( ##### Beep for skipped lines {#AdvancedSettingsBeepForSkippedLines} +This setting controls whether NVDA plays a short beep when too many new lines arrive before they can all be reported. +The beep indicates that some lines were skipped, and becomes slightly longer as more lines are skipped. + | . {.hideHeaderRow} |.| |---|---| | Options | Disabled, Enabled | | Default | Enabled | -This setting controls whether NVDA plays a short beep when too many new lines arrive before they can all be reported. -The beep indicates that some lines were skipped, and becomes slightly longer as more lines are skipped. - ##### Diff algorithm {#DiffAlgo} This setting controls how NVDA determines the new text to speak in terminals. From 773c11c5f391199fe10d236e688c661600c8b997 Mon Sep 17 00:00:00 2001 From: Bill Dengler Date: Tue, 30 Jun 2026 13:52:48 -0700 Subject: [PATCH 05/16] Remove hidden beep config settings --- source/NVDAObjects/behaviors.py | 13 ++++++------- source/config/configSpec.py | 3 --- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/source/NVDAObjects/behaviors.py b/source/NVDAObjects/behaviors.py index 6974bbb63e7..5714c89ba62 100755 --- a/source/NVDAObjects/behaviors.py +++ b/source/NVDAObjects/behaviors.py @@ -474,8 +474,9 @@ def _reportNewLines(self, lines: list[str]) -> None: config.conf["terminals"]["beepForSkippedLines"] and speech.getState().speechMode == speech.SpeechMode.talk ): + skippedLinesBeepHz = 550 tones.beep( - config.conf["terminals"]["skippedLinesBeepHz"], + skippedLinesBeepHz, self._getSkippedLinesBeepLength(droppedCount), ) lines = lines[-maxNewLines:] @@ -496,15 +497,13 @@ def _reportNewLines(self, lines: list[str]) -> None: @staticmethod def _getSkippedLinesBeepLength(droppedCount: int) -> int: - minLengthMs: int = config.conf["terminals"]["skippedLinesBeepMinDurationMs"] - maxLengthMs: int = config.conf["terminals"]["skippedLinesBeepMaxDurationMs"] - if maxLengthMs < minLengthMs: - maxLengthMs = minLengthMs + skippedLinesBeepMinLengthMs = 10 + skippedLinesBeepMaxLengthMs = 100 droppedCount = max(droppedCount, 1) maxNewLines: int = config.conf["terminals"]["maxNewLines"] ratio = 1.0 if maxNewLines <= 1 else min(1.0, math.log(droppedCount, maxNewLines)) - lengthRange = maxLengthMs - minLengthMs - return round(minLengthMs + lengthRange * ratio) + lengthRange = skippedLinesBeepMaxLengthMs - skippedLinesBeepMinLengthMs + return round(skippedLinesBeepMinLengthMs + lengthRange * ratio) def _reportNewLinesGenerator( self, diff --git a/source/config/configSpec.py b/source/config/configSpec.py index 7e2c411c789..debd9f9751a 100644 --- a/source/config/configSpec.py +++ b/source/config/configSpec.py @@ -317,9 +317,6 @@ maxNewLines = integer(min=0, default=100) newLinesBatchSize = integer(min=0, default=5) beepForSkippedLines = boolean(default=true) - skippedLinesBeepHz = integer(default=550, min=20) - skippedLinesBeepMinDurationMs = integer(default=10, min=5, max=5000) - skippedLinesBeepMaxDurationMs = integer(default=100, min=5, max=5000) diffAlgo = option("auto", "dmp", "difflib", default="auto") wtStrategy = featureFlag(optionsEnum="WindowsTerminalStrategyFlag", behaviorOfDefault="diffing") From 22dc0d4a06ee769d6075c9ba629a36ef8a411ce3 Mon Sep 17 00:00:00 2001 From: Bill Dengler Date: Tue, 11 Aug 2026 19:03:03 -0700 Subject: [PATCH 06/16] Remove the remaining hidden config options --- source/NVDAObjects/behaviors.py | 47 ++++++++++++++------------------- source/config/configSpec.py | 2 -- 2 files changed, 20 insertions(+), 29 deletions(-) diff --git a/source/NVDAObjects/behaviors.py b/source/NVDAObjects/behaviors.py index 5714c89ba62..239c770eb0f 100755 --- a/source/NVDAObjects/behaviors.py +++ b/source/NVDAObjects/behaviors.py @@ -385,6 +385,10 @@ class LiveText(NVDAObject): # If the text is live, this is definitely content. presentationType = NVDAObject.presType_content + MAX_LINES: int = 100 + """The maximum number of lines that will be reported when a large number of lines are queued. + Subclasses may override this to allow custom line reporting batches. + """ announceNewLineText = False def initOverlayClass(self): @@ -466,54 +470,43 @@ def _reportNewLines(self, lines: list[str]) -> None: Subclasses may override this method to provide custom filtering of new text, where logic depends on multiple lines. """ - maxNewLines: int = config.conf["terminals"]["maxNewLines"] - if maxNewLines: - droppedCount = len(lines) - maxNewLines + if self.MAX_LINES > 0: + droppedCount = len(lines) - self.MAX_LINES if droppedCount > 0: if ( config.conf["terminals"]["beepForSkippedLines"] and speech.getState().speechMode == speech.SpeechMode.talk ): - skippedLinesBeepHz = 550 + SKIPPED_LINES_BEEP_HZ = 550 tones.beep( - skippedLinesBeepHz, + SKIPPED_LINES_BEEP_HZ, self._getSkippedLinesBeepLength(droppedCount), ) - lines = lines[-maxNewLines:] + lines = lines[-self.MAX_LINES :] if self._reportNewLinesGenID is not None: queueHandler.cancelGeneratorObject(self._reportNewLinesGenID) self._reportNewLinesGenID = None - newLinesBatchSize: int = config.conf["terminals"]["newLinesBatchSize"] - if newLinesBatchSize <= 0: # Report synchronously - for line in lines: - self._reportNewText(line) - else: - self._reportNewLinesGenID = queueHandler.registerGeneratorObject( - self._reportNewLinesGenerator( - lines, - newLinesBatchSize, - ), - ) + self._reportNewLinesGenID = queueHandler.registerGeneratorObject( + self._reportNewLinesGenerator(lines), + ) - @staticmethod - def _getSkippedLinesBeepLength(droppedCount: int) -> int: - skippedLinesBeepMinLengthMs = 10 - skippedLinesBeepMaxLengthMs = 100 + def _getSkippedLinesBeepLength(self, droppedCount: int) -> int: + SKIPPED_LINES_BEEP_MIN_DURATION_MS = 10 + SKIPPED_LINES_BEEP_MAX_DURATION_MS = 100 droppedCount = max(droppedCount, 1) - maxNewLines: int = config.conf["terminals"]["maxNewLines"] - ratio = 1.0 if maxNewLines <= 1 else min(1.0, math.log(droppedCount, maxNewLines)) - lengthRange = skippedLinesBeepMaxLengthMs - skippedLinesBeepMinLengthMs - return round(skippedLinesBeepMinLengthMs + lengthRange * ratio) + ratio = 1.0 if self.MAX_LINES <= 1 else min(1.0, math.log(droppedCount, self.MAX_LINES)) + lengthRange = SKIPPED_LINES_BEEP_MAX_DURATION_MS - SKIPPED_LINES_BEEP_MIN_DURATION_MS + return round(SKIPPED_LINES_BEEP_MIN_DURATION_MS + lengthRange * ratio) def _reportNewLinesGenerator( self, lines: list[str], - batchSize: int, ) -> Generator[None, None, None]: + YIELD_EVERY = 5 # Sweet spot between yielding on every line and a batch try: for i, line in enumerate(lines, 1): self._reportNewText(line) - if i % batchSize == 0: + if i % YIELD_EVERY == 0: yield finally: self._reportNewLinesGenID = None diff --git a/source/config/configSpec.py b/source/config/configSpec.py index debd9f9751a..b87ae2d578a 100644 --- a/source/config/configSpec.py +++ b/source/config/configSpec.py @@ -314,8 +314,6 @@ [terminals] speakPasswords = boolean(default=false) keyboardSupportInLegacy = boolean(default=True) - maxNewLines = integer(min=0, default=100) - newLinesBatchSize = integer(min=0, default=5) beepForSkippedLines = boolean(default=true) diffAlgo = option("auto", "dmp", "difflib", default="auto") wtStrategy = featureFlag(optionsEnum="WindowsTerminalStrategyFlag", behaviorOfDefault="diffing") From 38e639d4d5415b1efe9697da35f782011ce21957 Mon Sep 17 00:00:00 2001 From: Bill Dengler Date: Tue, 11 Aug 2026 19:11:44 -0700 Subject: [PATCH 07/16] Fix anchor --- source/gui/settingsDialogs.py | 2 +- user_docs/en/userGuide.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/source/gui/settingsDialogs.py b/source/gui/settingsDialogs.py index f7e40e4f376..5a88d99d176 100644 --- a/source/gui/settingsDialogs.py +++ b/source/gui/settingsDialogs.py @@ -4540,7 +4540,7 @@ def __init__(self, parent): wx.CheckBox(terminalsBox, label=label), ) self.bindHelpEvent( - "AdvancedSettingsBeepForSkippedLines", + "BeepForSkippedLines", self.beepForSkippedLinesCheckBox, ) self.beepForSkippedLinesCheckBox.SetValue( diff --git a/user_docs/en/userGuide.md b/user_docs/en/userGuide.md index caf28cc3bc6..b2481b5262d 100644 --- a/user_docs/en/userGuide.md +++ b/user_docs/en/userGuide.md @@ -4289,7 +4289,7 @@ This feature is available and enabled by default on Windows 10 versions 1607 and Warning: with this option enabled, typed characters that do not appear onscreen, such as passwords, will not be suppressed. In untrusted environments, you may temporarily disable [speak typed characters](#KeyboardSettingsSpeakTypedCharacters) and [speak typed words](#KeyboardSettingsSpeakTypedWords) when entering passwords. -##### Beep for skipped lines {#AdvancedSettingsBeepForSkippedLines} +##### Beep for skipped lines {#BeepForSkippedLines} This setting controls whether NVDA plays a short beep when too many new lines arrive before they can all be reported. The beep indicates that some lines were skipped, and becomes slightly longer as more lines are skipped. From 9b05799c84569dbff4cdcb1e56012783b9adb97b Mon Sep 17 00:00:00 2001 From: Bill Dengler Date: Tue, 11 Aug 2026 19:13:14 -0700 Subject: [PATCH 08/16] Review action --- source/gui/settingsDialogs.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/source/gui/settingsDialogs.py b/source/gui/settingsDialogs.py index 5a88d99d176..af40cd47243 100644 --- a/source/gui/settingsDialogs.py +++ b/source/gui/settingsDialogs.py @@ -4845,7 +4845,8 @@ def haveConfigDefaultsBeenRestored(self): == self.keyboardSupportInLegacyCheckBox.defaultValue and self.winConsoleSpeakPasswordsCheckBox.IsChecked() == self.winConsoleSpeakPasswordsCheckBox.defaultValue - and self.beepForSkippedLinesCheckBox.IsChecked() == self.beepForSkippedLinesCheckBox.defaultValue + and self.beepForSkippedLinesCheckBox.IsChecked() + == self.beepForSkippedLinesCheckBox.defaultValue and self.diffAlgoCombo.GetSelection() == self.diffAlgoCombo.defaultValue and self.wtStrategyCombo.isValueConfigSpecDefault() and self.cancelExpiredFocusSpeechCombo.GetSelection() From 03fd245f90f8be7276109b5222b7fff4e581dc77 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 12 Aug 2026 02:16:34 +0000 Subject: [PATCH 09/16] Auto-fix: apply prek fixes --- source/gui/settingsDialogs.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/source/gui/settingsDialogs.py b/source/gui/settingsDialogs.py index af40cd47243..5a88d99d176 100644 --- a/source/gui/settingsDialogs.py +++ b/source/gui/settingsDialogs.py @@ -4845,8 +4845,7 @@ def haveConfigDefaultsBeenRestored(self): == self.keyboardSupportInLegacyCheckBox.defaultValue and self.winConsoleSpeakPasswordsCheckBox.IsChecked() == self.winConsoleSpeakPasswordsCheckBox.defaultValue - and self.beepForSkippedLinesCheckBox.IsChecked() - == self.beepForSkippedLinesCheckBox.defaultValue + and self.beepForSkippedLinesCheckBox.IsChecked() == self.beepForSkippedLinesCheckBox.defaultValue and self.diffAlgoCombo.GetSelection() == self.diffAlgoCombo.defaultValue and self.wtStrategyCombo.isValueConfigSpecDefault() and self.cancelExpiredFocusSpeechCombo.GetSelection() From 9ab17dba81ac8cada720b44ef7d8a0dabec10127 Mon Sep 17 00:00:00 2001 From: Bill Dengler Date: Wed, 12 Aug 2026 17:42:20 -0700 Subject: [PATCH 10/16] Update what's new --- user_docs/en/changes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/user_docs/en/changes.md b/user_docs/en/changes.md index c2255e26013..5aa1fd107ab 100644 --- a/user_docs/en/changes.md +++ b/user_docs/en/changes.md @@ -53,6 +53,7 @@ * The actions button can now be used when selecting multiple add-ons in the Add-on Store to perform batch actions, instead of just via the context menu in the add-ons list. (#19971, @amirmahdifard) * When moving to an ARIA grid cell in focus mode in web browsers, NVDA no longer reports both the row and column headers even if only the row or only the column changed. (#17750, @jcsteh) * In live text regions, such as terminals, NVDA no longer freezes when substantial amounts of text are dumped to the screen. (#20177, #20649, @ethindp, @codeofdusk) + * By default, when lines are skipped in a large text flood, NVDA emits a beep proportional to the length of the skipped material. This can be disabled in the advanced settings panel. * In Windows Terminal, NVDA is less likely to report stale characters when moving the caret in delayed remote sessions such as SSH. (#19503, @sheldon-im) * When an application stops responding, NVDA no longer freezes or floods its log with errors; it stays responsive and drops UIA and MSAA events from the unresponsive application until it recovers. (#16749, @heath-toby) * Reduced lag on UI Automation text change events, improving the responsiveness of controls such as combo boxes and of File Explorer, by using the cached element class name instead of a live cross-process fetch. (#16749, @heath-toby) From 16a5e3f41b8bf6ffd0c4a5d5279e3e46efde35d0 Mon Sep 17 00:00:00 2001 From: Bill Dengler Date: Wed, 12 Aug 2026 17:44:55 -0700 Subject: [PATCH 11/16] Review action --- source/NVDAObjects/behaviors.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/source/NVDAObjects/behaviors.py b/source/NVDAObjects/behaviors.py index 239c770eb0f..dba68d00403 100755 --- a/source/NVDAObjects/behaviors.py +++ b/source/NVDAObjects/behaviors.py @@ -486,9 +486,7 @@ def _reportNewLines(self, lines: list[str]) -> None: if self._reportNewLinesGenID is not None: queueHandler.cancelGeneratorObject(self._reportNewLinesGenID) self._reportNewLinesGenID = None - self._reportNewLinesGenID = queueHandler.registerGeneratorObject( - self._reportNewLinesGenerator(lines), - ) + self._reportNewLinesGenID = queueHandler.registerGeneratorObject(self._reportNewLinesGenerator(lines)) def _getSkippedLinesBeepLength(self, droppedCount: int) -> int: SKIPPED_LINES_BEEP_MIN_DURATION_MS = 10 @@ -498,10 +496,7 @@ def _getSkippedLinesBeepLength(self, droppedCount: int) -> int: lengthRange = SKIPPED_LINES_BEEP_MAX_DURATION_MS - SKIPPED_LINES_BEEP_MIN_DURATION_MS return round(SKIPPED_LINES_BEEP_MIN_DURATION_MS + lengthRange * ratio) - def _reportNewLinesGenerator( - self, - lines: list[str], - ) -> Generator[None, None, None]: + def _reportNewLinesGenerator(self, lines: list[str]) -> Generator[None, None, None]: YIELD_EVERY = 5 # Sweet spot between yielding on every line and a batch try: for i, line in enumerate(lines, 1): From 7c68fdf4e23703e0e81c3c0892f73340b08c6718 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 13 Aug 2026 00:48:14 +0000 Subject: [PATCH 12/16] Auto-fix: apply prek fixes --- user_docs/en/changes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_docs/en/changes.md b/user_docs/en/changes.md index 5aa1fd107ab..41a66dd1549 100644 --- a/user_docs/en/changes.md +++ b/user_docs/en/changes.md @@ -53,7 +53,7 @@ * The actions button can now be used when selecting multiple add-ons in the Add-on Store to perform batch actions, instead of just via the context menu in the add-ons list. (#19971, @amirmahdifard) * When moving to an ARIA grid cell in focus mode in web browsers, NVDA no longer reports both the row and column headers even if only the row or only the column changed. (#17750, @jcsteh) * In live text regions, such as terminals, NVDA no longer freezes when substantial amounts of text are dumped to the screen. (#20177, #20649, @ethindp, @codeofdusk) - * By default, when lines are skipped in a large text flood, NVDA emits a beep proportional to the length of the skipped material. This can be disabled in the advanced settings panel. + default, when lines are skipped in a large text flood, NVDA emits a beep proportional to the length of the skipped material. This can be disabled in the advanced settings panel. * In Windows Terminal, NVDA is less likely to report stale characters when moving the caret in delayed remote sessions such as SSH. (#19503, @sheldon-im) * When an application stops responding, NVDA no longer freezes or floods its log with errors; it stays responsive and drops UIA and MSAA events from the unresponsive application until it recovers. (#16749, @heath-toby) * Reduced lag on UI Automation text change events, improving the responsiveness of controls such as combo boxes and of File Explorer, by using the cached element class name instead of a live cross-process fetch. (#16749, @heath-toby) From bf1802e48e49636d86b8dc1eadf3ae2bc5f7a161 Mon Sep 17 00:00:00 2001 From: Bill Dengler Date: Wed, 12 Aug 2026 19:06:41 -0700 Subject: [PATCH 13/16] Fix what's new --- user_docs/en/changes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_docs/en/changes.md b/user_docs/en/changes.md index 41a66dd1549..5aa1fd107ab 100644 --- a/user_docs/en/changes.md +++ b/user_docs/en/changes.md @@ -53,7 +53,7 @@ * The actions button can now be used when selecting multiple add-ons in the Add-on Store to perform batch actions, instead of just via the context menu in the add-ons list. (#19971, @amirmahdifard) * When moving to an ARIA grid cell in focus mode in web browsers, NVDA no longer reports both the row and column headers even if only the row or only the column changed. (#17750, @jcsteh) * In live text regions, such as terminals, NVDA no longer freezes when substantial amounts of text are dumped to the screen. (#20177, #20649, @ethindp, @codeofdusk) - default, when lines are skipped in a large text flood, NVDA emits a beep proportional to the length of the skipped material. This can be disabled in the advanced settings panel. + * By default, when lines are skipped in a large text flood, NVDA emits a beep proportional to the length of the skipped material. This can be disabled in the advanced settings panel. * In Windows Terminal, NVDA is less likely to report stale characters when moving the caret in delayed remote sessions such as SSH. (#19503, @sheldon-im) * When an application stops responding, NVDA no longer freezes or floods its log with errors; it stays responsive and drops UIA and MSAA events from the unresponsive application until it recovers. (#16749, @heath-toby) * Reduced lag on UI Automation text change events, improving the responsiveness of controls such as combo boxes and of File Explorer, by using the cached element class name instead of a live cross-process fetch. (#16749, @heath-toby) From 7d4ff12e45035ea309bd0568b22be6d91c502d0a Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 13 Aug 2026 02:09:35 +0000 Subject: [PATCH 14/16] Auto-fix: apply prek fixes --- user_docs/en/changes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_docs/en/changes.md b/user_docs/en/changes.md index 5aa1fd107ab..90b835a6fef 100644 --- a/user_docs/en/changes.md +++ b/user_docs/en/changes.md @@ -53,7 +53,7 @@ * The actions button can now be used when selecting multiple add-ons in the Add-on Store to perform batch actions, instead of just via the context menu in the add-ons list. (#19971, @amirmahdifard) * When moving to an ARIA grid cell in focus mode in web browsers, NVDA no longer reports both the row and column headers even if only the row or only the column changed. (#17750, @jcsteh) * In live text regions, such as terminals, NVDA no longer freezes when substantial amounts of text are dumped to the screen. (#20177, #20649, @ethindp, @codeofdusk) - * By default, when lines are skipped in a large text flood, NVDA emits a beep proportional to the length of the skipped material. This can be disabled in the advanced settings panel. +By default, when lines are skipped in a large text flood, NVDA emits a beep proportional to the length of the skipped material. This can be disabled in the advanced settings panel. * In Windows Terminal, NVDA is less likely to report stale characters when moving the caret in delayed remote sessions such as SSH. (#19503, @sheldon-im) * When an application stops responding, NVDA no longer freezes or floods its log with errors; it stays responsive and drops UIA and MSAA events from the unresponsive application until it recovers. (#16749, @heath-toby) * Reduced lag on UI Automation text change events, improving the responsiveness of controls such as combo boxes and of File Explorer, by using the cached element class name instead of a live cross-process fetch. (#16749, @heath-toby) From 8a5ff0872f30ce280b3dc9e68a3f5e044667dc95 Mon Sep 17 00:00:00 2001 From: Sean Budd Date: Thu, 13 Aug 2026 12:11:03 +1000 Subject: [PATCH 15/16] Apply suggestion from @seanbudd --- user_docs/en/changes.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/user_docs/en/changes.md b/user_docs/en/changes.md index 90b835a6fef..508658c6fa0 100644 --- a/user_docs/en/changes.md +++ b/user_docs/en/changes.md @@ -53,7 +53,8 @@ * The actions button can now be used when selecting multiple add-ons in the Add-on Store to perform batch actions, instead of just via the context menu in the add-ons list. (#19971, @amirmahdifard) * When moving to an ARIA grid cell in focus mode in web browsers, NVDA no longer reports both the row and column headers even if only the row or only the column changed. (#17750, @jcsteh) * In live text regions, such as terminals, NVDA no longer freezes when substantial amounts of text are dumped to the screen. (#20177, #20649, @ethindp, @codeofdusk) -By default, when lines are skipped in a large text flood, NVDA emits a beep proportional to the length of the skipped material. This can be disabled in the advanced settings panel. +By default, when lines are skipped in a large text flood, NVDA emits a beep proportional to the length of the skipped material. +This can be disabled in the advanced settings panel. * In Windows Terminal, NVDA is less likely to report stale characters when moving the caret in delayed remote sessions such as SSH. (#19503, @sheldon-im) * When an application stops responding, NVDA no longer freezes or floods its log with errors; it stays responsive and drops UIA and MSAA events from the unresponsive application until it recovers. (#16749, @heath-toby) * Reduced lag on UI Automation text change events, improving the responsiveness of controls such as combo boxes and of File Explorer, by using the cached element class name instead of a live cross-process fetch. (#16749, @heath-toby) From b2eacf2642f4f346ea268f7266db65d225ff8b2f Mon Sep 17 00:00:00 2001 From: Sean Budd Date: Thu, 13 Aug 2026 12:12:05 +1000 Subject: [PATCH 16/16] Apply suggestion from @seanbudd --- user_docs/en/changes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/user_docs/en/changes.md b/user_docs/en/changes.md index 508658c6fa0..b2b784fcfeb 100644 --- a/user_docs/en/changes.md +++ b/user_docs/en/changes.md @@ -54,7 +54,7 @@ * When moving to an ARIA grid cell in focus mode in web browsers, NVDA no longer reports both the row and column headers even if only the row or only the column changed. (#17750, @jcsteh) * In live text regions, such as terminals, NVDA no longer freezes when substantial amounts of text are dumped to the screen. (#20177, #20649, @ethindp, @codeofdusk) By default, when lines are skipped in a large text flood, NVDA emits a beep proportional to the length of the skipped material. -This can be disabled in the advanced settings panel. +This can be disabled in the Advanced settings panel. * In Windows Terminal, NVDA is less likely to report stale characters when moving the caret in delayed remote sessions such as SSH. (#19503, @sheldon-im) * When an application stops responding, NVDA no longer freezes or floods its log with errors; it stays responsive and drops UIA and MSAA events from the unresponsive application until it recovers. (#16749, @heath-toby) * Reduced lag on UI Automation text change events, improving the responsiveness of controls such as combo boxes and of File Explorer, by using the cached element class name instead of a live cross-process fetch. (#16749, @heath-toby)