Skip to content

Comments

2025.2 Final master to beta merge#18343

Merged
SaschaCowley merged 115 commits intobetafrom
finalMasterToBeta2025.2
Jun 26, 2025
Merged

2025.2 Final master to beta merge#18343
SaschaCowley merged 115 commits intobetafrom
finalMasterToBeta2025.2

Conversation

@SaschaCowley
Copy link
Member

Final merge for 2025.2 release, using commit 697a5708 from master.
Changes intended for 2025.2 must now set base/target to the beta branch

Merge not squash

seanbudd and others added 30 commits April 4, 2025 18:33
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.
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
…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.
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.
…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.
Co-authored-by: Jani Kinnunen <janikinnunen340@gmail.com>
Co-authored-by: Sascha Cowley <16543535+SaschaCowley@users.noreply.github.com>
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
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>
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
zstanecic and others added 19 commits June 24, 2025 10:54
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
Reverts PR

Reverts #17573, #16248
Issues fixed

n/a
Issues reopened

n/a
Reason for revert

#18271 is a more general implementation, fixed from the root #16246.
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
Copilot AI review requested due to automatic review settings June 26, 2025 05:41
@SaschaCowley SaschaCowley requested review from a team as code owners June 26, 2025 05:41
@SaschaCowley SaschaCowley merged commit ccd393d into beta Jun 26, 2025
19 of 21 checks passed
@SaschaCowley SaschaCowley deleted the finalMasterToBeta2025.2 branch June 26, 2025 05:43
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 languageHandler but the module does not import it. Please add import languageHandler at the top.
	def languageIsSupported(self, lang: str | None) -> bool:

source/speech/languageHandling.py:39

  • The function uses pgettext for translations but pgettext is 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 _displayStringLabels uses pgettext but the module doesn’t import it. Add from gettext import pgettext or the correct translation helper.
class ReportNotSupportedLanguage(DisplayStringStrEnum):

tests/unit/init.py:16

  • Removed the sys.path.insert that made the source directory importable; tests may fail to locate project modules. Consider restoring path setup or updating test imports.
import os

@github-actions github-actions bot added this to the 2025.3 milestone Jun 26, 2025
@seanbudd seanbudd modified the milestones: 2025.3, 2025.2 Aug 6, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.