Skip to content

Fix touch handler#18814

Merged
SaschaCowley merged 2 commits intomasterfrom
fixTouchHandler
Aug 27, 2025
Merged

Fix touch handler#18814
SaschaCowley merged 2 commits intomasterfrom
fixTouchHandler

Conversation

@SaschaCowley
Copy link
Copy Markdown
Member

Link to issue number:

Follow-up to #18207

Summary of the issue:

Alphas are broken due to a problem with touch handler.

Description of user facing changes:

Alphas work again.

Description of developer facing changes:

None.

Description of development approach:

Cast TouchHandler._wca to LPCWSTR when passing to CreateWindowExW.

This is needed because the lpClassName parameter of CreateWindowExW can accept a class atom, but ctypes doesn't know this.
This wasn't previously a problem because ctypes didn't have type information for CreateWindowExW, so happily sent the arguments.

Testing strategy:

Built and self-signed NVDA. Installed and observed that NVDA didn't crash and my touchscreen worked.

Known issues with pull request:

None.

Code Review Checklist:

  • 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
  • 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.
  • Security precautions taken.

Copilot AI review requested due to automatic review settings August 26, 2025 06:48
@SaschaCowley SaschaCowley requested a review from a team as a code owner August 26, 2025 06:48
@SaschaCowley SaschaCowley requested a review from seanbudd August 26, 2025 06:48
Copy link
Copy Markdown
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

This PR fixes a crash in NVDA's alpha builds by correcting a type casting issue in the touch handler. The problem occurs when passing a window class atom to the Windows API function CreateWindowExW, which requires explicit casting since ctypes now has type information for this function.

  • Cast TouchHandler._wca to LPCWSTR when calling CreateWindowExW to fix touch handler crashes
  • Addresses compatibility issues introduced by ctypes type information changes
  • Restores functionality for alpha builds without affecting stable behavior

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

@seanbudd
Copy link
Copy Markdown
Member

Have you tested this with 64bit NVDA too?

@SaschaCowley
Copy link
Copy Markdown
Member Author

Have you tested this with 64bit NVDA too?

Not yet. Once the CI build completes I'll test x86 and x86_64 in a VM

@SaschaCowley
Copy link
Copy Markdown
Member Author

@seanbudd tested with x64 build:

  • Was unable to install in Windows Sandbox (launcher gave error 0xc000007b)
  • Installed without VM and touch support was broken, but everything else seemed fine
  • The x86 version works fine including touch support

@SaschaCowley SaschaCowley requested a review from seanbudd August 27, 2025 01:25
@seanbudd
Copy link
Copy Markdown
Member

seanbudd commented Aug 27, 2025

That's strange, why do you think the VM case failed to install?
Can you open an issue for touch support in 64bit builds?

@SaschaCowley
Copy link
Copy Markdown
Member Author

That's strange, why do you think the VM case failed to install?

I'm really not sure. 0xc000007b apparently means that the file is not valid, but I don't know why that would apply in the VM but not on its host. I copied the file into 2 separate sandboxes just in case it didn't copy properly, and got the same result.

@SaschaCowley
Copy link
Copy Markdown
Member Author

Can you open an issue for touch support in 64bit builds?

It might not actually be broken. I looked at the logs and it's because the snapshot launcher doesn't have UI Access, I think because it's not signed. I thought it worked with x86 NVDA because NVDA still reports the focus moving due to touch inputs. I'm going to kick off a try build before merging this.

@SaschaCowley
Copy link
Copy Markdown
Member Author

Tested with the try build and touch support still works on 64-bit NVDA.

@SaschaCowley SaschaCowley merged commit 26f9828 into master Aug 27, 2025
108 of 110 checks passed
@SaschaCowley SaschaCowley deleted the fixTouchHandler branch August 27, 2025 02:37
@github-actions github-actions bot added this to the 2026.1 milestone Aug 27, 2025
@hwf1324
Copy link
Copy Markdown
Contributor

hwf1324 commented Aug 27, 2025

I'm really not sure. 0xc000007b apparently means that the file is not valid, but I don't know why that would apply in the VM but not on its host. I copied the file into 2 separate sandboxes just in case it didn't copy properly, and got the same result.

I also encountered this issue when installing the 64-bit version in the virtual machine. Using Process Monitor, it seemed related to the missing VCRUNTIME140.dll runtime library, but vcruntime140.dll was found, and I am not sure about the relationship between them. I installed the runtime library package and then successfully installed the 64-bit NVDA.

@SaschaCowley
Copy link
Copy Markdown
Member Author

I'm really not sure. 0xc000007b apparently means that the file is not valid, but I don't know why that would apply in the VM but not on its host. I copied the file into 2 separate sandboxes just in case it didn't copy properly, and got the same result.

I also encountered this issue when installing the 64-bit version in the virtual machine. Using Process Monitor, it seemed related to the missing VCRUNTIME140.dll runtime library, but vcruntime140.dll was found, and I am not sure about the relationship between them. I installed the runtime library package and then successfully installed the 64-bit NVDA.

Thanks for the nudge in the right direction, @hwf1324. Examining the vccorlib140.dll bundled with NVDA, we get:

> dumpbin /headers vccorlib140.dll
Microsoft (R) COFF/PE Dumper Version 14.42.34435.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file vccorlib140.dll

PE signature found

File Type: DLL

FILE HEADER VALUES
             14C machine (x86)
# ...

Which, if I understand correctly, means that this is an x86 DLL, which would explain why x64 NVDA can't load it. Presumably if there's an x86_64 version of the DLL installed it will be used as a fallback.

SaschaCowley added a commit that referenced this pull request Aug 28, 2025
Fixes #18827

Summary of the issue:
On clean copies of Windows (such as Windows Sandbox), 64 bit builds of
NVDA fail to run.

Description of user facing changes:
These builds now run.

Description of developer facing changes:
None.

Description of development approach:
In #18814 (comment)
we identified that NVDA wasn't running because `vcruntime140.dll`
couldn't be loaded. Inspection of this DLL revealed that it was a PE32
executable.
Updated the build script to copy C Runtime DLLs from the appropriate
architecture directory based on the build architecture.
Attempted running a 64 bit launcher in Windows Sandbox. NVDA starts but
importing `wx` fails:

```log
core failure
Traceback (most recent call last):
  File "nvda.pyw", line 309, in <module>
  File "core.pyc", line 713, in main
  File "NVDAHelper\__init__.pyc", line 40, in <module>
  File "eventHandler.pyc", line 13, in <module>
  File "api.pyc", line 14, in <module>
  File "textInfos\__init__.pyc", line 31, in <module>
  File "locationHelper.pyc", line 12, in <module>
  File "wx\__init__.pyc", line 17, in <module>
  File "wx\core.pyc", line 12, in <module>
  File "<loader>", line 15, in <module>
  File "<loader>", line 13, in __load
ImportError: (DLL load failed while importing _core: The specified module could not be found.) 'C:\\Users\\WDAGUtilityAccount\\AppData\\Local\\Temp\\nslFB31.tmp\\app\\wx._core.pyd'
```

After some investigation with
[procmon](https://learn.microsoft.com/en-us/sysinternals/downloads/procmon)
and [Dependencies](https://github.com/lucasg/Dependencies) I worked out
that 64 bit wx requires `vcruntime140_1.dll`.

Added `vcruntime140_1.dll` to the list of C Runtime DLLs to be included
in the build. This is deleted if building for x86 as this file doesn't
exist for the x86 runtime. I chose to go in this direction as this code
is easier to remove when we drop x86 support.

Testing strategy:
Built x86 and x86_64 launchers and ran them in separate Windows
Sandboxes.

Known issues with pull request:
None
nishimotz added a commit to nvdajp/nvdajp that referenced this pull request Jan 3, 2026
* Start dev cycle for 2026.1 (#18680)

Start the dev cycle for the 20XY.Z release.
This will be a compatibility breaking release.

Complete:
- [x] New section in the change log.
- [x] Update NVDA version in `master`
- [x] Bump the add-on API compatibility 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:
- [ ] [Update auto milestone
ID](https://github.com/nvaccess/nvda/settings/variables/actions)

* Add copy version number button to the about dialog (#18667)

Raised in
https://github.com/nvaccess/nvda/pull/15320#discussion_r2262427550

Summary of the issue:
There's no easy way for an NVDA user to copy the version information
from the about dialog

Description of user facing changes:
A button has been added to the about dialog to copy the version
information.
example `source-master-ed86524 (2025.3.0.0)`

Description of developer facing changes:
none

Description of development approach:
Added a button the message dialog

Testing strategy:
Tested by opening the about dialog and ensuring the version number is
copied

Known issues with pull request:
none

* n Update to Python 3.13 for 2026.1 #18689 

Part of #18591
Summary of the issue:

We want to update to Python 3.13 from 3.11
Description of user facing changes:

brltty will break
Description of developer facing changes:

    Update python to 3.13.6
    remove typing_extensions

Description of development approach:

    Updated all references of python 3.11 to 3.13
    Updated usages of TypeAlias to type: https://docs.python.org/3.13/library/typing.html#type-aliases
    Updated usages of ParamSpec to parameter lists: https://docs.python.org/3.13/library/typing.html#typing.ParamSpec
    Remove deprecated SupportsLessThan: 

Add SupportsLessThan to typing and typing_extensions python/typing_extensions#9 (comment)

* Change reference from "Comments" to "Notes" in the Elements list for Excel in the userGuide.md (#18715)

Update "Comments" to "Notes" in the elements list mention in the Excel section of the user guide
Link to issue number:
Summary of the issue:

The user guide covers accessing notes in Excel with the elements list, however calls them "comments" which is the old name (there is a different feature now called comments in Excel. What you can access in the elements list are notes, and this is reflected in the radio button for this section).
Description of user facing changes:

Change description of the elements list in Excel to talk about "notes" instead of "comments".

* remove glob import from versionInfo (#18682)

Follow up to #18680
Summary of the issue:

We use a glob import in versionInfo which is not recommended
Description of user facing changes:
Description of developer facing changes:

versionInfo no longer imports all variables from buildVersion
Description of development approach:

Update imports

* Report multi select on list boxes that support it (#18409)

Link to issue number:

Closes #18365
Summary of the issue:

NVDA does not report whether multiple selection is supported on a list control.
Description of user facing changes:

NVDA now reports multi select for a list that supports multiple selection.
Description of developer facing changes:

None
Description of development approach:

    Add a new MULTISELECTABLE state, analogous to oleacc
    Map that state to the oleacc state for MSAA
    Map the UIA Selection Can Select Multiple property to the new state.

* Fix type quoting for _SupportsLessThan (#18719)

Fixup of #18689

* CI: Expand the system test matrix to allow multiple runner testing (#18708)

Requested in #18689
Related to #18650 
Summary of the issue:

System tests should be executed on every supported os Github Actions offers.
Description of user facing changes:

None
Description of developer facing changes:

None
Description of development approach:

Add extra variables to the matrix to specify additional runners to run system tests on

* Create script to clear older caches (#18751)

Part of #17878
Summary of the issue:

PRs have been failing recently as we are well over our cache limit.
GitHub actions doesn't allow us to easily delete the caches of PR builds from within PRs, due to it being a cache poisoning risk.
Instead, we should clear caches manually on a regular basis.
Description of user facing changes:

None
Description of developer facing changes:

PRs more reliable
Description of development approach:

    Use gh cli to fetch cache items
    filter with jq for cache items last accessed older than 6 hours ago
    delete filtered cache items

* Fix up cache clearing (#18752)

Fixup of #18751

Uses IDs rather than keys to more consistently delete caches

* Fix OffsetTextInfo.collapse() and OffsetTextInfo.move() (#18348)

Fixes #18320.

This is my second attempt to fix it without breaking #17430. For the
reference, the first attempt was #18338, which is abandoned, and which
didn't fix the root cause, but just decoupled @nvdaes's commit from
TextInfo API. This PR however fixes the root cause of #17430.

Summary of the issue:
Commit 70cd311 by @nvdaes introduced a bug in TextInfo API:
`TextInfo.collapse()` now unnecessarily jumps to the next paragraph in
Notepad++. This bug also made its way into 2025.1 release.

I investigated the braille issue #17430 further and it boiled down to an
issue with `OffsetTextInfo.move()` implementation: it turns out that
unless it moves by character, it is unable to move to the very last
position in the document. Fixing `OffsetTextInfo.move()` implementation.

Description of user facing changes:
None

Description of developer facing changes:
`OffsetTextInfo.collapse()` now works correctly in Notepad++.
`OffsetTextInfo.move()` can now move to the very last position even when
unit is set to line or paragraph.

Description of development approach:
1. In `OffsetTextInfo.move()` modified the condition when
   `self.allowMoveToOffsetPastEnd` to increase `highLimit` regardless of
   current unit - previously this would only allow when unit is character.
2. Removed `ScintillaTextInfo.expand()` override.

Testing strategy:
1. Tested with use case provided in #18320.
2. Tested that `OffsetTextInfo.move('line', 1)` can now successfully go
   to the very last line in Notepad++ even if the last line is empty. This
   should be the proper fix for #17430.

Known issues with pull request:
None

* simplify encoding standards (#18717)

UTF-8 encoded files are no longer an issue with gettext/python.
It's unknown when this was fixed, likely around Python 3.11 update

* Update to Python 3.13.7 (#18736)

Summary of the issue:
> 3.13.7 is an expedited release to fix a significant issue with the
3.13.6 release:
> 
> - [gh-137583](https://github.com/python/cpython/issues/137583):
Regression in ssl module between 3.13.5 and 3.13.6: reading from a
TLS-encrypted connection blocks
> 
> A few other bug fixes (which would otherwise have waited until the
next release) are also included.

Description of user facing changes:
None

Description of developer facing changes:
See above

Description of development approach:
Change `3.13.6` to `3.13.7`.

Testing strategy:
Ran from source. CI.

Known issues with pull request:
None

* Add-on manifest: add 'changelog' key to document changes for the latest add-on release (#18672)

Partially closes #14041 

Summary of the issue:
NV Access add-on store does not show changelog for latest add-on
releases.

Description of user facing changes:
Lays the foundation to display add-on changelog if defined.

Description of developer facing changes:
Adds 'changelog' to add-on manifest key definitions and makes the vlaue
translatable.

Description of development approach:
Adds a new add-on manifest key named 'changelog' to document changes
between previous and latest add-on releases. This key is translatable
and is documented to instruct add-on authos on its usage and necessity.

Testing strategy:
Manual: requires building add-ons with "changelog" manifest key/value
defined.

Known issues with pull request:
None

* Update Licensecheck to 2025.1 (#18728)

Summary of the issue:

Updated Licensecheck to 2025.1 which recognizes more packages. Removed urllib3 as a license exclusion, since it is recognized correctly.
Description of user facing changes:

None
Description of developer facing changes:

More packages will be recognized by Licensecheck.
Description of development approach:

Updated Licensecheck, commented out exclusions and checked which ones where no longer needed.

* Test NVDA on server 2022 (#18755)

### Link to issue number:
Requested in
https://github.com/nvaccess/nvda/pull/18708#issuecomment-3199113055
Related to https://github.com/nvaccess/nvda/issues/18684

### Summary of the issue:
it was requested to run system tests on Windows Server 2022.

### Description of user facing changes:
None

### Description of developer facing changes:
NVDA is now systemd tested on Server 2022.

### Description of development approach:
- Added additional runner to the GitHub Actions matrix.
- Excluded symbols on windows-2022 with an explanatory comment.
- Visual Studio code intellisence whined about actions/checkout@v4,
updated to v5

### Testing strategy:
System tests

* Fix issues in uniscribe code (#18744)

Closes #18722 
Reverts 021bcd8
Summary of the issue:

The code that split a string at character boundaries discarded characters like \u0301 when such a character was the only character in a string.
Description of user facing changes:

When unicode normalization is on, navigating by character will again correctly announce characters like acute (\u0301)
Description of developer facing changes:

    NVDAHelper local calculateCharacterBoundaries now needs an offsets array that is textLength + 1 in size, rather than only the text length. This is to store the end offset of the last character.
    This reverts 021bcd8, therefore we don't pass additional extraneous alphanumeric characters to uniscribe to make it happy.

Description of development approach:

While debugging this issue, I found several issues in NVDAHelper local textUtils _getLogAttrArray function that is the base of the several calculation functions:

    The buffer passed to ScriptItemize was too small when a string only contained one character. The buffer should have space for at least two SCRIPT_ITEM structures in size. This is my hypothesis about the necessity of 021bcd8, namely the addition of two alphanumeric characters passed to the uniscribe methods. While there are no exactly known str to reproduce the issue behind 021bcd8, I tried several combinations of shorter and longer strings without alpha numeric characters, and I couldn't reproduce any of the behavior described in it after my changes to the c++ code. Therefore I reverted 021bcd8, as there is enough time to test this in Alpha thoroughly.
    Calculation of character offsets would never set the end offset when requesting the offsets of the last character in the string, since the end offset calculation starts at offset + 1 and offset + 1 is equal to textLength.
    Failed calls of ScriptItemize and ScriptBreak were never logged. ScriptItemize definitely failed when passing a string with only one character in it because the expected buffer was to small.

* Detect and report the status bar in Visual Studio Code #18724



Closes #11064.
Summary of the issue:

When invoking the standard "report status bar" gesture in Visual Studio Code, NVDA says "no status line found".
Description of how this pull request fixes the issue:

Adds logic to detect (by role or IAccessible2 ID) the status bar, caching it when found. Also added a custom text override to move the line and column to the start for speech-friendliness.
Testing strategy:

Tested in various document types (plain text, Python) in Visual Studio Code.
Known issues with pull request:

The status bar is not cached on app launch since the tree interceptor is disabled. If this override is removed, status bar accesses are always fast. With the override, the first access of the status bar takes about a second on my machine.

* Update information on API in developer guide (#18765)

Summary of the issue:

In practice, there have been exceptions to the NVDA API not documented in the developer guide.

Notably:

    Preserving transitive imports: imports may be removed/updated in modules. Developers should always import from the original source module, rather than rely on an import from another module.
    pip packages. Add-ons should rely on their own versions of pip packages. One exception to consider is updating wxPython, which in the past we have considered an API breaking change in itself.

* Add GitHub action to search for duplicates (#18763)

Summary of the issue:
It would be handy to automate searching for duplicates as part of
triage.

Description of user facing changes:
When opening an issue, a user may be greeted with a list of potential
duplicates.


Description of developer facing changes:
None

Description of development approach:

- [use Github models in GitHub
actions](https://github.blog/ai-and-ml/generative-ai/automate-your-project-with-github-models-in-actions/)
- [use ai-inference](https://github.com/actions/ai-inference)

Testing strategy:
Test on production, consider swapping out AI models as necessary

A POC that GitHub agentic workflows connected to our MCP server support
this: https://github.com/nvaccess/nvda/pull/18764

Known issues with pull request:
None

* try different AI model for issue summarisation (#18775)

Context:
https://github.com/nvaccess/nvda/issues/18774#issuecomment-3212799829

* try different AI model gpt-5 (#18777)

Fixup #18775
Context:
https://github.com/nvaccess/nvda/issues/18774#issuecomment-3212799829

* try gpt 4.1 for issue  duplication checks (#18780)

Fixup https://github.com/nvaccess/nvda/pull/18775
Context:
https://github.com/nvaccess/nvda/issues/18774#issuecomment-3212799829

It seems that for free tier gpt-5 is not available

* Increase token limit for duplication check (#18783)

Fixup of #18763
Summary of the issue:

The default token limit for the ai-inference action is 200, but the average NVDA issue body is 500 tokens.

https://platform.openai.com/tokenizer
Description of development approach:

up token limit

The max for free tier is 8000 tokens per request.
https://docs.github.com/en/github-models/use-github-models/prototyping-with-ai-models#rate-limits

* Remove coderabbit references (#18786)

Summary of the issue:
We use CoPilot rather than CodeRabbit for AI reviews.

Description of development approach:
Remove all references

Testing strategy:
None needed

Known issues with pull request:
N/A

* Move Windows API bindings out of hwPortUtils (#18571)

Part of #16304
Related to #18207

Summary of the issue:
`hwPortUtils` had a lot of ctypes bindings.

Description of user facing changes:
None

Description of developer facing changes:
Almost all of these bindings have been moved to the `winBindings`
subpackage.

Description of development approach:
Used VS Code's refactoring tools to move the ctypes code. Used the
Microsoft Learn pages and the header files in the Windows 10 SDK to add
type information.

Testing strategy:
Tested connecting a Brailleedge 40 via USB and Bluetooth with automatic
detection.

Used `dir(hwPortUtils)` to find all symbols accessible from
`hwPortUtils` without this PR. Manually filtered the list to exclude
transitive imports. Ran NVDA from source with this PR checked out and
made sure that:

* All of the identified symbols could still be imported; and
* All of the symbols moved by this PR log a deprecation warning on
access.

Known issues with pull request:
The definition of `SP_DEVICE_INTERFACE_DETAIL_DATA_W` has not been
moved, as its definition relies on variables in its closure.

* Move changes introduced by #18571 to 2026.1 (#18804)

Follow-up to #18571

Summary of the issue:
#18571 erroneously included its API changes in the 2025.3 section of the
changes file.

Description of user facing changes:
None

Description of developer facing changes:
API changes are correctly included in the 2026.1 section of the changes
file.

Description of development approach:
Moved lines.

Testing strategy:
None needed.

 Known issues with pull request:
None.

* Fix typos in changes introduced by #18571 (#18805)

### Link to issue number:
Follow-up to #18571
Follow-up to #18804

### Summary of the issue:
There were a few errors in the changes introduced by #18571 that weren't
caught in #18804.

### Description of user facing changes:
None

### Description of developer facing changes:
Cosmetic fixes to changes introduced in #18571.

### Description of development approach:
Merge 2 change log items, add missing asterisk.

### Testing strategy:
None

### 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
- [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.

* Create experimental 64-bit dual builds (#18207)

Summary of the issue:

NVDA needs to move to being a 64-bit application.
Description of user facing changes

None.
Description of development approach

    Move ctypes declarations of Windows APIs into their own subpackage (this is a work in progress)
    Fix issues with type declarations to enable running under 64-bit python.
    Identify a strategy for supporting 32-bit builds and 64-bit builds from the same source.
    Create architecture-specific directories under lib.

Testing strategy:

Run from source and use NVDA.
Known issues with pull request:

Various, including:

    Launcher doesn't work for updates (32-bit version will be left behind, regkeys won't be migrated, system config won't be migrated) - to be tackled in a follow-up PR

* Enforce Windows 10 requirement for NVDA (#18688)

Closes #18684
Summary of the issue:

NVDA 2025.3 and earlier requires Windows 8.1. With 2026.1 and with Python 3.13 dropping active support for Windows 8.1, NVDA will now require Windows 10 (1507) or later.
Description of user facing changes:

Notable changes include:

    System requirement set to Widows 10 (in code and in user-facing documentation)
    Windows OneCore will be used as default speech synthesizer.

Description of developer facing changes:

The following changes were made:

    SConscript: Windows subsystem set to Windows 10
    winVersion: removed recognition of Windows 8.1 (the constant itself is deprecated) and minimum version set to Windows 10
    Removed winVersion.WIN10 checks from the source code, including speech synthesizer list (OneCore is used by default)

Description of development approach:

Edited the NVDA source code to remove checks on winVersion.WIN10, similar to the approach taken in #15544 and friends.

* remove CI/CD handling for temp 64bit branch (#18812)

## Link to issue number:
Follow up to #18207 

### Summary of the issue:

We have merged the branch from #18207, we no longer need branch specific
CI/CD builds for 64bit

* Fix touch handler (#18814)

Follow-up to #18207

Summary of the issue:
Alphas are broken due to a problem with touch handler.

Description of user facing changes:
Alphas work again.

Description of developer facing changes:
None.

Description of development approach:
Cast `TouchHandler._wca` to `LPCWSTR` when passing to `CreateWindowExW`.

This is needed because the `lpClassName` parameter of `CreateWindowExW`
can accept a class atom, but ctypes doesn't know this.
This wasn't previously a problem because ctypes didn't have type
information for `CreateWindowExW`, so happily sent the arguments.

Testing strategy:
Built and self-signed NVDA. Installed and observed that NVDA didn't
crash and my touchscreen worked.

Known issues with pull request:
None.

* Improve unicode normalization (#18803)

Fixes #18722, for real this time.
Summary of the issue:

#18722 wasn't yet fixed, i.e. combining diacritics were still not pronounced correctly when Unicode normalization is on.
Description of user facing changes:

Combining diacritics will no be correctly announced when bound to a character that doesn't result in normalization, such as space.
Description of developer facing changes:

None
Description of development approach:

For normalization per character, we use textUtils.uniscribe.splitAtCharacterBoundaries to split per character and then perform per char normalization. However, combinations like  \u0301 (space + acute) are treated as one character, i.e. the acute binds to the preceding space. Normalization doesn't happen in this case, but yet the normalization logic changes the announcement behavior.

This fixes two issues:

    An issue in the uniscribe c++ code. We need the start offset, an offset at the end of every character and the end offset of a string to calculate boundaries correctly. If we don't, offsets aren't calculated correctly for the space with acute case.
    The issue were pronunciation of characters changes even though no normalization doesn't occur.

These cases are backed with unit tests to ensure the behavior is what we expect.

* Allow NVDA x64 to run on clean installs of Windows (#18828)

Fixes #18827

Summary of the issue:
On clean copies of Windows (such as Windows Sandbox), 64 bit builds of
NVDA fail to run.

Description of user facing changes:
These builds now run.

Description of developer facing changes:
None.

Description of development approach:
In https://github.com/nvaccess/nvda/pull/18814#issuecomment-3227651255
we identified that NVDA wasn't running because `vcruntime140.dll`
couldn't be loaded. Inspection of this DLL revealed that it was a PE32
executable.
Updated the build script to copy C Runtime DLLs from the appropriate
architecture directory based on the build architecture.
Attempted running a 64 bit launcher in Windows Sandbox. NVDA starts but
importing `wx` fails:

```log
core failure
Traceback (most recent call last):
  File "nvda.pyw", line 309, in <module>
  File "core.pyc", line 713, in main
  File "NVDAHelper\__init__.pyc", line 40, in <module>
  File "eventHandler.pyc", line 13, in <module>
  File "api.pyc", line 14, in <module>
  File "textInfos\__init__.pyc", line 31, in <module>
  File "locationHelper.pyc", line 12, in <module>
  File "wx\__init__.pyc", line 17, in <module>
  File "wx\core.pyc", line 12, in <module>
  File "<loader>", line 15, in <module>
  File "<loader>", line 13, in __load
ImportError: (DLL load failed while importing _core: The specified module could not be found.) 'C:\\Users\\WDAGUtilityAccount\\AppData\\Local\\Temp\\nslFB31.tmp\\app\\wx._core.pyd'
```

After some investigation with
[procmon](https://learn.microsoft.com/en-us/sysinternals/downloads/procmon)
and [Dependencies](https://github.com/lucasg/Dependencies) I worked out
that 64 bit wx requires `vcruntime140_1.dll`.

Added `vcruntime140_1.dll` to the list of C Runtime DLLs to be included
in the build. This is deleted if building for x86 as this file doesn't
exist for the x86 runtime. I chose to go in this direction as this code
is easier to remove when we drop x86 support.

Testing strategy:
Built x86 and x86_64 launchers and ran them in separate Windows
Sandboxes.

Known issues with pull request:
None

* document deprecation utils (#18809)

Follow-up to #18571
Summary of the issue:

As part of #18571, I wrote code that made handling a large number of module-level deprecations easier. Since this code made handling module-level deprecations more systematic and auditable, the code was split out into its own module.
As we wanted to get #18571 merged to unblock other work, documentation for that utility was not added in that PR.
Description of user facing changes:

None
Description of developer facing changes:

Adds documentation on the novel strategy for handling module-level deprecations.
Description of development approach:

Wrote documentation.

* Fix utils._deprecate to give the right module name when not running from source (#18823)

Follow-up to #18571

Summary of the issue:
The deprecation helper introduced in #18571 automatically detects the
module it's being used in. This detection is broken when running a
portable or installed copy.

Description of user facing changes:
None.

Description of developer facing changes:
The module is now reported correctly when emitting deprecation warnings.

Description of development approach:
Rather than using `inspect.getmodule`, get `__name__` from the frame's
globals.

Testing strategy:
Tested importing `BLUETOOTH_ADDRESS` from `hwPortUtils` from source and
in a portable (created with `scons dist`).

Applied the following patch and attempted importing
`_remoteClient.client.seven` when running from source and portable.

```patch
diff --git a/source/_remoteClient/client.py b/source/_remoteClient/client.py
index 4691a226f..541ec8f2a 100644
--- a/source/_remoteClient/client.py
+++ b/source/_remoteClient/client.py
@@ -743,3 +743,8 @@ def connectedClientsCount(self) -> int:
                        stack_info=True,
                )
                return 0
+
+from utils._deprecate import handleDeprecations, RemovedSymbol
+__getattr__ = handleDeprecations(
+       RemovedSymbol("seven", 7)
+)
```

Known issues with pull request:
None

* Add linting for markdown files

Fixes #16453
Summary of the issue:

Currently, NVDA's markdown files are not linted, and are quite messy and inconsistent as a result.
Description of user facing changes:

None
Description of developer facing changes:

Added a pre-commit hook that lints markdown files.
Description of development approach:

Linted all markdown files that aren't part of submodules or archival copies.
Turned off lint rules that were inappropriate for our repo as I went.
Added the final config to .markdownlint.jsonc (widely supported), and config specific to the pre-commit hook and VS Code plugin to .markdownlint-cli2.jsonc.

* Fix off by one text length in EditTextInfo (#18767)

Link to issue number:
Related to #18744 
Follow up of #18348 

Summary of the issue:
When working on #18744, I again stumbled upon the fact that the story
length reported by EditTextInfo is too high. This was discovered after
system test failures caused by #18348, i.e. reporting of an extraneous
blank at the end of the document when using NVDA review cursor. Note,
this is not a bug in #18348 and was accounted for in #18744 after the
test failure.

To reproduce
1. Open notepad classic
2. type `a`
3. Position the caret at the end of the line
4. Press nvda+delete or nvda+numpad delete

Observe that NVDA reports 50%, not 100%
Observe that `nav.makeTextInfo("caret")._getStoryLength()` reports 2,
not 1

Description of user facing changes:
None

Description of developer facing changes:
None

Description of development approach:
Fixed the off by one errors by removing the `+ 1` cases.

Testing strategy:
Tested str from this pr.

Known issues with pull request:
None

* Remove unsupported targetArchitectures from builds (#18798)

Related to #18207 

Summary of the issue:
There is unused code at `nvdaHelper/sconscript` instead we use
`nvdaHelper/archBuild_sconscript`

Description of user facing changes:
none

Description of developer facing changes:
none

Description of development approach:
remove dead legacy code for potentially handling 64bit builds.

Testing strategy:
CI/CD

Known issues with pull request:
none

* Remove junk files (#18806)

Description of development approach:
Remove junk unused files:
- `source/locale/log.txt` purpose unknown
- `tests/system/settingsCache/2020.4` this was intended to keep a cache
to diff how the settings of NVDA have changed over time, however there
is no need to commit this to source permanently

Testing strategy:
CI/CD

* Move more raw ctypes calls to winBindings (#18834)

Summary of the issue:

As we move to 64 bit, all raw ctypes calls must be replaced with calls with well-defined types.
For now, our goal is to create Python modules in our winBindings package, one for each dll. Each function definition is simply an attribute access of the function via the ctypes dll object, with its restype and argtypes corrected to exactly match Microsoft documentation.
We may consider better type hints in the future, such as pr #18534, but for now, we will continue to follow the more basic pattern, and then either automate switching to pr #18534, or automate generation of type stubs from the existing winBindings definitions.

Before any 64 bit work, there were around ~240 unique functions across ~30 dlls.
Before this pr, we are down to about 179 functions, across 21 dlls. Though about 11 of these functions are not fully moved as many calls still remain across the code base.
Description of user facing changes:

Ensure stability on 64 bit.
Description of developer facing changes:

Move more raw ctypes calls to winBindings definitions.
this pr replaces all remaining raw ctypes calls that had existing winBindings definitions already.
This PR also adds / uses many more winBindings defintions, bringing the remaining function count down to 146 functions across 13 remaining dlls.

* Add document for 3rd party issue reporting (#18807)


Link to issue number:

None
Summary of the issue:

We regularly need to encourage contributors to report issues upstream to third parties.
Having a centralised document with links to places to report issues with 3rd party software would be helpful
Description of user facing changes:

Adds a document for places to report upstream issues

* Fix app module loading when no process handle can be fetched (#18833)

Fixes #18826 
Summary of the issue:

NVDA sometimes can't get a process handle for an app module reliably.
Description of user facing changes:

Oo some systems, no longer an error on every focus events for some apps, particularly 1Password.
Description of developer facing changes:

NOne
Description of development approach:

When no process handle can be fetched the regular way, enumerate all top level windows until a window is found that belongs to the process, then call oleacc.GetProcessHandleFromHwnd to create a handle.

* 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

* Add stage3b x64 migration plan and update roadmap [skip ci]

* Add x64 migration merge rehearsal record [skip ci]

* Fix date in x64 migration merge rehearsal record (2025-12-30) [skip ci]

* Add QA checklist for stage3b x64 migration [skip ci]

* Update QA checklist: PR #607 is the safe merge base [skip ci]

* Update QA checklist: Step 1 (local verification) completed [skip ci]

* Fix tr_languages.c compilation: add /utf-8 flag for MSVC [skip ci]

* Add readmejp docType support to md2html.py [skip ci]

* Update .gitignore: add JP-specific build artifacts

* Fix: install ja-jp-comp6.utb to dist root (TABLES_DIR_JP) [skip ci]

* Fix: install ja-jp-rokutenkanji.tbl to louis/tables [skip ci]

* Fix: install both ja-jp-comp6.utb and ja-jp-rokutenkanji.tbl [skip ci]

* Fix: install ja-jp-rokutenkanji.tbl as ja-rokutenkanji.utb [skip ci]

* docs: add braille tables relationship documentation [skip ci]

* feat: implement ja-jp-comp6.utb pseudo-table support [skip ci]

* chore: update Python version to 3.13.11 x64 [skip ci]

* fix: import TableSource in __tables.py and fix translator2 import [skip ci]

* fix: align with betajp branch implementation for ja-jp-comp6.utb [skip ci]

* fix: add BUILTIN_JP and TABLES_DIR_JP to brailleTables/__init__.py [skip ci]

* fix: add BUILTIN_JP to _tablesDirs and fix TableSource import [skip ci]

* fix: correct TableSource import in __tables.py [skip ci]

* debug: add instrumentation logs for ja-jp-comp6.utb [skip ci]

* debug: add instrumentation logs for table resolution [skip ci]

* fix: correct indentation for except clause in debug log [skip ci]

* feat: set ja-jp-comp6.utb as default braille table for Japanese [skip ci]

* chore: remove debug instrumentation logs [skip ci]

* chore: remove remaining debug instrumentation logs [skip ci]

* feat: install ja-jp-comp6.utb to dist root for TABLES_DIR_JP [skip ci]

* feat: restore Japanese UI elements from betajp branch [skip ci]

* feat: use nvdajp3.ico for launcher NSIS icon [skip ci]

* feat: add Japanese-specific config settings to configSpec [skip ci]

* feat: add [language] section to configSpec for Japanese settings [skip ci]

* feat: set autoReportAllCandidates default to False for Japanese [skip ci]

* fix: update unit tests to support TABLES_DIR_JP for Japanese braille tables

* refactor: change default BUILD_ARCH from x86 to x64 and remove redundant x64 smoke test workflow

- Change BUILD_ARCH default to x64 in certBuild2023.cmd, runJpSmokeTests.ps1, and vs_utils.py
- Remove checkJtalkArch-x64.yml workflow as it's redundant with jpSmokeTests job in testAndPublish.yml
- x86 support has been dropped, so x64 is now the default architecture

* fix: restore Japanese-specific changes in ime.cpp and tsf.cpp from betajp branch

- Restore lastOpenStatus=false in ime.cpp (Japanese IME open status tracking)
- Restore getCompositionString with compAttr support in ime.cpp (#else block)
- Restore getDispAttrFromRangeWithShift and getDispAttrFromRange functions in tsf.cpp
- Restore jpAttrBuf usage in OnEndEdit for Japanese TSF display attribute support

* docs: add documentation for Japanese IME/TSF implementation changes

* fix: restore ATOK support in IAccessible overlay classes

* fix: restore ATOK overlay class registration in IAccessible.__init__.py

* chore: remove issue templates to restore betajp state

Issue templates were added in the previous commit but should not be
included in the x64 support PR. Removing them to restore the original
betajp branch state.

* chore: restore issue templates from betajp branch

Restore issue templates to match the betajp branch state.

* fix: restore Japanese update server URL in updateCheck.py

- Restore JP PATCH for _DEFAULT_CHECK_URL to use https://www.nvda.jp/updateCheck/
- This was lost during x64 migration merge
- JP builds depend on the NVDA.jp endpoint to serve localized installers and metadata

* Update liblouis braille table handling

* Add logging support for x64 JP smoke tests

- Add Start-Transcript/Stop-Transcript to capture x64 smoke test output
- Log output to jpSmokeTests.log (same as runJpSmokeTests.ps1)
- Capture unittest output via temporary file and write to log
- Maintain timeout handling for x64 smoke tests

* [skip ci] document

* [skip ci]

* Update JP investigation docs and roadmap

* docs: update x64 JP smoke crash investigation

* jp: stabilize x64 jtalk smoke tests (mecab workaround)

* docs: note UTF-8 vs SJIS mismatch hypothesis

* certBuild2025対応: 証明書ストア署名サポートとarm64ecビルドスキップ

- SConstructに証明書ストア署名(CERT_SHA1/CERT_NAME)のサポートを追加
- certBuild2023.cmdからcertFile=1の設定を削除(証明書ストア署名では不要)
- nvdaHelperLocal.defにDATAキーワードを追加(データシンボルエクスポート対応)
- arm64ecビルドをスキップ(MSVCリンカーのLNK1000内部エラー回避)

これによりcertBuild2025.ps1が正常に動作し、Windows証明書ストアから
署名できるようになりました。arm64ecはリンカーのバグが修正されるまで
スキップされます。

* certBuild2025対応: SConstructに証明書ストア署名サポートとarm64ecスキップを追加

- 証明書ストア署名(CERT_SHA1/CERT_NAME)のサポートを追加
- arm64ecビルドをスキップ(MSVCリンカーのLNK1000内部エラー回避)

* Fix code signing process and disable failing JP smoke tests

- Add useCertStore support to all signing conditions in SConstruct
  - NVDADistGenerator: sign nvda_noUIAccess.exe, nvda_uiAccess.exe, nvda_slave.exe, l10nUtil.exe
  - uninstaller: sign uninstall.exe
  - launcher: sign installer executable
  - NVDADist uiAccess parameter: enable UI access when using certificate store
- Disable 3 failing test cases in harness.json by changing 'text' to '_text'
  - 山ん中 (test index 2593)
  - 否が応でも (test index 1378)
  - 通し駕籠 (test index 1596)
  These tests fail due to MeCab reading differences, not build issues.

* Fix code signing: add useCertStore support to all signing conditions

- NVDADistGenerator: sign executables when using certificate store
- uninstaller: sign uninstall.exe when using certificate store
- launcher: sign installer when using certificate store
- NVDADist uiAccess: enable UI access when using certificate store

This ensures all executables and installers are signed when CERT_SHA1 or CERT_NAME is set.

* Fix code signing process and disable failing JP smoke tests

- Disable 3 failing test cases in harness.json by changing 'text' to '_text'
  - 山ん中 (test index 2593)
  - 否が応でも (test index 1378)
  - 通し駕籠 (test index 1596)
  These tests fail due to MeCab reading differences, not build issues.

Note: SConstruct changes are in commit b1a92a0b1c

* feat: Add -SkipSigning option for RDP environments and fix build issues

- Add -SkipSigning option to certBuild2025.ps1 and certBuild2023.cmd to skip code signing in RDP sessions
- Fix jpStageControllerClient to preserve existing files (JP-specific test_*.py) when copying examples
- Disable 3 failing test cases in harness.json (山ん中, 否が応でも, 通し駕籠)
- Add jptools/_state/ and jpchar/_state/ to .gitignore

* feat: Disable checkPo job and some pre-commit hooks temporarily

- Disable checkPo job in GitHub Actions workflow (to be fixed in a separate branch)
- Disable markdownlint-cli2, trailing-whitespace, end-of-file-fixer, and fix-byte-order-marker hooks in pre-commit config
- Add comprehensive documentation for pre-commit hooks in projectDocs/jp/README.md

* feat: Skip flaky system tests in GitHub Actions (same as certBuild2025.ps1)

- Exclude vscode and symbols test suites from testSuite matrix
- Add EXCLUDE_SYSTEM_TEST_TAGS support to systemTests.ps1
- Exclude restarts_on_crash and imageDescriptions test tags
- Add documentation for system test skip settings in projectDocs/jp/README.md

* fix: liblouisビルド時のC++専用フラグ削除とbool型サポート追加

- C言語ファイルをコンパイルする際に/std:c++20と/permissive-フラグを削除
- config.hをビルド時に生成し、HAVE_STDBOOL_Hを定義してstdbool.hをインクルード
- サブモジュール内のファイルを直接編集せず、ビルドシステム側で対応

これにより、Python 3.13への移行時のliblouisビルドエラーを解決

* [skip ci] docs: ドキュメントの更新

- roadmap.mdの更新
- period2関連ドキュメントの追加
- pr608-vs-pr609-explanation.mdの追加

* fix: nvdajp固有のCrowdinワークフロー無効化を復元

- add-new-language.yml: workflow_dispatchを無効化し、存在しないブランチ名でpushトリガーを設定
- fetch-crowdin-translations.yml: scheduleのcronをコメントアウト
- 両方のワークフロー名に '(DISABLED for nvdajp)' を追加
- 翻訳管理は上流のnvaccessリポジトリで行うため、nvdajpではこれらのワークフローは使用しない

* fix: testAndPublish.ymlをnvdajp仕様に調整

- ワークフロー名を 'CI/CD Japanese Version' に変更
- push/pull_requestのブランチから本家版のブランチ(master, beta, rc, try-**, release-** tags)を削除
- nvdajp固有のブランチ(betajp, releasejp)のみに限定
- scons_publisherのデフォルトを'nvdajp'に設定

* Restore nvdajp-specific configurations and fix copying.txt

- Restore security.md to Japanese version
- Restore .editorconfig to use CRLF line endings
- Restore .github/CODEOWNERS to disable nvaccess/developers
- Restore .github/FUNDING.yml to nvdajp-specific content
- Restore copying.txt to include NVDA Japanese Dependencies section
- Disable workflows: add-new-language, fetch-crowdin-translations, issueDuplication

* Update .gitattributes and pyproject.toml for line endings

- Remove JSON line ending configuration from .gitattributes
- Change line ending setting in pyproject.toml from "lf" to "native"

* feat: Add new IME change status key mappings in vkCodes.py

- Introduced IMEChangeStatus1, IMEChangeStatus2, and IMEChangeStatus3 key mappings to enhance input method functionality.

* feat: Enhance NvdaController interface with new speech and pitch control methods

- Added methods for spelling, speaking status, pitch, and rate adjustments to the NvdaController interface.
- Introduced setAppSleepMode for managing application sleep settings.

* fix: Update configuration settings for pitch change and braille options

- Set default capPitchChange to 0 for improved pitch control.
- Adjust braille translation and input tables to specific configurations.
- Change expandAtCursor default to false for better cursor behavior.

* chore: Update .gitignore to refine ignored files and directories

- Added exceptions for specific DLLs and text files in settingsCache.
- Included new directories and files related to jtalk and braille display drivers.
- Cleaned up ignored files to better manage build artifacts and local configurations.

* [skip ci]

* fix: Ensure directory creation before writing configH file

- Added a check to create the target directory if it does not exist before writing the configH file. This prevents potential errors during the build process.

* fix: restore nvdaController functions and fix liblouis config.h generation

- Restore nvdaController_speakSpelling and other missing functions from betajp branch
- Fix liblouis config.h generation path issue (Error 948)
  - Use relative path since script runs in variant_dir
  - Add buildConfigH function to ensure directory exists before writing

* fix: align CI workflow with upstream (nvaccess/beta)

- Update Python version: 3.13.7 -> 3.13.11 (match upstream)
- Update actions/setup-python: v5 -> v6 (match upstream)
- Update astral-sh/setup-uv: v6 -> v7 (match upstream)

This fixes the 'No interpreter found for cpython-3.13.11-windows-x86_64-none' error
in typeCheck job by using the same action versions as upstream, which properly
handles Python installation and uv configuration.

* fix: improve ReviewCursorManagerRegion implementation and document test failures

- Override _getSelection() to use CursorManagerRegion's implementation
- Override _routeToTextInfo() to properly handle activate() calls
- Add documentation for failing braille routing unit tests
- Document root cause analysis and fix approach

* fix: document test failures and skip problematic tests in braille routing

- Updated `test-routing-failures.md` to reflect the current status of `_routeToTextInfo()` implementation and ongoing test failures.
- Added detailed analysis of the issues causing test failures and proposed a recommended fix approach.
- Temporarily skipped failing tests in `test_routing.py` with references to the documentation for further investigation.

* feat: add Japanese localization for NVDA

- Introduced a new translation file `nvda-jp-patch.po` containing Japanese translations for various NVDA interface elements, including key labels, settings dialogs, and braille viewer options.
- Enhanced user experience for Japanese-speaking users by providing localized terms for input methods, UI elements, and commands.

* fix: update Japanese documentation and localization files

- Revised `changes-nvdajp.md` to reflect changes in the Japanese braille tables and settings, including the removal of deprecated options.
- Updated `roadmap.md` to clarify the process for merging Japanese translations and user dictionary tests.
- Enhanced `nvda.po` with additional translations and corrections for improved localization accuracy.
- Added new documentation files detailing test failures and justifications for skipped tests in the Japanese context.

* fix: update UTF-8 encoding in merge script and revise migration documentation

- Changed the file writing method in `merge-jp-patch-po.ps1` to use UTF-8 encoding without BOM for better compatibility.
- Updated migration review documentation to reflect the removal of deprecated files and clarify the automatic copying of upstream versions.

* fix: update CI workflow to disable chrome system tests on specific Windows runners

- Excluded the chrome test suite from running on windows-2022 and windows-2025 runners to improve CI stability and focus on relevant tests.

* [skip ci] document only

* refactor: update JP-specific marking rules and enhance documentation

- Revised the marking rules for JP-specific code in AGENTS.md to clarify when to use `# BEGIN JP PATCH` and `# nvdajp` markers.
- Updated the changes-nvdajp.md document to emphasize functional differences and added details about new features, including character reporting modes and Haruka voice engine support.
- Improved migration review documentation to reflect changes in configuration settings and confirm the removal of deprecated options.
- Enhanced globalCommands.py to implement character description mode with appropriate toggling and usage in speech functions.

* [skip ci] document only

* fix: replace DirectBM.dll with x64 version for x64 migration

- Replace x86 DirectBM.dll (75KB) with x64 version (84KB)
- Source: DirectBM_Demo/Bin_x64/DirectBM.dll
- Required for x64 Python 3.13 migration
- Update migration review document to mark all verification items complete

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>

* refactor: improve code readability and consistency in scons_jp.py and text2mecab.py

- Added line breaks for better readability in function definitions and print statements.
- Updated regex pattern in text2mecab.py to escape the question mark correctly.
- Enhanced assertions in text2mecab.py to improve clarity and maintainability.

* refactor: enhance timer function handling and add Japanese localization support

- Improved the timer function initialization in winUser.py to ensure proper handling of TIMERPROC types and null function pointers.
- Updated Chrome arguments and expected speech outputs in _chromeArgs.py and ChromeLib.py for Japanese language support.
- Added jpRobotUtil.py library for Japanese character description mode in chromeTests.robot.

* fix: enable UTF-8 mode for console output in test scripts

- Set the PYTHONUTF8 environment variable to 1 in tests.cmd files for jpchar and jptools to ensure proper handling of Unicode characters during test execution.
- Updated scons_jp.py to pass the PYTHONUTF8 environment variable when running test scripts, enhancing compatibility with Unicode output.

* Unify .venv-x64 to .venv and remove x86 build support

- Remove .venv-x64 usage from runJpSmokeTests.ps1 and checkJtalkArch.ps1
- Update scons_jp.py to default to x64 (x86 builds no longer supported)
- Update documentation to reflect x64-only support
- Update build-architecture-environment-variables.md to remove x86 references
- Note: x86 builds are no longer supported, all builds use x64 Python 3.13

* Fix TypeError in jpBrailleRunner when comment is a list

- Handle comment field as both string and list in pass1() and pass2()
- Use same logic as make_doc() to join list items with comma
- Fixes CI smoke test failure: TypeError when comment is a list

* Fix: Ensure x64 Python in .venv for smoke tests

- Use UV_PYTHON_PREFERENCE=only-managed to prevent x86 Python from PATH
- Verify venv Python is x64 after creation
- Detect and recreate incomplete venv
- Aligns with checkJtalkArch.ps1 approach

This fixes CI smoke test failures where x86 Python may have been used
instead of x64, causing test result mismatches (32 errors in test_pass2).

* Enhance signing support in sconstruct

- Introduced SKIP_SIGNING environment variable to conditionally skip signing operations.
- Updated certificate handling to respect the skipSigning flag, ensuring that signing tokens and certificate details are only set when signing is not skipped.
- Improved compatibility with Windows certificate store signing by integrating skipSigning checks.

This change allows for more flexible build configurations, particularly in environments where signing is not required.

* Update code-signing documentation to include SKIP_SIGNING feature

- Added details about the new SKIP_SIGNING environment variable, allowing users to explicitly skip code signing during builds.
- Updated examples for both PowerShell and CMD to demonstrate how to use SKIP_SIGNING.
- Clarified the impact of SKIP_SIGNING on existing signing configurations and the behavior of the build process.

This enhancement improves the clarity and usability of the documentation for developers working with code signing in JP-specific builds.

* feat: restore WAIC accessibility tests from betajp branch

- Add 8 WAIC test cases for aria-describedby attribute validation
- Tests cover button and input elements with various ARIA attribu…
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.

4 participants