Skip to content

Update brlapi X64#39

Merged
seanbudd merged 6 commits intonvaccess:masterfrom
LeonarddeR:brlttyX64
Oct 3, 2025
Merged

Update brlapi X64#39
seanbudd merged 6 commits intonvaccess:masterfrom
LeonarddeR:brlttyX64

Conversation

@LeonarddeR
Copy link
Copy Markdown
Collaborator

Should fix nvaccess/nvda#18657 when part of NVDA X64 builds.

Updated to a brlapi build produced on Github Actions in my own fork. See also brltty/brltty#490

Tested successfully:

  1. Install Windows Narrator braille support
  2. Manually enable the brlapi service
  3. Connectd braille display,: APH Mantis
  4. Ensure braille output and key presses work

@seanbudd
Copy link
Copy Markdown
Member

Do you think this will get merged? Or will we have to maintain a fork?

@LeonarddeR
Copy link
Copy Markdown
Collaborator Author

I'm not sure. Probably depends on what @DaveMielke says about brltty/brltty#490

@seanbudd
Copy link
Copy Markdown
Member

Given Dave is unresponsive, could you open a PR to https://github.com/nvaccess/brltty?

@seanbudd seanbudd self-requested a review September 23, 2025 03:24
@LeonarddeR
Copy link
Copy Markdown
Collaborator Author

See nvaccess/brltty#1

@LeonarddeR
Copy link
Copy Markdown
Collaborator Author

Note, since NV Access now produces these binaries, may be it should be considered to sign them?

@seanbudd
Copy link
Copy Markdown
Member

@LeonarddeR - are there any potential benefits to signing them? I think we may want to do some level of auditing of this code before signing

@LeonarddeR
Copy link
Copy Markdown
Collaborator Author

I'm not sure whether it's really worth it, but liblouis is also signed. That said, espeak.dll is not, so there is a bit of inconsistency here.

Copy link
Copy Markdown
Member

@seanbudd seanbudd left a comment

Choose a reason for hiding this comment

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

Thanks @LeonarddeR

@seanbudd seanbudd merged commit dabd1fc into nvaccess:master Oct 3, 2025
SaschaCowley pushed a commit to nvaccess/nvda that referenced this pull request Oct 3, 2025
Closes #18657
Merges changes from nvaccess/brltty#1 and
nvaccess/nvda-misc-deps#39

### Summary of the issue:
BRLTTY needs to be updated for 64bit and python 3.13.
Since updating python it has been broken on alphas.

### Description of user facing changes:
BRLTTY restored usage restored

### Description of developer facing changes:
None

### Description of development approach:
Update commit from miscDeps built from
https://github.com/nvaccess/brltty/pull/

### Testing strategy:
Unit tests re-enabled

### Known issues with pull request:
None
nishimotz added a commit to nvdajp/nvdajp that referenced this pull request Nov 21, 2025
* Use ARm64EC libraries for X64 support on ARM64 systems (#18570)

Closes #18445
Summary of the issue:

On ARM64 systems. an emulation layer is used to support X64 software. However, Microsoft developed ARm64EC, an X64 compatible ABi that is X64 compatible while delivering almost native ARM64 performance.
Description of user facing changes:

Probably slightly better performance as soon as we're on X64 builds.
Description of developer facing changes:

None
Description of development approach:

    Build relevant libraries as ARM64EC. Use the ARM64EC path on ARM64 systems to load X64 dlls from.
    Install JAVA access bridge in source dir for the NVDA core arch. There's no need in bundling an x86 bridge with an x64 NVDA and vise versa, as it will never be used.

* NVDAObjects.IAccessible.sysListView32: ctypes.c_void_p -> ctypes.c_ulong for 32-bit LVItem and LVColumn structures (#18839)

Closes #18706
Summary of the issue:

64-bit NVDA cannot obtain column content for 32-bit SysListView32 controls when (re)started while focused on them.
Description of user facing changes:

64-bit NVDA will announce 32-bit SysListView32 column content when (re)started. A good exmaple is StationPlaylist Studio interface (32-bit app).
Description of developer facing changes:

In 32-bit LVItem and LVColumn structures, changed "pSZText" field from ctypes.c_void_p to ctypes.c_ulong.
Description of development approach:

Compared 32-bit and 64-bit LVItem and LVColumn structures to make sure the correct C type was chosen.

* Fix errors sorting add-ons (#18847)

Fixes #18838
Summary of the issue:

When an add-on is installed for the first time, it's shown in the updatable add-ons, where installation can be cancelled. If we try to sort add-ons by current installed version, errors are writen to the log.
Also, in alpha versions, if we sort add-ons by dates, after closing the store dialog, it cannot be opened again.
Description of user facing changes:

Add-ons can be sorted from the updatable add-ons tab without errors, even if an add-on is not fully installed. Also, a regression is fixed where trying to sort add-ons by dates, the store dialog cannot be reopened after trying to close it.
Description of developer facing changes:

None.
Description of development approach:

See the NVDA log and address cases where _addonModel attribute is None. Also, for publication and install date fields, don't cast them, since this causes a regresssion when trying to sort add-ons by dates.

* And more winBindings (#18860)

Summary of the issue:
Raw ctypes calls may not be 64 bit compatible. They should be replaced.

Description of user facing changes:
None.

Description of development approach:
Replaced more raw ctyps calls with winBindings definitions.
With this PR and previous PRs, 146 functions have now been replaced,
with 118 to go.

Testing strategy:
General smoke testing.

* Report spelling errors with a sound while reading (#17997)

Closes #4233
Supersedes #10474

Summary of the issue:
Users want to have spelling errors reported by a sound rather than by a
spoken phrase while reading.

Description of user facing changes
In Document formatting settings, reporting of spelling errors is now
controlled with a 3-choice combo box:
* off: not reported at all
* Speech: reported as before with spokenn text
* Sound: reported with a sound, the same buzzer sound already used to
report spelling errors when typing

The default is still to report spelling errors by speech.

As previously, spelling errors are not reported when navigating by cell
(in tables), or by paragraph.

"out of spelling error" is still reported as a spoken message in any
case since defining a sound for this specific message would not be worth
it; this message is only reported during the navigation by character or
word.

Context:
#4233 is open for more than 10 years. a solution is asked from time to
time and having it fixed would really be useful.

PR #10474 was opened more than 5 years ago as a solution for this issue;
thanks @jcsteh for this first work. Unfortunately it has been closed as
abandoned.

This PR is an attempt to provide a minimal fix for #4233 so that the
feature is not delayed 5 more years.

Description of development approach
* Converted binary flag to bitwise in settings dialog (check list box),
config, etc. similarly to what is done for NVDA key selection.
* Implemented config upgrade to convert boolean setting to integer
* When getting text info from documents, take advantage that
`ReportSpellingErrors.OFF` value is 0 and thus evaluate as a `False`
boolean, so that spelling errors are retrieved in text info only for
speech or sound.

Testing strategy:
* Manual test of navigation by character, word, line paragraph, table
cell, say all
* Tested with eSpeak, IBMTTS, OneCore.
* Automated tests should still pass

Known issues with pull request:
1. For simplicity, grammar error reporting is not handled in this PR.
This point can be discussed/changed in a subsequent issue or PR if
needed. Replacing grammar errors reporting by a sound would require to
have a different sound, that can be distinguished from spelling error
sound, but that would record it, e.g. a different buzzer sound. The
problem is that grammar errors are rarely reported in NVDA: they are
frequent in Word but NVDA does not report them and they are reported on
the web but are rarely present there. Using a sound for a rare event is
problematic because becomes difficult for people to learn for what the
sound is used.

2. This PR is a minimalist and pragmatic solution for #4233. An
alternative could be a more general architecture allowing to replace by
sounds more formatting or structural indications while reading text. My
position is to merge this small PR to address the spelling error concern
quite quickly and allow to develop a more ambitious and general
framework in the future if/when needed.

* Update liblouis to 3.35.0 (#18848)

Summary of the issue:

A new version of liblouis has been released.
Description of user facing changes:

Table updates, see liblouis changelog.

* Free display on secure desktop switch (#18810)

Fixes #2315

Summary of the issue:
Currently, braille doesn't work properly on secure screens because the
braille display is held by the logged in copy.

Description of user facing changes:
When NVDA is installed, it disconnects braille when entering secure
desktop and reconnects when exiting it.

Description of developer facing changes:
None

Description of development approach:
1. Added a secure desktop switch extension point to the braille handler.
2. Set a private class property on the braille display driver to ensure
the display isn't cleared, in order to make it clear that the `secure
desktop` was entered. This is communicated with an `ui.message` in
IAccessibleHandler.
3. When leaving secure desktop and auto detect was enabled, try to
reconnect to the last detected display before doing a full scan.

Testing strategy:
- [X] Tested via USB with a APH Mantis Q40
- [x] Tested via Bluetooth with a APH Mantis Q40 as the only Bluetooth
device available
- [x] Tested both automatic detect and manual display selection cases

Known issues with pull request:
1. After exiting the secure desktop, it takes some time before the
display is back in action. I must say though that with Bluetooth this
isn't considerably slower
2. When using a custom braille display driver bundled in an add-on, the
add-on needs to be available on the system copy of NVDA. This has always
been the case though, but is fixable with the approach in #18789.
3. When using manual braille display selection, reconnecting to the
display after closing the secure desktop happens on the main thread.
This can lead to a temporary freeze of NVDA, depending on how long it
takes for the driver to connect. Note however that the same freeze would
occur when starting NVDA.

* Crash dumps are no longer empty on 64 bit (#18868)

### Summary of the issue:

On 64 bit, if NVDA crashed, a 0 byte nvda_crash.dmp would be created
with no actual crash dump information, as MiniDumpWriteDump fails.

### Description of user facing changes:

A valid crash dump is now produced if NVDA crashes.

### Description of developer facing changes:

None

### Description of development approach:

Move creation of nvda_crash.dmp and filling it in with MiniDumpWriteDump
into its own c++ utility function in nvdahelper.localLib, and call this
from the UnhandledExceptionFilter in watchdog.py.

### Testing strategy:

Crashed NVDA by running the following in the Python console:

```
import ctypes
ctypes.windll.kernel32.DebugBreak()
```

Verified that an nvda_crash.dmp was created and that it could be opened
in winDBG and exception information was viewable.
Also confirmed that nvda.log still contained the listing of all Python
stacks.

### Known issues with pull request:

Although we already added what seemed to be correct definitions for
MiniDumpWriteDump and related structures to winBindings.dbghelp,
MiniDumpWriteDump still failed on 64 bit from Python with a memory
access error.

Moving this code to c++ solves the issue, but It is not quite understood
exactly why.
Perhaps the native handle for the file from msvcrt.get_osfhandle is not
correctly 64 bit?

* Fix UWP OCR on 64 bit NVDA (#18858)

### Summary of the issue:

Windows OCR doesn't work on 64 bit builds of NVDA.

### Description of user facing changes:

Windows OCR works on 64-bit builds of NVDA.

### Description of developer facing changes:

Deprecations

### Description of development approach:

* Fix up ctypes definitions for functions exported by
`nvdaHelperLocalWin10.dll` that were causing problems
* Move said ctypes definitions to a new `NVDAHelper.localWin10` module

### Testing strategy:

Recognise text (NVDA welcome dialog) on:

* [x] 64-bit source copy
* [x] 32-bit source copy
* [x] 64-bit portable copy
* [x] 32-bit portable copy

### Known issues with pull request:

I have not moved all ctypes definitions for functions exported by
`nvdaHelperLocalWin10.dll` to `NVDAHelper.localWin10`. I believe this is
best done in a separate PR, to allow this bugfix to be merged sooner
than later.

* Move user32 ctypes bindings to winBindings (#18883)

### Summary of the issue:

As part of NVDA's 64-bit migration, we are consolidating all ctypes
bindings for the Windows API in a central location. Functions exported
by `user32.dll` have largely not yet been migrated.

### Description of user facing changes:

None.

### Description of developer facing changes:

Several deprecations and API removals.

As some ctypes bindings or struct definitions have been changed,
existing code that calls these functions or uses these structs may fail
at runtime.

### Description of development approach:

Used grep to search for `windll.user32` in `source/`. For all functions
called via `windll.user32`, created or moved the ctypes definition to
`winBindings.user32`.

As part of this, moved definitions that were needed along with the
functions by which they were needed.

### Testing strategy:

System and unit tests.

Smoke tested by running NVDA from source (x86 and x86_64) while
performing other work.

### Known issues with pull request:

Some constants are still scattered.

### Code Review Checklist:

- [x] Documentation:
  - Change log entry
  - User Documentation
  - Developer / Technical Documentation
  - Context sensitive help for GUI changes
- [x] Testing:
  - Unit tests
  - System (end to end) tests
  - Manual testing
- [x] UX of all users considered:
  - Speech
  - Braille
  - Low Vision
  - Different web browsers
  - Localization in other languages / culture than English
- [ ] API is compatible with existing add-ons.
- [x] Security precautions taken.

* Add support for IE and Edge wxWebView controls #18877


Fixes #17273
Summary of the issue:

NVDA has focus issues in WX Web View controls.
Description of user facing changes:

WX Web View controls in applications will no enter browse mode correctly.
Description of developer facing changes:

None
Description of development approach:

There are actually two approaches, one for every known supported backend on Windows:

    For IE, find the inner Internet Explorer server window and focus it. It will never get focus automatically, so this is the fix with the greatest positive impact.
    For Edge WebView2, wait for the Chrome_RenderWidgetHostHWND window to be created, and refocus the webview after creation. Refocussing the webview again will properly propagate focus to the Edge Web view, at least on recent wx.

* Config: remove start at/after logon checks that became obsolete (#18855)

Link to issue number:

None
Summary of the issue:

There were checks in code for start at/after logon screen that have since long become obsolete because they were never used on Windows 10.
Description of user facing changes:

None
Description of developer facing changes:

None
Description of development approach:

Code cleanup

* Limit SAPI4 Vol tag value to 0~65535 (#18887)

Link to issue number:

Fixes #18866.
Summary of the issue:

IBM ViaVoice SAPI4 version is unable to process volume levels greater than 65535 in Vol tags. As a result, when speaking capital letters with prosody changes, the voice may fail to follow the current volume setting and output at its default (maximum) volume.
Description of user facing changes:

The above issue should be fixed.
Description of developer facing changes:

None.
Description of development approach:

Instead of specifying two words for volume, where the low word is for the left channel and the high word is for the right channel, specify only 0~65535 in the low word. According to the SAPI4 docs, specifying 65535 should be "the maximum monaural volume"

* Fix multi select reporting in braille (#18875)

Fixes #18873
Summary of the issue:

In braille, for multi select lists, multi select is reported even when reporting of multi select is disabled.
Description of user facing changes:

No longer report multi select lists in Braille when said option is off.

* Fix some mouse gestures (#18906)

Follow-up to #18883
Fixes #18913 

### Summary of the issue:

Some gestures that control the mouse are broken. These include
left/right mouse button lock/unlock, and navigator object default
action.

### Description of user facing changes:

They work again.

### Description of developer facing changes:

None.

### Description of development approach:

Updated `mouseHandler.executeMouseEvent` to send `0` instead of `None`
as the value of `dwExtraInfo`. This is necessary as `dwExtraInfo` is
correctly declared as `ULONG_PTR` since #18883, so ctypes will not
accept `None`.

### Testing strategy:

Ran from source and tested clicking and locking/unlocking the left and
right mouse buttons, as well as activating the navigator object.

### Known issues with pull request:

None

* Fix PR status checks (#18895)

Fixes #18869

### Summary of the issue:

Status checks are not properly enforced, meaning PRs with failing checks
are allowed to be merged.

### Description of user facing changes:

None

### Description of developer facing changes:

CI checks must pass

### Description of development approach:

Use [alls-green](https://github.com/marketplace/actions/alls-green).

### Testing strategy:

Create test failures and ensure they disable merging.

* Intentionally introduced a unit test failure in [commit
`aaa4146d`](https://github.com/nvaccess/nvda/pull/18895/commits/aaa4146d0971cd639d731635a2135821a6ce969c)
([CI run](https://github.com/nvaccess/nvda/actions/runs/17628492155))
* Intentionally introduced a system test failure in [commit
`6cb4d8ad`](https://github.com/nvaccess/nvda/pull/18895/commits/6cb4d8adc6eb72bc285e00fba9248b5a6809f716)
([CI run](https://github.com/nvaccess/nvda/actions/runs/17629261960))

I did not check po, pot, lint, types etc, however I believe that the
above tests are sufficient to prove that this approach works.

### Known issues with pull request:

None

* Only build 64bit

* build PRs against try branches

* winUser.WinTimer: ensure timerFunc is correctly wrapped as a TIMERPROC even when None. (#18925)

<!-- Please read and fill in the following template, for an explanation
of the sections see:

https://github.com/nvaccess/nvda/blob/master/projectDocs/dev/githubPullRequestTemplateExplanationAndExamples.md
Please also note that the NVDA project has a Citizen and Contributor
Code of Conduct which can be found at
https://github.com/nvaccess/nvda/blob/master/CODE_OF_CONDUCT.md. NV
Access expects that all contributors and other community members read
and abide by the rules set out in this document while participating or
contributing to this project. This includes creating or commenting on
issues and pull requests.

Please initially open PRs as a draft.
When you would like a review, mark the PR as "ready for review".
See
https://github.com/nvaccess/nvda/blob/master/.github/CONTRIBUTING.md.
-->

### Link to issue number:
<!-- Use Closes/Fixes/Resolves #xxx to link this PR to the issue it is
responding to. -->
Fixes #18914

### Summary of the issue:
Tightening up ctypes definitions for 64 bit means that ctypes may be
more picky with what can be passed as an argument. In particular passing
None to an argument that should be a callback now will fail.
The correct way is now to pass Functype(0) where Functype is the
callback's ctypes definition.
So far just one call has been identified in #18914: SetTimer takes a
TIMERPROC.

### Description of user facing changes:
None.

### Description of developer facing changes:

### Description of development approach:
`winUser.WinTimer` now ensures that `timerFunc` is already, or is
converted to, a `TIMERPROC`. Specifically ensuring `None` is converted
to `TIMERPROC(0)`.

### Testing strategy:
* [ ] The author of #18914 should confirm this fix.

### Known issues with pull request:
None known.

### Code Review Checklist:

<!--
This checklist is a reminder of things commonly forgotten in a new PR.
Authors, please do a self-review of this pull-request.
Check items to confirm you have thought about the relevance of the item.
Where items are missing (eg unit / system tests), please explain in the
PR.
To check an item `- [ ]` becomes `- [x]`, note spacing.
You can also check the checkboxes after the PR is created.
A detailed explanation of this checklist is available here:

https://github.com/nvaccess/nvda/blob/master/projectDocs/dev/githubPullRequestTemplateExplanationAndExamples.md#code-review-checklist
-->

- [x] Documentation:
  - Change log entry
  - User Documentation
  - Developer / Technical Documentation
  - Context sensitive help for GUI changes
- [x] Testing:
  - Unit tests
  - System (end to end) tests
  - Manual testing
- [x] UX of all users considered:
  - Speech
  - Braille
  - Low Vision
  - Different web browsers
  - Localization in other languages / culture than English
- [x] API is compatible with existing add-ons.
- [x] Security precautions taken.

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Support image descriptions using local AI model (#18475)

Resolves #16281
Summary of the issue:

NVDA currently lacks a built‑in, offline image captioning feature. Existing solutions require a reliable internet connection—raising privacy concerns, potential costs, and latency—and many NVDA users (especially in developing regions or on older hardware) have limited connectivity or constrained resources. There is no robust, integrated offline alternative.
Description of user facing changes:

    Introduces device‑side image description directly within NVDA, requiring no cloud service.

    Adds three global commands (with default shortcuts):
        --NVDA+Windows+,--: Generate a caption for the current image under focus.
        --NVDA+Windows+Shift+,--: Release the loaded model and free memory.
        --NVDA+Windows+Ctrl+,--: Open the Model Manager GUI to download or manage models.

    Extends NVDA’s settings panel to enable/disable offline captioning and configure model paths.

Description of developer facing changes:

    New _localCaptioner module containing:
        captioner.py: Core inference engine exposing generate_caption(image) for producing text descriptions.
        panel.py: NVDA settings integration (lazy or on‑startup model loading, custom path).
        modelDownloader.py: CLI tool to download ONNX models.
        modelManager.py: GUI for selecting download paths and managing available models.

    Uses the Hugging Face Xenova/vit-gpt2-image-captioning model in ONNX format (via onnxruntime) to balance accuracy, speed, and low resource usage.

    Modular design allows for future extension to additional models or formats.

Description of development approach:

    --Modular integration--: Keeps _localCaptioner self‑contained and compatible with NVDA’s plugin architecture.
    --Lightweight inference--: Leverages ONNXRuntime for fast, local inference without heavy PyTorch or TensorFlow dependencies.
    --Lazy loading--: Model is only loaded when first invoked (or at startup, if configured), minimizing initial memory footprint.
    --Dual interfaces--: Provides both CLI scripts (captioner.py, modelDownloader.py) for quick tests and a GUI (modelManager.py) for end‑users.
    --Extensible architecture--: Configuration files (e.g., config.json) conform to Hugging Face format for easy swapping of models.

* Replace remaining raw ctypes calls to hid.dll with winBindings.hid definitions. (#18902)

### Summary of the issue:

A pa part of moving to 64 bit, all raw ctypes calls must have explicit
definitions. Remaining calls to functions in hid.dll must be moved to
winBindings.
 
### Description of user facing changes:

None.

### Description of developer facing changes:

Symbols have moved and ctypes definitions are now correct.

### Description of development approach:

* Add winBindings definitions for all remaining required calls to
hid.dll.
* Replace all raw ctypes calls with these definitions.
* Add a HIDP_BUTTON_CAPS structure and use this with GetButtonCaps etc,
rather than HIDP_VALUE_CAPS which is incorrect.

### Testing strategy:

General smoke testing with a standard HID braille display. auto
detection, moving by line, routing etc.

### Known issues with pull request:

None known.

* Move all remaining kernel32 ctypes calls to winBindings (#18896)

<!-- Please read and fill in the following template, for an explanation
of the sections see:

https://github.com/nvaccess/nvda/blob/master/projectDocs/dev/githubPullRequestTemplateExplanationAndExamples.md
Please also note that the NVDA project has a Citizen and Contributor
Code of Conduct which can be found at
https://github.com/nvaccess/nvda/blob/master/CODE_OF_CONDUCT.md. NV
Access expects that all contributors and other community members read
and abide by the rules set out in this document while participating or
contributing to this project. This includes creating or commenting on
issues and pull requests.

Please initially open PRs as a draft.
When you would like a review, mark the PR as "ready for review".
See
https://github.com/nvaccess/nvda/blob/master/.github/CONTRIBUTING.md.
-->

### Link to issue number:
<!-- Use Closes/Fixes/Resolves #xxx to link this PR to the issue it is
responding to. -->
None.

### Summary of the issue:
There are still many raw ctypes calls to kernel32 functions in the code
base. These must be moved to winBindings, with correct definitions per
Microsoft documentation to ensure accurate execution on 64 bit.

### Description of user facing changes:
None.

### Description of developer facing changes:
 
### Description of development approach:
Add all required kernel32 definitions to winBindings, verifying each
against Microsoft Documentation.
Replace the raw ctypes calls through out the code base with the
winBindings definitions.
Any ctypes structures required by these definitions have also been moved
to winBindings, and appropriate deprecation code added.

### Testing strategy:
General smoke testing of an installed binary copy.

### Known issues with pull request:
None known.

### Code Review Checklist:

<!--
This checklist is a reminder of things commonly forgotten in a new PR.
Authors, please do a self-review of this pull-request.
Check items to confirm you have thought about the relevance of the item.
Where items are missing (eg unit / system tests), please explain in the
PR.
To check an item `- [ ]` becomes `- [x]`, note spacing.
You can also check the checkboxes after the PR is created.
A detailed explanation of this checklist is available here:

https://github.com/nvaccess/nvda/blob/master/projectDocs/dev/githubPullRequestTemplateExplanationAndExamples.md#code-review-checklist
-->

- [x] Documentation:
  - Change log entry
  - User Documentation
  - Developer / Technical Documentation
  - Context sensitive help for GUI changes
- [x] Testing:
  - Unit tests
  - System (end to end) tests
  - Manual testing
- [x] UX of all users considered:
  - Speech
  - Braille
  - Low Vision
  - Different web browsers
  - Localization in other languages / culture than English
- [x] API is compatible with existing add-ons.
- [x] Security precautions taken.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sascha Cowley <16543535+SaschaCowley@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Shorten indentation beeps (#18898)

### Summary of the issue:
NVDA can be configured to report line/paragraph indentation with beeps.
However, the beeps are distractingly long, especialy at high speech
rates.

### Description of user facing changes:
The duration of line indentation beeps has been reduced. They are now
the same length as progress bar beeps.

### Description of developer facing changes:
The `IDT_TONE_DURATION` constant has been removed.

### Description of development approach:
Moved line indentation beep duration to config, so this customisation
may be surfaced if desired in future. Replaced the constant with a
getter method.

### Testing strategy:
Navigated code with line indentation set to beeps.

### Known issues with pull request:
None

* Moving mouse with audio coordinates no longer throws an error (#18931)

Fixes #18929

### Summary of the issue:

when moving the mouse with play audio coordinates with brightness
enabled, NVDA fails to read what is under the mouse, fails to play the
audio beeps, and logs an error:
 
This is due to the fact that screenBitmap.captureImage was recently
changed to return a 1d array of RGBQUAD values, rather than a 2d array.
The change was to fix an incompatibility with argument types of
uwpOCR_recognize.
However, mouseHandler.playAudioCoordinates still expects a 2d array.

### Description of user facing changes:

Mouse movement with play audio coordinates and brightness works and does
not throw an error.

### Description of developer facing changes:

None

### Description of development approach:

screenBitmap.captureImage again returns a 2d array, keeping it backward
compatible and fixes the mouse movement bug.

uwpOCR recognize: the pixels array provided from
screenBitmap.captureImage is a 2d array. However uwpOCR_recognise
expects pixels to be a 1d array. these are exactly the same memory
layout, so we now just cast to a POINTER(RGBQUAD).

### Testing strategy:

* Turned on play audio coordinates with mouse moves. Turned on detect
brightness. Moved the mouse around the screen, ensuring audio
coordinates beeps played and there were no errors in the log.
Did an OCR recogise of the screen with NvDA+r, and ensured that the
results were readable and no error was logged.

### Known issues with pull request:

None known.

* systemUtils.ExecAndPump: the thread handle passed to msgWaitForMultipleObjects should be a proper HANDLE not c_int. This stops the ctypes argument error, and more importantly ensures  the full thread handle is represented on 64 bit. (#18927)

<!-- Please read and fill in the following template, for an explanation
of the sections see:

https://github.com/nvaccess/nvda/blob/master/projectDocs/dev/githubPullRequestTemplateExplanationAndExamples.md
Please also note that the NVDA project has a Citizen and Contributor
Code of Conduct which can be found at
https://github.com/nvaccess/nvda/blob/master/CODE_OF_CONDUCT.md. NV
Access expects that all contributors and other community members read
and abide by the rules set out in this document while participating or
contributing to this project. This includes creating or commenting on
issues and pull requests.

Please initially open PRs as a draft.
When you would like a review, mark the PR as "ready for review".
See
https://github.com/nvaccess/nvda/blob/master/.github/CONTRIBUTING.md.
-->

### Link to issue number:
<!-- Use Closes/Fixes/Resolves #xxx to link this PR to the issue it is
responding to. -->
Mentioned in #18914
Fixes #18911 


### Summary of the issue:
Creating a portable copy fails with the error 
```
ctypes.ArgumentError: argument 2: TypeError: expected LP_c_void_p instance instead of pointer to c_long
```

In systemUtils.ExecAndPump: the thread is opened and the handle is
stored in a c_int, but MsgWaitForMultipleObjects expects it to be
aHANDLE (pointer).

### Description of user facing changes:
None.

### Description of developer facing changes:

### Description of development approach:
threadHandle is now a HANDLE, not c_int.

### Testing strategy:
* Ran the launcher and successfully created a portable copy, with no
error.

### Known issues with pull request:
None known.

### Code Review Checklist:

<!--
This checklist is a reminder of things commonly forgotten in a new PR.
Authors, please do a self-review of this pull-request.
Check items to confirm you have thought about the relevance of the item.
Where items are missing (eg unit / system tests), please explain in the
PR.
To check an item `- [ ]` becomes `- [x]`, note spacing.
You can also check the checkboxes after the PR is created.
A detailed explanation of this checklist is available here:

https://github.com/nvaccess/nvda/blob/master/projectDocs/dev/githubPullRequestTemplateExplanationAndExamples.md#code-review-checklist
-->

- [x] Documentation:
  - Change log entry
  - User Documentation
  - Developer / Technical Documentation
  - Context sensitive help for GUI changes
- [x] Testing:
  - Unit tests
  - System (end to end) tests
  - Manual testing
- [x] UX of all users considered:
  - Speech
  - Braille
  - Low Vision
  - Different web browsers
  - Localization in other languages / culture than English
- [x] API is compatible with existing add-ons.
- [x] Security precautions taken.

* Replace some internal deprecated usage with correct symbols (#18930)

<!-- Please read and fill in the following template, for an explanation
of the sections see:

https://github.com/nvaccess/nvda/blob/master/projectDocs/dev/githubPullRequestTemplateExplanationAndExamples.md
Please also note that the NVDA project has a Citizen and Contributor
Code of Conduct which can be found at
https://github.com/nvaccess/nvda/blob/master/CODE_OF_CONDUCT.md. NV
Access expects that all contributors and other community members read
and abide by the rules set out in this document while participating or
contributing to this project. This includes creating or commenting on
issues and pull requests.

Please initially open PRs as a draft.
When you would like a review, mark the PR as "ready for review".
See
https://github.com/nvaccess/nvda/blob/master/.github/CONTRIBUTING.md.
-->

### Link to issue number:
<!-- Use Closes/Fixes/Resolves #xxx to link this PR to the issue it is
responding to. -->
None.

### Summary of the issue:
NvDA internally still uses some deprecated/moved symbols. They should be
called from their correct locations.
 
### Description of user facing changes:
None.

### Description of developer facing changes:

### Description of development approach:
* access symbols directly from winBindings.gdi32 and winBindings.user32
* winBindings.bthProps: import SYSTEMTIME from winBindings.kernel32
* touchHandler:  Use symbols from user32 not winUser. Fix imports.
* systemUtils: SHELLEXECUTEINFO moved from shellapi to
winBindings.shell32

### Testing strategy:
* [x] Run try build. Test touch gestures. Ensure no deprecation warnings
in log.

### Known issues with pull request:

### Code Review Checklist:

<!--
This checklist is a reminder of things commonly forgotten in a new PR.
Authors, please do a self-review of this pull-request.
Check items to confirm you have thought about the relevance of the item.
Where items are missing (eg unit / system tests), please explain in the
PR.
To check an item `- [ ]` becomes `- [x]`, note spacing.
You can also check the checkboxes after the PR is created.
A detailed explanation of this checklist is available here:

https://github.com/nvaccess/nvda/blob/master/projectDocs/dev/githubPullRequestTemplateExplanationAndExamples.md#code-review-checklist
-->

- [x] Documentation:
  - Change log entry
  - User Documentation
  - Developer / Technical Documentation
  - Context sensitive help for GUI changes
- [x] Testing:
  - Unit tests
  - System (end to end) tests
  - Manual testing
- [x] UX of all users considered:
  - Speech
  - Braille
  - Low Vision
  - Different web browsers
  - Localization in other languages / culture than English
- [x] API is compatible with existing add-ons.
- [x] Security precautions taken.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* change button shown after a successful download from 'Yes' to 'OK' (#18934)

Summary of the issue:

change button shown after a successful download from 'Yes' to 'OK'
Description of user facing changes:

user will see "OK" button to confirm that AI image descriptions is download successfully rather than "YES" button

* Add 'try-**' branch to CI PR triggers (#18940)

Link to issue number:

None
Summary of the issue:

We occasionally want to run feature branches, that get PR builds when a PR is open against them
Description of user facing changes:

none
Description of developer facing changes:

none
Description of development approach:

Add try- branches to the list of branches that get PR builds

* Typing a dead key no longer throws an error (#18933)

Fixes #18908
Summary of the issue:

After we moved to a tightened ctypes definition for user32.MapVirtualKeyEx, typing dead keys such as an acute on a German keyboard layout would throw an error such as:

  File "keyboardHandler.pyc", line 535, in _get_mainKeyName
ValueError: chr() arg not in range(0x110000)

Description of user facing changes:

No longer throws an error when typing dead keys.
Description of developer facing changes:
Description of development approach:

KeyboardInputGesture.mainKeyName: As MapVirtualKeyEx now correctly returns an unsigned int we must be more explisit about filtering out dead keys. A dead key is denoted when the highest bit is set.

* Fix unescaped "<" in MathML in PDF (#18520)

Link to issue number:

Fixes #18511
Summary of the issue:

If the structure tree is used for MathML in PDF, calls to getValue return the interpreted &gt; so that it becomes < and we have an HTML syntax error.
Description of user facing changes:

The bug is fixed.
Description of developer facing changes:

None.
Description of development approach:

Called html.escape() for the result of the getValue (when it was not "none")

* Treat more syslistview32 controls as multi select (#18926)

Fixes #18918 
Summary of the issue:

NVDA doesn't recognize certain SysListView32 controls as multi select.
Description of user facing changes:

MP3 tag list view and other list views are now correctly recognized as multi select.
Description of developer facing changes:

None
Description of development approach:

SysListView32 turn out to be multiselect by default unless LVS_SINGLESEL is set. Accounted for that in code.

* Use GitHub forms for issues (#15320)

### Summary of the issue:

[GitHub issue
forms](https://docs.github.com/en/communities/using-templates-to-encourage-useful-issues-and-pull-requests/about-issue-and-pull-request-templates#issue-templates)
provide an easier and more clear way for users to report issues on the
NVDA project.

Currently, when filling out an issue form, inline comments and an
external guide is required to understand how to fill out an issue.

### Description of user facing changes

When reporting an issue to NVDA, users can use the simpler GitHub forms
interface.
Information from inline comments and the [issue
guide](https://github.com/nvaccess/nvda/blob/master/devDocs/githubIssueTemplateExplanationAndExamples.md)
have been merged into this form, so that it is easier to understand the
requirements.

The old forms have been retained and simplified for regular issue
reporters who prefer these.

### Description of development approach

N/A

### Testing strategy:

These changes have been pushed to a test repository

The new issue interface can be tested here:
https://github.com/nvaccess/nvda-issue-form-test/issues/new/choose

Example issues filled out using the form are as follows:
- https://github.com/nvaccess/nvda-issue-form-test/issues/1
- https://github.com/nvaccess/nvda-issue-form-test/issues/2

### Known issues with pull request:

The readability of markdown blocks might not be ideal, refer to
https://github.com/orgs/community/discussions/61696.
Tabbing through markdown editors is overly verbose and a frustrating
experience.

* Fix WindowFromAccessibleObject (#18942)

Fixes #18871 
Summary of the issue:

During the winBindings conversion of oleacc, there was an oversight in passing the right argument type to WindowFromAccessibleObject.
Description of user facing changes:

#18871 no longer reproducible
Description of developer facing changes:

None
Description of development approach:

    Pass a HWND instead of a c_int to WindowFromAccessibleObject
    WindowFromAccessibleObject is only expected to throw a Windows Error. Change the bare except accordingly and also log a debug warning.

* Modernize installer and reg key usage (#18851)

Part of #16304
Summary of the issue:

We need to refactor large parts of the installer code as part of the 64bit migration.
This is to ensure the old copy of NVDA is cleaned up correctly.
Description of user facing changes:

None
Description of developer facing changes:

    Some API breaking changes and deprecations which shouldn't affect most/any add-ons

Description of development approach:

    Move relevant keys to config.registry
    Move relevant paths to WritePaths
    Add type hints
    Create a winBinding for RegDeleteTreeW to update _deleteKeyAndSubkeys. The current design of _deleteKeyAndSubkeys was to support Windows XP and older

* Fix up #15320 (#18946)

Fix up #15320
Summary of the issue:

#15320 introduced issues with pre-commit https://results.pre-commit.ci/run/github/45885732/1758242518.RpdtNbQiT1CqPdTB7w-UTw

Additionally, some formatting was broken causing .github/ISSUE_TEMPLATE/03-special_case_issue.yaml to not appear in the issues choose list
Description of user facing changes:

The issue form for special case issues should reappear
Description of developer facing changes:

None
Description of development approach:

Fix lint

* automatically load  image descriptions after successfully download  (#18945)

Summary of the issue:
Fixed an issue where image descriptions would download successfully but not automatically load enabled

Description of user facing changes:
Image descriptions will be automatically loaded after successful download

* NVDA no longer becomes unusable when interacting with a protected process such as 1Password (#18948)

Summary of the issue:

During the conversion to 64 bit, the ctypes definition of WaitForSingleObject was tightened up. This caused related errors in NVDA previously hidden to be surfaced, such as continuing to keep an appModule alive with an invalid process handle. this was addressed.
However, a similar issue was also surfaced where although we successfully open a process, asking for the SYNCHRONIZE access right, once we go to check if the process is dead by calling WaitforSingleObject(handle, 0) this fails with access denied. We never actually got the SYNCHRONIZE access right.
This is most serious when trying to interact with 1Password, where it becomes totally unusable and NVDA continuously torws the error:

  File "appModuleHandler.pyc", line 622, in _get_isAlive
  File "winKernel.pyc", line 344, in waitForSingleObject
PermissionError: [WinError 5] Access is denied.

This error is also randomly seen from time to time when alt tabbing between windows. There may be another protected Windows process which happens to be noticed by NVDA.
Description of user facing changes:

NVDA no longer becomes unusable when interacting with a protected process.

* Fix Remote Access as follower (#18947)

Fixes #18938
Summary of the issue:

Attempting to control NVDA via the Remote Access feature fails on recent alphas.
Description of user facing changes:

It works again.
Description of developer facing changes:

Some constants from winUser have been made enum members in winBindings.user32.
Description of development approach:

    Removed the definitions of INPUT, KEYBDINPUT, HARDWAREINPUT, MOUSEINPUT, INPUT_TYPE and KEYEVENTF from _remoteClient.input.
    Changed Remote Access's keyboard code to use structures from winBindings.user32.
    Also moved duplicate constants from winUser and added deprecation code and notes to the user docs.

* Fix waitable timer (#18952)

Fixes #18949 

### Summary of the issue:

Braille display drivers that use a waitable timer to reset the waiting
for acknowledgement packets timer currently raise errors.

### Description of user facing changes:

NO longer errors.

### Description of developer facing changes:

None

### Description of development approach:

When calling `setWaitableTimer`, cast the APC to type
`PTIMERAPCROUTINE`. While `PTIMERAPCROUTINE` requires more parameters
than `PAPCFUNC`, we always used a `PAPCFUNC` instance in the past
without problems.

### Testing strategy:

- Test str from #18949 

### Known issues with pull request:

None

* Update user_docs/en/changes.xliff

* Update user_docs/en/userGuide.xliff

* Fix bug when updating add-ons automatically (#18971)

Link to issue number:

Fixes #18965
Summary of the issue:

When NVDA is configured to update add-ons automatically without provide notifications, add-ons aren't updated and an error is produced.
Description of user facing changes:

NVDA can be configured to update add-ons automatically, and this should work as expected.
Description of developer facing changes:

None.
Description of development approach:

Use wx.CallAfter to present a message informing that add-ons are been updated, in the _checkForUpdatableAddonsmethod of the UpdatableAddonsDialog class, just after the condition to check that add-ons should be updated automatically, ensuring that this can be run in the main thread.

Additionally, an error has been discovered and fixed in addonHandler, when installing an add-on which shows a message before installation.

* Add winBindings for crypt32 and replace raw ctypes calls. Move some structures into winBindings.crypt32 also. (#18956)

### Link to issue number:
None

### Summary of the issue:
Continuing to move to 64 bit, crypt32.dll is one of the last dlls that
requires correct ctypes definitions.

### Description of user facing changes:
None

### Description of developer facing changes:
Some structures have been moved from `updateCheck` to
`winBindings.crypt32`.

### Description of development approach:
Add winBindings.crypt32 required definitions, and move some structures.

### Testing strategy:
Spoof `buildVersion.updateVersionType` to `stable`, and checked for and
downloaded an update. Note however that as NV Access's TLS certificate
is trusted by my system, the changed code shouldn't have been exercised.

System and unit tests.

Further testing tbd

### Known issues with pull request:
None

### Code Review Checklist:

- [x] Documentation:
  - Change log entry
  - User Documentation
  - Developer / Technical Documentation
  - Context sensitive help for GUI changes
- [ ] Testing:
  - Unit tests
  - System (end to end) tests
  - Manual testing
- [x] UX of all users considered:
  - Speech
  - Braille
  - Low Vision
  - Different web browsers
  - Localization in other languages / culture than English
- [x] API is compatible with existing add-ons.
- [x] Security precautions taken.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sascha Cowley <16543535+SaschaCowley@users.noreply.github.com>
Co-authored-by: Sean Budd <sean@nvaccess.org>

* Fix report time (#18960)

Fixes #18959

### Summary of the issue:
Report current time gesture (`NVDA+f12`) doesn't work.

### Description of user facing changes:
Works again.

### Description of developer facing changes:
None.

### Description of development approach:
Set `dwFlags` to `0` if `None` is passed.

### Testing strategy:
Manual testing

### Known issues with pull request:
None.

* Add csrss app module (#18975)

Fixes #18859
Related to #18870
Summary of the issue:

Since winBindings and #18833, NVDA spits continuous debug warnings about the inability to get a process handle for csrss.exe
Description of user facing changes:

No errors.
Description of developer facing changes:

None
Description of development approach:

Create a csrss appModule that always assumes csrss.exe to be alive.

    CSRSS is an essential GUI process, therefore it can safely be considered always alive. It hosts the desktop object.
    Before winBindings, the app module was also assumed always alive due to an obfuscated bug.

* Isolate winBindings ctypes definitions (#18978)

### Link to issue number:
<!-- Use Closes/Fixes/Resolves #xxx to link this PR to the issue it is
responding to. -->
Fixes #18967
Fixes #18966
Fixes #18950
 
### Summary of the issue:
With the move to 64 bit, we have replaced all raw ctypes calls to
Windows API functions with calls to well defined ctypes definitions in
our new winBindings package.
However, these definitions are still just references to the global
ctypes functions looked up as attributes on the dlls. And then their
argtypes and restye have been changed.
Although these definitions are now correct, these changes have been
propagated globally, meaning that these changes may break old 3rd party
code that still make raw ctypes calls to these functions. And also, our
new code could break as if a Python dependency sets argtypes or restype
on these globally, different to our way.

We need to isolate our winBindings ctypes definitions so that they do
not affect, or are not affected by, 3rd party usage.

 
### Description of user facing changes:

### Description of developer facing changes:

### Description of development approach:
In each winBindings module, locate and change all lines of the form:
```
xx = dll.yy
```

Into
```
xx = WINFUNCTYPE(None)(('yy', dll))
```

By using the following sed command:
```
sed -E -i "s/^([[:alnum:]_]+)[[:space:]]*=[[:space:]]*dll\.([[:alnum:]_]+)[[:space:]]*$/\1 = WINFUNCTYPE(None)(('\2', dll))/" -- *.py
```

Now rather than xx being a reference to the global function pointer for
that function, it is now its own isolated WINFUNCTYPE function
prototype, which returns void and takes no arguments.
Then, the existing code to change argtypes and restype applies,
correcting this definition to match Microsoft documentation. But only
affecting our isolated copy, not globally.

For the majority of modules, WINFUNCTYPE also needed to be imported.

Finally, several typos were identified in winBindings.user32 where
argtypes was spelled as argTypes. these have been corrected.
 
### Testing strategy:
* General smoke tests - running NVDA for a period of time.
* Confirmed with timeit that there is no performance difference between
calling a global function pointer and a WINFUNCTYPE function prototype.

### Known issues with pull request:
It may seem a bit strange to first create the prototype returning void
with no arguments, and then setting argtypes and restype separately.
However, this was the quickest and least risky change we could make to
introduce isolation to fix the related issues.
We may consider writing an automation script to restructure the
definitions so that the result and arguments are set within the
WINFUNCTYPE definition. But this would be purely a style thing and has
no impact on performance or runtime execution.
 
### Code Review Checklist:

<!--
This checklist is a reminder of things commonly forgotten in a new PR.
Authors, please do a self-review of this pull-request.
Check items to confirm you have thought about the relevance of the item.
Where items are missing (eg unit / system tests), please explain in the
PR.
To check an item `- [ ]` becomes `- [x]`, note spacing.
You can also check the checkboxes after the PR is created.
A detailed explanation of this checklist is available here:

https://github.com/nvaccess/nvda/blob/master/projectDocs/dev/githubPullRequestTemplateExplanationAndExamples.md#code-review-checklist
-->

- [x] Documentation:
  - Change log entry
  - User Documentation
  - Developer / Technical Documentation
  - Context sensitive help for GUI changes
- [x] Testing:
  - Unit tests
  - System (end to end) tests
  - Manual testing
- [x] UX of all users considered:
  - Speech
  - Braille
  - Low Vision
  - Different web browsers
  - Localization in other languages / culture than English
- [x] API is compatible with existing add-ons.
- [x] Security precautions taken.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Sean Budd <sean@nvaccess.org>

* Move definitions for magnification.dll to winBindings (#18958)

### Summary of the issue:
Screen curtain defined ctypes bindings to magnification.dll from the
Windows API.

### Description of user facing changes:
None.

### Description of developer facing changes:
Moved definitions to `winBindings.magnification`.

### Description of development approach:
Move definitions to `source/winBindings/magnification.py`. Remove from
`Magnification` class. Add deprecation handling code. Tidy definitions
to not use so many temporary definitions.

Note that these definitions use ctypes' function prototype syntax. This
was carried across from the old definitions. We plan to move to this
syntax anyway.

### Testing strategy:
Ran from source. Tried enabling temporary and regular screen curtain.
Tried importing deprecated symbols.

### Known issues with pull request:
None

* Added ability to see changelog from the add-on store and Updatable add-ons dialog (#18816)

Fixes #14041
Summary of the issue:

Users may want to see changes included in the current version of add-ons, especially to decide if they want to update them, and to get an idea of new features, bug fixes and so on.
Description of user facing changes:

    In the add-on store, a new action allows to see changes for the current version of add-ons which specify this information.
    In the Updatable add-ons dialog, the virtual list used in other tabs of the store is presented, instead of the old small list, so that the changelog, if available, can be opened from the context menu to decide if add-ons should be updated to the available version.
    List of changes will be shown in browse mode. If changes are writen in markdown, they will be rendered in formatted HTML. The title of that message will show the add-on version name, and buttons will be available to copy the info and close the browseable message.

Description of developer facing changes:

    Add-on models have a new changelog property.
    The self.addonsList of the UpdatableAddonsDialog class is a subclass of the AddonVirtualList.

Description of development approach:

    Created a new action to show the changelog, when available, similar to other actions.
    Added changelog to add-on models.
    In the Updatable add-ons dialog, the same list used in the store dialog is presented, so that changelog can be opened from the context menu.

* Add VirusTotal scan results to add-on details (#18974)

Replaces #16510 and #16316
Related discussion #16241
Summary of the issue:

    Add-ons have been scanned by VirusTotal, but there is no easy way for a user to use this information to make an informed decision before installing an add-on
    Our warning about the safety/security of add-ons could include additional information on researching the safety of add-ons

Description of user facing changes:

    A new action for add-ons in the add-on store to view the scan results of an add-on
    Added information in the details panel of an add-on: summary of scan results, and scan URL
    Updated the user guide

Description of developer facing changes:

None
Description of development approach:

    Created a new VirusTotalScanResults structure to capture results from the add-on store metadata JSON

* Update user_docs/en/changes.xliff

* fix add-on store merge conflicts between #18816 and #18974

Fixes #18991
Fixes a bad merge conflict fix between #18816 and #18974
Summary of the issue:

add-on store cannot open
Description of user facing changes:

add-on store can open again
Description of developer facing changes:

none
Description of development approach:

fix merge conflict
Testing strategy:

add-on store can open again

* Fix legacy Windows console support (#18990)

### Link to issue number:
<!-- Use Closes/Fixes/Resolves #xxx to link this PR to the issue it is
responding to. -->
Fixes #18970

### Summary of the issue:
With the move to 64 bit, some Legacy Windows console support is
incompatible with the well-defined ctypes definitions. E.g.
GetConsoleProcessList and ReadConsoleOutputCharacter, causing ctypes
argument errors and Legacy Windows console support to not function at
all.


### Description of user facing changes:
Legacy Windows console support functions again.

### Description of developer facing changes:

### Description of development approach:
* `wincon.getConsoleProcessList`: correctly pass a DWORD array as the
process list, rather than an int array.
* `wincon.readConsoleOutputCharacter`: Correctly pass a Unicode buffer
(wchar array) rather than char array. However, then encode the buffer's
contents to utf-16 bytes when passing to
`textUtils.getTextFromRawBytes`.
 
### Testing strategy:
* In Windows terminal settings, choose to use Windows console host.
* In NvDA advanced settings, choose to use Legaticy Windows console
support.
* Open a cmd prompt. Confirm that errors are no longer thrown, and that
NvDA can read text with the review cursor, fetch the formatting with
NvDA+f, and that new text written to the console is spoken.

### Known issues with pull request:
None known.

### Code Review Checklist:

<!--
This checklist is a reminder of things commonly forgotten in a new PR.
Authors, please do a self-review of this pull-request.
Check items to confirm you have thought about the relevance of the item.
Where items are missing (eg unit / system tests), please explain in the
PR.
To check an item `- [ ]` becomes `- [x]`, note spacing.
You can also check the checkboxes after the PR is created.
A detailed explanation of this checklist is available here:

https://github.com/nvaccess/nvda/blob/master/projectDocs/dev/githubPullRequestTemplateExplanationAndExamples.md#code-review-checklist
-->

- [x] Documentation:
  - Change log entry
  - User Documentation
  - Developer / Technical Documentation
  - Context sensitive help for GUI changes
- [x] Testing:
  - Unit tests
  - System (end to end) tests
  - Manual testing
- [x] UX of all users considered:
  - Speech
  - Braille
  - Low Vision
  - Different web browsers
  - Localization in other languages / culture than English
- [x] API is compatible with existing add-ons.
- [x] Security precautions taken.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>

* NVDA again functions on ARM64 (#19001)

Summary of the issue:

AMD64 builds of NvDA are not currently functioning on ARM64 devices such as Copilot PC.
NVDA seems to crash when initializing NVDAHelper.
The crash seems to occur when trying to set the first nvdaControllerInternal function pointer for nvdaHelperLocal.dll in NVDAHelper.initialize. Yet all the previous function pointers for nvdaController are set correctly.

With the merging of pr #18570, for performance improvements NVDA loads ARM64EC dlls for AMD64 processes when running on ARM64. If NVDA itself is build as AMD64, this will include nvdahelperLocal.dll. There may be some kind of ARM64EC to AMD64 thunking issue going on here between nvdaHelperLocal.dll and Python ctypes callbacks. Though only specific to nvdaControllerInternal, not nvdaController.
Interestingly, nvdaController is c++, but nvdaControllerInternal is only c. Perhaps the compiler / headers only manage thunking for c++. Noting that with ARM64EC, I believe functions may get multiple entry points depending on whether being called with ARM64 or AMD64 code to appropriately handle arguments.
Description of user facing changes:

AMD64 builds of NVDA will run correctly on ARM64 devices such as Copilot PC.
Description of developer facing changes:
Description of development approach:

    Rename nvdaHelperLocal's nvdaControllerInternal.c to nvdaControllerInternal.cpp, now compiling with C++.
    nvdaHelper.initialize: rewrite the code that chooses which NVDA Helper Remote Loader processes to start, to be more accurate and readable. The logic now groups by specific OS archetecture, making it very clear which ones apply to which OS archetecture. This rewrite also ensures that particular checks are no longer skipped if an earlier check succeeded. E.g. previously ARM64 remote loader was never started on ARM64 if NVDA was compiled as AMD64.

* Use later liblouis commit (#18995)

Fixup for #18848
Summary of the issue:

The v3.35.0 tag on liblouis git repository is some commits behind the actual 3.35 release. The tagged version we used before didn't have its version number changed, so NVDA reports it as 3.34.0
Description of user facing changes:

NOne
Description of developer facing changes:

None

* Update tracked translations from Crowdin (#19002)

This pull request updates translations to languages being tracked from
Crowdin.

Co-authored-by: GitHub Actions <>

* Earlier discard of MULTISELECTABLE state (#18977)

Fixes #18961 
Summary of the issue:

NVDA still announces multiselectable when it should be disabled.
Description of user facing changes:

No longer announce multiselect state.
Description of developer facing changes:

None
Description of development approach:

Ensure the state is always discarded when the config flag is disabled.
Testing strategy:

STR from #18961

* Update change log and user guide to reflect 64bit ARM Windows 10 support (#19008)

* fix runlint output dir (#19010)

Summary of the issue:

When running runlint.bat outputDir the outputDir is not correctly written to for ruff format.
This is because

    The redirection operator > should not be part of the variable assignment. The redirection should be applied when the command is executed.

Description of user facing changes:

None
Description of developer facing changes:

Fixup for writing to a dir when performing ruff format

* Update scons to 4.10.0 (#19016)

Summary of the issue:

SCons 4.10 was released. It has some MSVC related issues fixed, particularly the one that caused GitHub Actions initialization to be very slow. This was already partially fixed by caching msvc settings, but the initial run should also be must faster now.

* Fix secure desktop handling (#19007)

Fixes #18962 

### Summary of the issue:
NVDA no longer detects secure desktop switches.

### Description of user facing changes:
None

### Description of developer facing changes:
None

### Description of development approach:
Two other incarnations of the ctypes uses None for null handles problem.
Handle them appropriately and add type hints in the process.

### Testing strategy:
Tested that the secure desktop is reported properly again.

### Known issues with pull request:
I think that a double check might be necessary for all functions that
return and callbacks that take handles. It is pretty likely that we
stumble upon more of those.

---------

Co-authored-by: Sascha Cowley <16543535+SaschaCowley@users.noreply.github.com>

* Updated Belarusian, Croatian and Polish symbols (#19015)

### Summary of the issue:
Updates Belarusian, Croatian and Polish symbols, in accordance with
original English file.

### Description of user facing changes:
User will hear simplified name for the circumflex accent, instead of
normalizes

### Description of developer facing changes:
Not applicable

### Description of development approach:
Edited Croatian, Polish and Belarusian files and tested that changes
work.

### Testing strategy:
Tested from source copy of NVDA.

### Known issues with pull request:
None known, and none expected.

* Added ability to report spelling errors in braille (#18641)

Fixes #7608

### Summary of the issue:
Currently, spelling errors aren't presented in braille. This may
negatively impact deaf-blind people and other braille users.

### Description of user facing changes:
If NVDA is configured to report format changes with tags in braille, and
to report spelling errors in braille, these mistakes would be presented
in braille with the "e" and "e with dot 7" tag.
An unassigned command has been added to toggle the reporting of spelling
errors in braille. This can also be configured from the Document
Formatting dialog.

### Description of developer facing changes:
None.

### Description of development approach:
Added a new item in the `fontAttributeFormattingMarkers` dictionary of
`braille.py` for spelling errors (`invalid-spelling`).
A `shouldBeUsed` method has been added to the `FormattingMarker`class,
to determine if an attribute should be reported.

### Testing strategy:
Tested locally in Microsoft Word and Notepad, typing text detected as
spelling errors.

### Known issues with pull request:
None.

---------

Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com>
Co-authored-by: Cyrille Bougot <cyrille.bougot2@laposte.net>
Co-authored-by: Sascha Cowley <16543535+SaschaCowley@users.noreply.github.com>

* Clean up 32-bit copy when installing 64bit (#18981)

Part of #16304
Summary of the issue:

    When installing a 64-bit copy of NVDA, the 32-bit copy is not correctly cleaned up
    Several instances of registry keys were being opened without being closed safely

Description of user facing changes:

The 32-bit copy should be cleaned up when installing the 64bit copy.
Description of developer facing changes:

None
Description of development approach:

    Added new properties to NVDAState in NVDAState.py for retrieving x86-specific Start Menu folder, default install directory, and install directory, ensuring correct handling of 32-bit registry keys on 64-bit systems. [1] [2] [3]
    Refactored unregisterInstallation in installer.py by breaking it into several helper functions, each responsible for unregistering a specific component (Ease of Access app, desktop shortcut, Start Menu, uninstall registry, app path registry, software registry) for both 64-bit and 32-bit registry keys.
    Improved error handling and logging for missing registry keys, making it easier to diagnose uninstallation issues on different system architectures.
    Safely close more registry keys

* Update brlapi to 0.8.7 for python 3.13 (#19018)

Closes #18657
Merges changes from https://github.com/nvaccess/brltty/pull/1 and
https://github.com/nvaccess/nvda-misc-deps/pull/39

### Summary of the issue:
BRLTTY needs to be updated for 64bit and python 3.13.
Since updating python it has been broken on alphas.

### Description of user facing changes:
BRLTTY restored usage restored

### Description of developer facing changes:
None

### Description of development approach:
Update commit from miscDeps built from
https://github.com/nvaccess/brltty/pull/

### Testing strategy:
Unit tests re-enabled

### Known issues with pull request:
None

* Fix x64 identification for update check #19020

Fixes #18983
Summary of the issue:

NVDA incorrectly identified the OS architecture as 32bit when running as a 64bit process.
This caused the update check to return 2025.3 as the expected NVDA version, as NVDA falsely said the system was 32bit.
Description of user facing changes:

Update check works for alphas
Description of developer facing changes:

None
Description of development approach:

Fix PROCESSOR_ARCHITEW6432 usages

* Fix some typos (#19021)


    There are inconsistencies in the descriptions of how many languages are supported for NVDA within the user guide.
    In touchHandler.py, there is a spelling error where ‘triple’ is written as ‘tripple’, and another spelling error where ‘quadruple’ is written as ‘quodruple’.

Description of user facing chan

* a small fix to the arabic symbols (#19038)

Fixes #19035

* Update tracked translations from Crowdin (#19044)

This pul…
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.

Update brlapi bindings to support Python 3.13 and X64

2 participants