2025.2 Final master to beta merge#18343
Merged
SaschaCowley merged 115 commits intobetafrom Jun 26, 2025
Merged
Conversation
Start the dev cycle for the 2025.2 release. This won't be a compatibility breaking release. Complete: - [x] New section in the change log. - [x] Update NVDA version in `master` - [x] Update [`nvdaAPIVersions.json` to include the next version](https://github.com/nvaccess/addon-datastore-transform) - Re-run the last "Transform NVDA addons to views" on [addon-datastore](https://github.com/nvaccess/addon-datastore/actions/workflows/transformDataToViews.yml) to regenerate projections (views) for the add-on datastore API. On merge: - [x] [Update auto milestone ID](https://github.com/nvaccess/nvda/settings/variables/actions)
Closes #17771 Partly closes #17407 Summary of the issue: Mouse and touch interaction does not work in WinUI 3 apps such as Microsoft Copilot and parts of Windows 11 File Explorer interface. Description of user facing changes Mouse and touch interaction can be used in WinUI 3 apps. Description of development approach Added Microsoft.UI.Content.DesktopChildSiteBridge to good UIA window class names. An alternative approach is done through Mouse Enhancement add-on where NVDA will confess that WinUI 3 app elements are good UIA windows when the mentioned top-level pane window class is present.
Fixes #12708 Supercedes #12701 Summary of the issue: There is a security risk if the screen curtain fails silently. The Magnification API used by Screen Curtain does not officially support WOW64 applications like NVDA. As this is a risk with untested Windows versions, an external check would be helpful to minimise silent failures of the screen curtain. Notwithstanding this, as this is a security feature, it is better to check that it is working as expected, and inform the user if it is not. Description of user facing changes None. Description of development approach Implemented a new function , isScreenFullyBlack, in NVDAHelper/local/screenCurtain.cpp. This method: Obtains a reference to the desktop window, which covers the entire virtual screen, and thus all monitors connected to the computer. USES GDI to capture the screen. USES GDIPlus to calculate a histogram of this screen capture. While this seems like overkill, it performs significantly better on my machine than individually checking that each pixel is black, likely due to optimisations and hardware accelleration in GDIPlus. Checks that, for each channel of the histogram, the value at 0 is the area of the screen. Call this function after applying the fullscreen colour effect and hiding the cursor in visionEnhancementProviders.screenCurtain.ScreenCurtainProvider.__init__. If the return is False, raise RuntimeError, which disables the screen curtain and informs the user that screen curtain failed to activate.
fixes #10516 Summary of the issue: Currently Appveyor is used to build and test NVDA. GitHub Actions may be preferred, since it's on GitHub and may be easier to use. Description of user facing changes None Description of development approach New GitHub Workflows: .github/workflows/testAndPublish.yml: CI / CD for NVDA - to replace AppVeyor .github/workflows/scan-release.yml: For scanning published releases with Virus Total Pre-commit Configuration: .pre-commit-config.yaml: Updated to consider changes to pyproject.toml when running license check files. Tests: tests/checkPot.py: Updated print statements to direct output to stderr for certain messages. tests/unit/test_checkPot/__init__.py: Adjusted the redirection of stdout and stderr for ordered output and modified assertions. Project Configuration: pyproject.toml: Removed several dependencies from the ignore_packages list (due to Apache compatibility now claimed) and adjusted the licenses section.
Merge beta to master
Fixup to #17728 Due to #17878 Summary of the issue: GitHub actions is now building NVDA, however we are not ready to release and deploy a signed copy of NVDA yet (see #17878). As such, we shouldn't build tagged releases with GitHub actions Description of user facing changes None Description of development approach Disable tagged releases from GitHub actions until #17878 is closed
Beta to master
Beta to master
Beta to master
Beta to master
…17918) Summary of the issue: First of all, I can't reliably reproduce this, but i have seen several cases lately where an exception was raised in playWaveFile, telling me that None object has no attribute feed. It happens to me around twice a day or so. ERROR - nvwave.play (10:43:12.334) - nvwave.playWaveFile(error.wav) (17056): Error playing wave file Traceback (most recent call last): File "nvwave.pyc", line 127, in play AttributeError: 'NoneType' object has no attribute 'idle' I think I can somewhat understand the issue. playWaveFile can play asynchronously. It has a local function play that sets the global fileWavePlayer to None when done. However when playing several sounds in a row, there can be a case where fileWavePlayer is set to None by one playback, then the next player tries to feed or idle to a None player. Description of user facing changes Hopefully, no longer rare errors. Description of development approach In the local function, copy the reference to the player in a local variable p and then use that variable to do feed and idle.
Beta to master
Fixes #17892 Summary of the issue: NVDA Does not read the controls in the Geekbench 6.4 ribbon when navigating and errors in the log. Description of user facing changes The menu can be navigated and interacted with normally. Description of development approach Geekbench uses something similar to the Microsoft Office ribbon. The code to check for older Office versions expected a normal productVersion for Office apps, however, Geekbench's productVersion is "6,4,0,0". This is the cause of the ValueError. I've fixed this by only checking the version if isOfficeApp is True first. Testing strategy: Tested that the Geekbench ribbon can be navigated and interacted with. Tested the Microsoft Office ribbon just in case.
Beta to master
…17938) Fixes #15828 Summary of the issue: When UIA is enabled in word and the cursor is halfway a table cell, NVDA will braille table end ath the cursor position. Description of user facing changes Table end will no longer be shown. Description of development approach In cases where this happens, it looks like there are at leass two findings. textRange.CompareEndpoints returns a huge number (always 6029412 in my case) It does so regardless where comparing start to start, end to end This also means that the number of the end to end comparison is positive, basically meaning that the end of the inner range is greater than the end of the outer range. This should be impossible anyway.
Beta to master
Beta to master
Co-authored-by: Jani Kinnunen <janikinnunen340@gmail.com> Co-authored-by: Sascha Cowley <16543535+SaschaCowley@users.noreply.github.com>
beta to master
closes #17935 Summary of the issue: We're currently handling the NVDA virtual environment with custom scripts. Furthermore, we use requirements.txt as our only locking mechanism. Description of user facing changes For developers, blazing fast venv generation and venv spinning up and down. Also much more ease when dependencies are updated or added. On github actions, build times are improved by around two minutes when there is a cache for uv.lock. improvement of add-on development workflow when uv is used there as well. When uv is adopted, I will propose an update for the add-on template. Description of development approach Installed uv Adapted pyproject.toml to contain everything from requirements.txt in several dependency groups removed venvutils as no longer needed. Just use uv run Adapted the several batch scripts to use uv run Adapted sconstruct and nvda.pyw to ensure that an uv managed venv is used and that it is the environment belonging to the project. Adapted the github workflow to use the uv setup action. Might want to pin this to a particular version created ensureunv.bat that is currently used inside scons.bat to provide a simple uv installation experience. It offers to install uv using winget (recommended IMO) and using the official install script. The latter stores uf in %userprofile%/.local/bin removed sourceEnv module as this workaround is no longer necessary now miscDeps is a workspace member
Merge beta to master
NV Access recently changed the endpoint URLs for various aspects of nvaccess.org. While redirects exist for now, we should move links over. --------- Co-authored-by: Sascha Cowley <16543535+SaschaCowley@users.noreply.github.com>
Merge beta to master
Part of #17878 Summary of the issue: Crowdin upload is missing from GitHub actions, which needs to be added to have full parity to AppVeyor Description of user facing changes None Description of development approach Copy logic from AppVeyor Testing strategy: Unfortunately we need to test this on production when we merge master to beta
Part of #17878 Summary of the issue: Symbols generation is missing from GitHub actions, which needs to be added to have full parity to AppVeyor Description of user facing changes None Description of development approach Copied logic from AppVeyor Testing strategy: - [x] Test symbol artifact is created - [ ] Test symbols are uploaded to mozilla with a try build Known issues with pull request: Symbols upload to mozilla is currently broken
Beta to master
Summary of the issue:
NVDA has many commands to open NVDA settings dialog in a specified category, e.g. Speech settings (NVDA+control+V) or Braille settings (unassigned). Some categories are missing and would be needed:
Vision settings: useful for visually impaired people, Especially since there is not (yet) scripts to change the individual parameters of this panel (except for screen curtain).
Windows OCR settings: opening the settings panel may be more useful than using the "Cycles through the available languages for Windows OCR" for people having many languages in the list
Add-on Store: useful for testers
Advanced: very useful for NVDA testers, e.g. change Word / Excel UIA settings, etc.
Description of user facing changes:
Commands have been added to open the following panels:
Vision
Windows OCR
Add-on STore
Advanced
These commands remain unassigned because they are not expected to be be used by so many people.
For now, no command has been added to open "Document Navigation" panel since it contains only one item. Thus it's more straight forward to assign a script to "Cycles through paragraph navigation styles" and use it. When this panel contains more than 1 item, such command can be added too.
… object review and read line. (#18271) Fixes #15159. Fixes #11285. Summary of the issue: In focus mode in web browsers, when a control specifies a label using aria-label or aria-labelledby, it is impossible to review or spell that label; e.g. using read current line or the review cursor. This is particularly annoying and detrimental to efficiency when using web apps such as Gmail and Slack, among others, where you have to switch to browse mode to work around this even though it might be more efficient to use focus mode for navigation. The same bug also applies in Google Chrome menus and dialogs where UIA is not used, such as in Chrome 137. Description of user facing changes: In focus mode in web browsers, it is now possible to review and spell the labels of controls when those labels are specifically provided for accessibility; e.g. via aria-label or aria-labelledby. Description of development approach: When in focus mode, for non-editable controls, both speech and braille report the name, description, value, etc. of the control; they don't use the TextInfo. However, previously, the review cursor and the read line command always used the TextInfo. Since IA2TextTextInfo is used for all objects supporting IAccessibleText, this meant that if the content wasn't a flat piece of text equal to the label, the review cursor and read line command would report something different, often nothing at all. To fix this, use NVDAObjectTextInfo instead of the object's TextInfo for object review and the read line command.
Summary of the issue:
Users may want to know the language of the text been read, and if the current synthesizer can switch to that language.
Description of user facing changes
In the speech settings panel, a checkbox can be used to determine if the language of the read text should be reported when language detection is enabled.
In the speech settings panel, a combo box is added to choose if NVDA should report if the language is supported by the current synthesizer. Available options are: off, beep or speech.
Added an unassigned command in the caret system category to know the language of the character positioned at the caret.
Description of development approach
In speech/__init__.py, a function is registered (and unregistered) with the filter_speechSequence extension point, to insert the language description (or language code if the description is not available), when a langChangeCommand is found in the sequence to be spoken. The language description won't be inserted if the language command is the last item of the speech sequence, or if lang is None, or if it's the last reported language, or if reportLanguage and reportNotSupportedLanguage options are False. A SpeechSequence member has been added to the SpeechState class to track the last reported language, as well as another function to check and report if the language is supported by the current synthesizer.
LangChangeCommand has methods to determine if the language should be processed by NVDA or the synthesizer.
A new languageHandling.py file has been added to speech to filter speech sequences, adding language descriptions or beep commands to report language as appropriate.
In globalCommands.py, a script has been added to report the language of the character at caret.
Summary of the issue: The installer and uninstaller use the default NSIS logos, which are bad for branding. Logos are a useful visual cue for identifying the right program in menus and searches. Description of user facing changes: NVDA `N` icon is used for installer and uninstaller. Description of developer facing changes: None Description of development approach: Added referents to icons in installer and uninstaller script Testing strategy: Performing `scons dist` and checking if the files were built with the right logos. Performing `scons launcher` and ensuring the installer has the right logo. Installed the launcher and ensured NVDA used the logo for the uninstaller. Known issues with pull request: None
… property set such as window visual state announcements from File Explorer/Windows shell (#18229) Closes #18220 Closes #17841 Summary of the issue: NVDA does not announce window visual states such as restore and snap when Windows+arrow keys are pressed. Description of user facing changes: NVDA will announce window visual states (for the foreground window) when Windows+arrow keys are pressed. Description of developer facing changes: Window state notifications are raised by a Windows shell (File Explorer) element without a native window handle. Therefore, allow notifications to be processed if the app module says yes, and if so, use foreground window handle as "window handle" for the element (because UIA NVDA objects require a window handle during construction even though all that will be done is process events). Description of development approach: In UIA handler/notification event handler: * If native window handle is not found (including traversing the UIA tree back to the root element), ask the app module for the process (where the element lives) if notification event should be processed. * If the app module says yes, set foreground window handle as "window handle" for the UIA element. Base app module: * Added a new method, "shouldProcessUIANotificationEventNoWindowHandle" to inform UIA handler if UIA notifications for elements without native window handle should be processed. * The new method will return False by default in line with previous behavior of dropping notification events for elements without window handle property set. File Explorer app module: * Say "yes" to "shouldProcessUIANotificationEventNoWindowHandle" call if window snap activity Id is being handled. * Added app module version of UIA notification event handler to announce window visual state/snap notification from everywhere. Testing strategy: Manual testing: from any app window (such as a web browser), press Windows+arrw keys to snap windows to part of the screen or press Windows+up arrow to maximize the foreground window. Prior to this PR: no window state announcement. After this PR: NVDA will announce window snap notification. Known issues with pull request: While the foreground window handle is an obvious choice (as the announcement pertains to window visual state changes), there might be a better way such as a custom UIA property. Ideally, window handle should be exposed by this shell element and hopefully Microsoft can resolve this. Note that File Explorer is not the only app with this issue - Windows 11 Voice Access exhibits the same problem (#16862).
… NotificationProcessing -> notificationProcessing (argument name consistency) (#18319) Quick follow-up to #18229 Summary of the issue: UIA notification argument names are inconsistent across UIA handler, app modules, and UIA NVDA objects. Description of user facing changes: None Description of developer facing changes: None, as the app module API was just merged. Description of development approach: Change the follwoing argument names in app module version of shouldProcessUIANotificationEvent: NotificationKind -> notificationKind NotificationProcessing -> notificationProcessing
Beta to master
Closes #17896 --------- Co-authored-by: Sean Budd <sean@nvaccess.org>
…dows 11 Version 22H2 and later) (#18322) Closes #16862 Closes #17384 Summary of the issue: NVDA does not support Windows 11 Voice Access features including text dictation announcement from everywhere. Description of user facing changes: Introduces support for Windows 11 Voice Access, including text dictation, microphone toggle announcement, and mouse and touch interaction. Requires NVDA to be installed. Description of developer facing changes: Added voiceaccess.py app module, based on #18220 work. Description of development approach: The new Voice Access app module includes: isGoodUIAWindow: says "yes" for "Voice Access" window class name (enables mouse and touch interaction) Should process UIA notification event says "yes" as Voice Access notification elements do not have native window handle UIA notification event will announce display string from everywhere.
Link to issue number: Closes #17725 Summary of the issue: NVDA speaks the combining circumflex character (U+0302) as "normalizes". While this is its Unicode name, it is unintuitive to users. Description of user facing changes: U+0302 is now pronounced as "hat" in English. Description of developer facing changes: None Description of development approach: Replaced "normalizes" with "hat" in source/locale/en/symbols.dic.
Part of #17878 Summary of the issue: GitHub actions CI/CD uses feature flags to disable parts of the build. exit 0 was not cancelling builds if features were disabled. Additionally, the reasoning for a "symbols" feature isn't clear. Other feature flags are for aspects of the build which integrate with NV Access owned APIs such as Crowdin, Code signing and uploading symbols. Building symbols has no negative side affects other than a slight time increase of the build. Disabling symbols with github actions should be as easy as an if statement in the job. When system tests are cancelled, the warning message is not correctly posted to the github step summary. Description of developer facing changes: When system tests are cancelled, the warning message is now correctly posted to the github step summary. the symbols feature was removed. feature_crowdinSync was fixed to check on each step rather than using exit 0
Part of #17878 Summary of the issue: Code signing is missing from GitHub actions, which needs to be added to have full parity to AppVeyor Description of user facing changes None Description of development approach Set in api signing token in GitHub secrets, create a signed build if appropriate Testing strategy: Ensure a try build based on this PR is signed: https://github.com/nvaccess/nvda/actions/runs/15868127863
Closes #15863 Copy of #18260 Summary of the issue: This is the NVDA driver for the NLS eReader Zoomax braille display. It supports both USB and Bluetooth automatic detection. Description of user facing changes: With this driver the user can use directly the NLS eReader Zoomax display without the need to manually install it as an addon. Description of developer facing changes: Description of development approach: The driver is similar with the existing braille display drivers for NVDA.
follow up #18035 Summary of the issue: The cache does not contain nvda.pot, additional steps are needed to download the file Description of user facing changes: Fix the above issue Description of developer facing changes: Fix the above issue Description of development approach: Add steps to download nvda.pot
Part of #17878 Summary of the issue: Forks of NVDA cannot customise parts of the CI/CD pipeline without committing to code. This allows forks to maintain a clean diff with nvaccess/nvda. With appveyor forks could set a custom appveyor.yml file to customise parts of the CI/CD pipeline such as: setting a publisher name enabling/configuring signing enabling/configuring crowdin sync enabling/configuring uploading symbols to mozilla The current GitHub actions design doesn't allow for a separate environment to override .github/workflows/testAndPublish.yml. Description of user facing changes: None Description of developer facing changes: Forks can now more easily maintain a custom build set up. Documentation has been added on how to do this. Forks should work clean out of the gate, with features disabled by default, for everything except tagged releases. We also have more clear documentation on how to set up the NVDA repository for builds Description of development approach: Config is moved out of source control into github variables. sensible defaults are provided for forks
Part of #17878 Summary of the issue: Crowdin synchronization is now ready to happen via GitHub actions. As such, we don't want AppVeyor conflicting with GitHub actions synchronizing. Description of user facing changes: none Description of developer facing changes: Disable AppVeyor crowdin sync. 2025.2 betas will sync with Crowdin via GitHub actions Description of development approach: comment out line Testing strategy: Test after we merge master to beta
Contributor
There was a problem hiding this comment.
Pull Request Overview
Merge the final 2025.2 master changes into the beta branch, bringing new features, version bumps, configuration updates, and test maintenance.
- Introduces comprehensive language reporting support (speech/beep/off), GUI settings, and scripting commands.
- Extends quick navigation keys for heading levels 1–9 and adds braille display and Zoomax support.
- Bumps version to 2025.2, updates build/version files, removes legacy venv scripts, and adjusts tests.
Reviewed Changes
Copilot reviewed 148 out of 156 changed files in this pull request and generated no comments.
Show a summary per file
| File | Description |
|---|---|
| source/synthDriverHandler.py | Adds languageIsSupported, but missing import for languageHandler. |
| source/speech/languageHandling.py | New module uses pgettext without importing it. |
| source/config/configFlags.py | Defines ReportNotSupportedLanguage using pgettext but no import. |
| tests/unit/init.py | Removed test sys.path insertion; may break imports from source. |
| user_docs/en/userGuide.md | References "Copilot+ PCs" inconsistent with elsewhere. |
| source/buildVersion.py | Version bump to 2025.2 (major/minor adjusted). |
Comments suppressed due to low confidence (6)
user_docs/en/userGuide.md:46
- [nitpick] The term "Copilot+ PCs" here is inconsistent with other documentation where "CoPilot PCs" is used. Please standardize the naming across docs.
* both AMD64 and ARM64 variants of Windows are supported, including Copilot+ PCs.
tests/manual/hardwareSupport.md:51
- [nitpick] Inconsistent capitalization/spelling of "CoPilot PCs" vs "Copilot+ PCs" in user guide. Please harmonize naming.
CoPilot PCs use a new form of architecture known as an NPU.
source/synthDriverHandler.py:323
- This method references
languageHandlerbut the module does not import it. Please addimport languageHandlerat the top.
def languageIsSupported(self, lang: str | None) -> bool:
source/speech/languageHandling.py:39
- The function uses
pgettextfor translations butpgettextis not imported. Please add the appropriate import (e.g.,from gettext import pgettext).
if shouldReportNotSupported() and not curSynth.languageIsSupported(getLangToReport(item.lang)):
source/config/configFlags.py:304
- This enum’s
_displayStringLabelsusespgettextbut the module doesn’t import it. Addfrom gettext import pgettextor the correct translation helper.
class ReportNotSupportedLanguage(DisplayStringStrEnum):
tests/unit/init.py:16
- Removed the
sys.path.insertthat made thesourcedirectory importable; tests may fail to locate project modules. Consider restoring path setup or updating test imports.
import os
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Final merge for 2025.2 release, using commit
697a5708from master.Changes intended for 2025.2 must now set base/target to the beta branch
Merge not squash