forked from nvaccess/nvda
-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[pull] master from nvaccess:master #232
Open
pull
wants to merge
351
commits into
kkpan11:master
Choose a base branch
from
nvaccess:master
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Conversation
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
user_docs/markdownTranslate.py
Outdated
RAW_GITHUB_REPO_URL = "https://raw.githubusercontent.com/nvaccess/nvda" | ||
re_kcTitle = re.compile(r"^(<!--\s+KC:title:\s*)(.+?)(\s*-->)$") | ||
re_kcSettingsSection = re.compile(r"^(<!--\s+KC:settingsSection:\s*)(.+?)(\s*-->)$") | ||
re_comment = re.compile(r"^<!--.+-->$") |
Check failure
Code scanning / CodeQL
Bad HTML filtering regexp High
This regular expression does not match comments containing newlines.
Fixes #17182 Summary of the issue: In audio settings panel, the "Mute other apps" checkbox is misplaced: it appears at the top of the panel and hides its first control (output item). Description of user facing changes The checkbox is now correctly positionned. Description of development approach The checkbox has been added to the `BoxSizerHelper` so that it is positioned by it. Testing strategy: Visual check
From translation svn revision: 83858 Authors: Fatma Mehanna <[email protected]> Shaimaa Ibrahim <[email protected]> Abdelkrim Bensaid <[email protected]> Omar Alojaimi <[email protected]> Stats: 422 144 user_docs/ar/changes.md 12 3 user_docs/ar/userGuide.md 2 files changed, 434 insertions(+), 147 deletions(-)
From translation svn revision: 83858 Authors: Daniel K. Gartmann <[email protected]> Nicolai Svendsen <[email protected]> [email protected] Stats: 102 96 user_docs/da/changes.md 1 file changed, 102 insertions(+), 96 deletions(-)
From translation svn revision: 83858
Fixes issue #17127 Fixup of PR #16994 Summary of the issue: Same page links are reported, but not on local files. Description of user facing changes: Same page links will be also reported on local files like HTML documents. Description of development approach: In the `samePageURL` function, "file" has been added to `validSchemes`. Testing strategy: - Tested manually with NVDA's user guide. - Performed unit tests.
Summary of the issue: NVDA's code contains unused variables, with specific directives for the linter to ignore them (#noqa F841) Description of user facing changes There is no more #noqa F841 directive in the code. Description of development approach Searched for F841 in the code and solved the situations: Generally, removed the unused variable and checked that its presence without any use was not due to another oversight to use it elsewhere Or keep the previously unused variable and use it where it was aimed to (e.g. in NVDAObjects/window/_msOfficeChart.py) In winConsoleHandler.py, renamed consoleEventHookHandles to consoleWinEventHookHandles since the goal clearly seems to empty the list. Also used a Flake8 report on an older version of NVDA to identify other F841 issues. This way, I have been able to find undefined private variables (i.e. starting with underscore) that are not caught by Ruff's default rule.
…er dialog (#17186) Section 12.1.2.2, "Change synthesizer" of NVDA's User Guide currently reads: [...] This button activates the Select Synthesizer dialog, which allows you to select the active speech synthesizer and output device. [...] Even though output device selection has been moved to NVDA's audio settings. Description of user facing changes The outdated reference to changing the audio output device via the speech synthesizer dialog has been removed. Description of development approach Removed the words "and output device" from the description of the synthesizer section of the speech page of NVDA's settings in user_docs/en/userGuide.md.
The self signed build docs reference Windows 7. Windows 7 is no longer supported in NVDA. Description of user facing changes None Description of development approach Update docs to remove reference to windows 7 in self-signed build docs
Part of #16681, fixup of PR 17091 Summary of the issue: Add-on submissionTime in json metadata files is in milliseconds, but it needs to be converted to seconds to be transformed in a publicationDate Description of user facing changes None Description of development approach Convert add-on submissionTime to seconds in addonStore/models/addon.py
Summary of the issue: The only setting newLaptopKeyboardLayout for the config section upgrade is unused in NVDA Description of user facing changes None Description of development approach Remove this unused setting
Fixes issue 3 of #16828 . Summary of the issue: The br(seikantk):XXX IDs of bk:space and bk:space+dots are incorrect. Although it has few influence to UX, it may bring trouble to add-on developers. Description of user facing changes There must be one option displayed when adding a new gesture in Input gestures dialog is about Seika Notetaker. Without this PR, the option is always backspace+dX, e.g. backspace+d1+d3+d4+d5. Now, backspace+d1+d3+d4+d5, d1+d3+d4+d5+space, and backspace+d1+d3+d4+d5+space are displayed correctly according to the actual space key(s) pressed by the user. Description of development approach Type of space parameter of class InputGesture becomes int. It may be 1(backspace), 2(space), or 3(both). The correct key name is obtained from _getKeyNames.
fix #17175 Summary of the issue: Update wxPython to 4.2.2, using 32-bit wheel hosted on PyPI Description of user facing changes Not yet. Description of development approach Replace the wx python version of the requirements file with pip's and tested it with a locally compiled build!
From translation svn revision: 83862 Authors: Zahari Yurukov <[email protected]> Kostadin Kolev <[email protected]> Stats: 3 3 source/locale/bg/symbols.dic 1 file changed, 3 insertions(+), 3 deletions(-)
From translation svn revision: 83862 Authors: Daniel K. Gartmann <[email protected]> Nicolai Svendsen <[email protected]> [email protected] Stats: 62 45 user_docs/da/changes.md 1 file changed, 62 insertions(+), 45 deletions(-)
From translation svn revision: 83862
…dows errors, improve UX (#12355) Fixes #10799 Fixes #12345 Fixes #12351 Replaces #12349 Summary of the issue: * The COM Registration Fixing Tool still showed its completion dialog if it failed, or if the user said no to the UAC dialog (#12345). * The initial dialog didn't have a visual close button (red X), and was not responsive to the `Escape` or `Alt+F4` keys (#10799). * It didn't report errors to the user as pointed out by @CyrilleB79 in #12349, and * Its initial warning dialog was not serving users well with its strong warning and presentation (#12351). User facing changes: * Initial dialog given a more friendly message, with a more beginner-themed explanation. * User may now press `Escape`/`Alt+F4` to leave the dialog, as well as hitting `Cancel`. * There is now a visual close control (red X). * `F1` context help is now available. * Errors are reported to the user by error code. * The tool no longer reports success if it fails. * The tool no longer reports success if the process is cancelled by UAC. Development details: * Refactored this code to be in line with current coding standards, fix the above issues, and to give the tool a better over all UX. * Catch the Windows error generated on UAC cancel, and log that the process was stopped at the UAC. * Show other Windows errors to the user via a dialog, instead of just in the log. * Switched from using YES and NO buttons, to Continue and CANCEL. * Added a docstring. Linted and added more logging. * In order to implement the Continue and Cancel paradigm, created `gui.nvdaControls._ContinueCancelDialog`. Testing strategy: * Tested all buttons by tabbing and pressing, and by keyboard shortcuts. * Tested that all windows appear when and where they should. * Confirmed that the "completed" message no longer appears on failure or cancellation. * Simulated a Windows error to prove that a message would appear to show the error to the user. Known issues: 1. Upon UAC cancel, or upon successful completion, focus is moved from desktop or where ever it was, to the NVDA systray icon. That seems a little strange to me, although it is not new behavior. `gui.postPopup` is supposed to fix this, but it doesn't. 2. Even after being deleted, the progress window's speech appears to hang around until after the completion window is cleared, although this speech seems to be cancelled or interrupted. Again, not new behavior.
Summary of the issue: Changes to the COPYING.txt file for NVDA to streamline our licensing information and ensure clarity regarding the use of GPL-2. Key changes: 1. Simplify the content to focus on the GPL-2 license and specific callouts for exceptions where necessary 2. Reference other projects and their licenses instead of including full texts 3. Clarify that our GPL-2 usage means "GPL-2 or later" 4. Add to pyproject.toml Rationale: The current COPYING.txt file includes licenses for various dependencies shipped with NVDA. This approach has been inconsistent, with some dependency licenses included and others omitted. The proposed changes aim to lay the groundwork for a more consistent and manageable licensing document. Description of user facing changes: Deletion of large sections of copying.txt. Clarification of GPL-2 or later.
Summary of the issue: NV Access is pleased to share our NVDA development roadmap, outlining our short, medium, and long-term priorities for NVDA. Our goals in sharing this roadmap are to foster greater transparency and collaboration with our community. * Alignment: To align community development efforts with NV Access's priorities for a healthy and vibrant NVDA and add-on developer ecosystem. * Excitement: To generate enthusiasm and anticipation for upcoming features and improvements. * Transparency: To openly share our development focus and direction. * Dialogue: To encourage discussion and feedback between the developer community and NV Access. Description of user facing changes: Updated `readme.md` to link to the roadmap on the NV Access website.
From translation svn revision: 83877 Authors: Daniel K. Gartmann <[email protected]> Nicolai Svendsen <[email protected]> [email protected] Stats: 1007 153 user_docs/da/changes.md 1 file changed, 1007 insertions(+), 153 deletions(-)
From translation svn revision: 83877
…7151) Related to #17099 Summary of the issue: The NVDA update check URL is currently hard-coded in NVDA. This presents problems for users who are unable to use the default URL for any reason. This particularly affects users in the People's Republic of China, many of whom are unable to access the update check server at an acceptable speed. A community add-on exists to work around this, but a means of specifying a mirror directly within NVDA is considered a better approach. Description of user facing changes Added controls similar to the speech synthesizer or braille display controls to NVDA's general settings page that allow the user to change the update server in use. Added slightly more helpful wording to update check errors that encourages users to check the mirror URL if there are issues accessing the update check server and a custom URL is in use. Description of development approach - Added a new string config item, `update.serverURL`, which defaults to the empty string. - Added a private getter method to `updateCheck.py` which returns the configured URL if set, or the default otherwise. Made the `CHECK_URL` constant private since it is no-longer needed. Updated references to the constant to use the new getter, and to use f-strings rather than strf style substitutions. - Changed `updateCheck.UpdateChecker._error` to return more helpful messages. - Added a new class, `SetURLDialog`, to `gui.settingsDialogs`. This dialog allows for the input and testing of URLs, and saving them back to config. The dialog is flexible, with a view to using it for the mirror URL support in the Add-on Store added in #17099 . - Modelled the new controls in the General page of NVDA's settings on the speech synth and braille display controls. - A difference is that I have chosen to populate the update mirror text box in the `onPanelActivated` method rather than in `makeSettings` to avoid code duplication between the first population and when populating after the mirror URL is changed. Testing strategy: Spoofed the NVDA version to 2024.1 stable by altering `buildVersion.py` and `versionInfo.py`. Tested checking for updates with: - No mirror set - No mirror set, but nvaccess.org redirected to localhost via the hosts file - Mirror set to the NVDA-CN mirror, and nvaccess.org redirected to localhost via the hosts file - Mirror set to example.com - No mirror set and networking disabled - Mirror set to a random string and networking disabled Tested many scenarios in the new dialog to ensure it behaves as expected, including: - Saving the same URL as in config (does nothing) - Clearing the URL field (disables the test button) - Typing in the URL field (enables the test button) - Saving the empty string without testing it (does not prompt for test) - Testing the URL when connected to the internet and the URL points to the NV Access NVDA update server (succeeds) - Testing the URL when it points to an invalid URL (fails) - Testing the URL when it points to a valid URL with no DNS records (fails) - Testing a valid URL that points to a working but non-NVDA update server (fails) - Testing a valid URL when offline (fails) - Attempting to save an untested URL (warns but allows saving) - Attempting to save a URL that failed the test (warns but allows saving) - Attempting to save a URL that passed (succeeds) Known issues with pull request: The read-only URL text control line wraps, causing NVDA to sometimes only read part of the URL, and potentially causing odd visual layout. The "Test..." button only performs a connection check. Connecting to a URL that returns invalid NVDA update data will still pass.
Partially fixes #17198 Summary of the issue: When using the Microsoft Pinyin Input Method for Chinese and enabling the Pinyin compatibility option to use the previous version, typing in LibreOffice (e.g. Writer or Calc) while an IME popup was showing triggered an error, caused by the attempt to create a text info for an object from the IME popup that's not actually part of the LibreOffice accessibility tree, and that doesn't provide any means to get the current caret position. This is due to `CompoundDocument._get_caretObject` returning the last queued focus object, which isn't necessarily the object that the caret change event has actually been sent for, and might be an object that doesn't support reporting of a caret position altogether. Description of user facing changes When using the Microsoft Pinyin Input Method for Chinese and enabling the Pinyin compatibility option to use the previous version, typing in LibreOffice Writer (and potentially other applications) while an IME popup is showing no longer triggers an error. Description of development approach: Handle the `NotImplementedError` error that may get thrown in `CompoundDocument.event_caret`. Known issues: None, but note that other than Writer, the case of using Calc still shows more issues, i.e. this is only a partial fix for the use case described in that ticket.
Closes #17003 Summary of the issue: The nvda-vscode repository exists to create a workspace configuration for VS Code that contains some sensible defaults, and recommendations for extensions that make developing for NVDA to our standards easier. However, using this workspace configuration currently requires manually clone it. Description of user facing changes: None Description of developer-facing changes: The .vscode directory for NVDA is now included as a submodule. This reduces friction for VS Code users, should have effectively no impact on users of other IDEs, and can be disabled by users who do not desire this behaviour. Description of development approach: Added nvaccess/vscode-nvda as a submodule. Set its ignore option to dirty so that users' changes to their project config don't cause the superproject to show as dirty. Updated the dev docs to note the change. Testing strategy: Verified that .gitmodules has been updated. Known issues with pull request: None.
Fixes (at least partially) #10271 Supersedes #10283. Summary of the issue: User wants to have font formatting state announced when native font formatting shortcut are executed under Word and Outlook. Description of user facing changes The results of the following MS Word shortcuts are now reported: control+shift+D: Underline double control+shift+W: Underline words only control+shift+A: All caps ctrl+Shift+K: Small caps ctrl+shift+i, ctrl+shift+b and ctrl+shift+u: alternative gestures for toggle italic, bold and underline. When relevant, these shortcuts are also reported in Outlook. Notes about various capitalization shortcuts In Word, the Shift+F3 and Ctrl+Shift+A shortcuts are slightly different: Shift+F3 only modifies the case of the current selection (or the word under the cursor if there is no selection) Ctrl+Shift+A also modifies the case of selected text (or current word), but in addition, it modifies the case of the characters that will be typed at insertion point of the cursor. Outlook's Ctrl+Shift+A shortcut is equivalent to Word's Shift+F3, whereas Word's Ctrl+Shift+A has no equivalent under Outlook as far as I know. Messages Word's shortcuts Ctrl+Shift+A, Ctrl+Shift+K and Shift+F3 modify all the selection's (or current word's) capitalization. However, Ctrl+Shift+A and Ctrl+Shift+K also impact the next characters that will be typed. Thus for this shortcut "on" and "off" have been used in their announced message in order to denote a state change. On the contrary Shift+F3 announces only the result of a modification of current selection (or word); thus "on" and "off" have not been used in its message. Description of development approach Use object model and polling to check state change, as done for other formatting scripts.
Summary of the issue: The development environment documentation has a number of lint violations and inconsistencies. Description of user facing changes The development environment documentation has been slightly updated to be easier to read. Description of development approach - Fixed lint errors to do with headings and code blocks not being surrounded by blank lines. - Slightly restructured dependency documentation so that submodules are organised into run time, build time and VS Code dependencies. - Moved the reference to Doxygen to a new "Other dependencies" section. - Fixed a couple of violations of the one-sentence-per-line rule. - Changed in-text references to NV Access to use proper capitalisation and spacing ("NV Access" rather than "nvaccess" or a reference to our NVDA repo (`nvaccess/nvda`)) - Fixed some sentences not ending with full stops or colons. - Changed the reference to WIL to call it "Windows Implementation Libraries (WIL)" - Linked to the git submodules documentation.
From translation svn revision: 83896 Authors: Bram Duvigneau <[email protected]> Bart Simons <[email protected]> A Campen <[email protected]> Leonard de Ruijter <[email protected]> Stats: 103 106 user_docs/nl/userGuide.md 1 file changed, 103 insertions(+), 106 deletions(-)
From translation svn revision: 83896 Authors: [email protected] [email protected] Aaron Wu <[email protected]> Victor Cai <[email protected]> [email protected] Stats: 1422 1235 source/locale/zh_TW/characterDescriptions.dic 75 3 source/locale/zh_TW/symbols.dic 2 files changed, 1497 insertions(+), 1238 deletions(-)
From translation svn revision: 83896
Fixes #17218 Summary of the issue: When a checkbox in LibreOffice receives focus, the current state (checked/unchecked) of the checkbox was not reported in braille, while it was in speech. This is due to the NVDA's braille logic using a concept of multiple "focus regions"/potential strings to display, and reporting only the one that's considered the most relevant on the braille display. If an object is considered to have "useful text", that text is given a higher priority than the default logic for checkboxes (see braille.getFocusRegions). While the latter does include the checkbox state, the former doesn't. An object is (among others) considered to have useful text if it is an EditableText instance (see NVDAObjectHasUsefulText). So far, the SymphonyText overlay class was used for objects implementing the IAccessibleText interface in the LibreOffice app module, regardless of their role, which meant that the overlay class would also be used for checkboxes. As SymphonyText subclasses EditableText, the text/label of the checkbox was reported on the braille display, which doesn't include the checkbox state. Description of user facing changes In LibreOffice, the current checkbox state (checked/unchecked) is now also reported in braille, not just speech. Description of development approach Limit the use of the SymphonyText overlay class to objects with corresponding roles: EDITABLETEXT and HEADING For objects with a PARAGRAPH role, SymphonyParagraph already gets used. This prevents overriding the default logic for reporting objects, including that for checkboxes. While at it, also add BLOCKQUOTE to the set of roles for which to use SymphonyParagraph, as the block quote role is used for paragraphs in Writer using the "Block Quotation" paragraph style since LibreOffice commit https://git.libreoffice.org/core/commit/b7d2a9c824aca1a4dfd1b857a3620e73ade6bc0d .
…nds to allow downloading and uploading from Crowdin. (#17708) Currently, a translator must manually download and upload files from Crowdin. This can take time and is easy to use the wrong settings when importing and exporting. Description of user facing changes A translator can now download a file using the NVDA l10nUtil: l10nUtil downloadTranslationFile <language> <crowdinFilePath> [<localFilePath>] E.g. l10nUtil downloadTranslationFile fr userguide.xliff This will download the file, and preprocess it, avoiding bugs in the Crowdin exporter, including filtering of corrupt target strings. The translator can then translate the file with Poedit as normal. The translator can now upload the file back to Crowdin using the NVDA l10nUtil: l10nUtil uploadTranslationFile <language> <crowdinFilePath> [<localFilePath>] [--old <oldLocalFilePath>] E.g. l10nUtil uploadTranslationFile fr userguide.xliff --old userguide_old.xliff The --old argument allows you to provide the original downloaded file before it was last translated with Poedit, so that only added / changed translations are uploaded to Crowdin, decreasing the possibility of overriding someone elses work on this language. Note that the download and upload commands of l10nUtil require a Crowdin auth token. The first time, the token will be asked for. You will need to create a personal access token in your Crowdin settings, ensuring it has the Translations scope at a minimum. Paste this token into the user prompt. l10nUtil will save this in `/.nvda_crowdin for future use. Description of development approach l10nutil.py has new commands that use the Crowdin API.
Fixed: #17696 Summary of the issue: When the highlighter is enabled, the NVDA Highlighter Window icon is fixed on the taskbar after restarting Explorer. Description of user facing changes The NVDA Highlighter Window icon is no longer fixed in the taskbar after restarting Explorer. Description of development approach Add a WS_EX_TOOLWINDOW window style to the highlight window.
…is now reported (#17545) Related to #17499, but independent of it. Summary of the issue: In MS Word, control+alt+plus and control+alt+- allow to expand and collapse the content below a heading. NVDA does not report the result of this action. Description of user facing changes: NVDA now reports the result of the Word commands to expand and collapse headings. This command does not exist in Draft mode, so nothing is reported when in this mode. The command also does not report anything in Outline mode (limitation of this PR). Description of development approach: Use Word object model (if available) as done for many Word gestures, no matter if UIA is enabled or not Testing strategy: Tested with and without UIA. Known issues with pull request:: This PR does not cover outline mode. The collapse / extend commands still don't report anything in Outline mode; see related issue #17645.
Fixes #17110 Summary of the issue: Ever since #16636, users have been able to press the "update all" button to execute downloading and installing all the add-ons multiple times. This is because the update all button is disabled after the add-ons have finished downloading, not immediately after it is clicked, preventing subsequent activations. Description of user facing changes Users are unable to press update all button multiple times until add-ons finish downloading. Description of development approach Disable update all button immediately after first activation. Testing strategy: Manual testing by simulating slow internet updating multiple add-ons
Closes #3208 Closes #17162 Summary of the issue: To update add-ons automatically, users must click-through a dialog to confirm they wish to update all add-ons. Instead, this can be done in the background, and the user just needs to confirm whether to restart NVDA once add-on updates are complete. Additionally: - Users couldn't automatically update to incompatible add-ons. this is useful for alpha/beta testers testing add-on compatibility in breaking releases - The update notification was annoying - it queued too late and users should get a ding when it appeared. - If the add-on store server failed, users didn't receive displayable error messages when using automatic update notification - Since #17597, the update notification panel will list all available updates for all channels. The update all button would update the add-on for each channel. Instead only the latest add-on version for any channel should be used/listed. Description of user facing changes - Added the ability to automatically update add-ons in the background. This can be changed in the "automatic updates" section. - Added the ability to update to incompatible add-ons. users can enable this via a new setting in the add-on store panel. - The update notification is now queued sooner (1 minute not 3 minutes) and provides a ding before focusing the panel - the update notification panel now only lists the most recent version of an add-on, rather than showing all add-ons that are newer across channels - Server errors now log an error message if the update notification fails to fetch data Description of development approach - Refactored update status tracking so devs can compare add-ons to see which is newer more easily - Re-designed message box tracking to make it work for pseudo-modals, e.g. the background update process - use a shorter starting offset for daily scheduled jobs Testing strategy: - Installed an old add-on - Tested automatic update notifications - Tested background automatic updates - Tested both of these without a server connection Known issues with pull request: None
… than using nuitka which took way too long to compile. (#17712) l10nUtil (which allows translators to download and upload to Crowdin, and convert xliffs to markdown and html) s currently build using nuitka. However, this takes a significant amount of time. On Appveyor this takes roughly 20 minutes, which is more than a rd of the total build time.In many cases, this pushes the buildtime past 60 minutes and the build is cancelled by appveyor. Description of development approach Instead of using Nuitka, compile l10nUtil.exe as one of NVDA's executables using py2exe. Several modules and packages in lxml and markdown extensions needed to be explicitly listed in setup.py for this to work. Also, l1nutil.py, markdownTranslate.py, md2html.py and keyCommandsDoc.py were moved from user_docs to source, which made it easier to handle with py2exe. l10nUtil.exe still works just the same, and build time is cut down by at least 19 minutes.
…characters and tongjiazi (phonetic loan characters). (#17727) Summary of the issue: For Chinese, the characterDescriptions.dic file has been updated to refine existing descriptions and add more entries for ancient characters and tongjiazi (phonetic loan characters). Description of user facing changes The Chinese character description has been updated to provide more Chinese character descriptions. Description of development approach The characterDescriptions.dic file has been updated to refine existing descriptions and add more entries for ancient characters and tongjiazi (phonetic loan characters).
The SAPI4 synth driver fails to load some voices, because the voices do not support certain parameters, or because the voices do not expect the client to create multiple instances of ITTSCentral objects (with feature flag TTSFEATURE_SINGLEINSTANCE). The synth driver tries to detect whether a parameter is supported or not when loading the voice. However, removeSetting is checking against the name attribute of each setting, which should now be called id. This can cause errors when loading a voice that does not support all the parameters. Description of user facing changes Some of the SAPI4 voices will no longer fail to load. Description of development approach In removeSetting, if s.name == name is changed to if s.id == name. Before creating a new ITTSCentral object, and when terminate is called, set both _ttsCentral and _ttsAttrs to None to release the previous ITTSCentral object. Ignore the exception thrown from _ttsCentral.UnRegister. Some voices do not handle this well, and the whole ITTSCentral will be released anyway. Some voices keep the pausing state even after resetting, meaning that they will still pause the audio after _ttsCentral.AudioReset and silence the output. A variable _paused is used to track the pausing state, and if it's paused, unpause it before resetting.
Fixes #17705 Fixup of #17651 Summary of the issue: Pr #17651 introduced a feature flag in the general section of the config, but this is not supported yet. Description of user facing changes General settings panel can be reopened after saving. Description of development approach Rename the flag and make it a boolean.
Fixed #17655 Summary of the issue: When there is an error downloading an Add-on that overrides an incompatibility, retrying the download will encounter an error. The reason for this is that the exception thrown when overriding incompatibilities is not handled for duplicates. Description of user facing changes The download can now be retried to override the incompatible Add-on. No changelog is required for this PR as the Retry Download Add-on was introduced in 2025.1. Description of development approach Determine if an incompatibility has been overridden before overriding it.
This PR makes the built-in SAPI4 synthesizer use WASAPI to output audio, so that old code related to WinMM can be removed entirely. Description of user facing changes SAPI4 voices should work as usual. Features supported by WavePlayer, such as audio ducking, leading silence trimming, and keeping audio device awake (#17571) will be able to work with SAPI4 voices. Description of development approach Create a class to implement IAudio and IAudioDest, so that it can be used as an audio output destination to replace the SAPI4 built-in MMAudioDest which uses WinMM. SAPI4 performs audio data output on the main thread. SAPI4 expects audio data writes to be a non-blocking operation, and it should return AUDERR_NOTENOUGHDATA when the buffer is full. Unfortunately, that's not how WavePlayer works, and WavePlayer.feed blocks the current thread until there's enough space in the buffer. So a dedicated thread is created to feed data to WavePlayer, and audio data from SAPI4 will be put in a queue first to prevent blocking the thread. Bookmarks from SAPI4 will be put in the same queue. WavePlayer.feed returns before the audio is finished playing, but WavePlayer can only check and invoke callback functions when WavePlayer.feed or WavePlayer.sync is called. If we just keep on waiting for the next audio chunk in the queue, WavePlayer will have no chance to call the callback functions when there is no chunk. So WavePlayer.feed should be called periodically, regardless of whether there's audio or bookmark in the queue.
…on result (#17715) Summary of the issue: Even if not using the automatic refresh of the content recognition, the user may want to update the recognized content once manually. Today, they needs to close the recog result and perform a recognition again. Description of user facing changes In a result of content recognition, the user can now press NVDA+f5 to refresh the result of recognized content. This refresh gesture is the same as the one to refresh the content of virtual buffers. Description of development approach In RefreshableRecogResultNVDAObject, added a script to refresh the recognition result. If automatic recognition is enabled, the script reports an error message.
… OCR result (#17740) Discussed in #15331 (review) and following Summary of the issue: Most options in the UI have an associated toggle script (assigned or unassigned). In Windows OCR settings, "Periodically refresh recognized content" has no such toggle script. Description of user facing changes An unassigned command has been added to toggle the value of "Periodically refresh recognized content". In an OCR result, using this script takes immediately effect. Description of development approach Use the toggle helper fonction defined for global commands. If the final state is enabled, schedule a new recognition If the final state is disabled, nothing more needs to be done, the next recognition will not schedule subsequent ones.
…17724) Summary of the issue: NVDA raises the following error when the highlighter is on in a PowerPoint slide show Error running handler <bound method NVDAHighlighter.handleBrowseModeMove of <visionEnhancementProviders.NVDAHighlighter.NVDAHighlighter object at 0x088D25D0>> for <extensionPoints.Action object at 0x0640C350> Traceback (most recent call last): File "extensionPoints\__init__.pyc", line 56, in notify File "extensionPoints\util.pyc", line 216, in callWithSupportedKwargs File "visionEnhancementProviders\NVDAHighlighter.pyc", line 497, in handleBrowseModeMove File "visionEnhancementProviders\NVDAHighlighter.pyc", line 481, in updateContextRect File "vision\util.pyc", line 79, in getContextRect File "vision\util.pyc", line 48, in getCaretRect File "vision\util.pyc", line 94, in getRectFromTextInfo File "baseObject.pyc", line 39, in __get__ File "NVDAObjects\__init__.pyc", line 72, in _get_boundingRects AttributeError: 'ReviewableSlideshowTreeInterceptor' object has no attribute 'hasIrrelevantLocation' Description of user facing changes No longer an error in the log Description of development approach Added an override of boundingRects on SlideShowTreeInterceptorTextInfo
…systems (#17720) Fixes #11366 Summary of the issue: In an Excel sheet, when comments or formulas are located in non-contiguous cells (i.e. most of the time), listing them in the elements dialog (NVDA+f7) fails on some non-English systems. It's because the range containing the addresses of the cells of interest are retrieved in native (English) format whereas the call to application.range in cpp code expects a locale aware version of the range's address to retrieve the cells content. The two formats differ one from another because they do not use the same list separator: "," in English / ";" in some other languages such as French (where "," is already the decimal separator). Description of user facing changes Excel will no longer fail to list formulas/comments in its elements dialog on some non-English systems for non-contiguous cells. Description of development approach In a first attempt, I added one extra loop to retrieve the content for each area separately; however, calling NVDA helper many times may lead to numerous cross-process calls causing delays. Finally, (thanks to @michaelDCurran), I have converted the native (English) address range before passing it to NVDA helper which calls application.range().
Summary of the issue: NVDA's coding standards are light on details regarding exactly where certain things should be documented. They also contain no information on acceptable use of language. Description of user facing changes The coding standards have been updated to: Clarify that Python class constructors should be documented in the class's __init__, not in the class's docstring; Clarify that Python class attributes should be documented immediately below where they're first declared/defined, not in the class's docstring; Add a statement on types of language that should be avoided in new code submissions, with examples and alternatives. Description of development approach Docstrings: Looked at our current approach. Language usage: The following resources were consulted: https://it.uw.edu/guides/identity-diversity-inclusion/inclusive-language-guide/ https://blogs.cisco.com/developer/inclusivelanguage01 https://www.aswf.io/blog/inclusive-language/ https://betterprogramming.pub/inclusive-code-struction-a-how-to-guide-51dc95867e05
Fixes #17755. Fixes #17756. Summary of the issue: Some SAPI4 voices fail to load with 'NoneType' object has no attribute 'setVolume'. Some SAPI4 voices such as TruVoice stopped producing sound, with no error sound or log generated. Some SAPI4 voices work, but cause errors to be logged continuously. Description of user facing changes The issues mentioned above should be fixed. Description of development approach Check if self._player is None before setting the volume level in IAudio_LevelSet, as some voices call LevelSet before calling Claim to initialize the audio device. Made IAudioDest_FreeSpace return a bigger buffer free space. Although the "free space" is actually unlimited and a fixed size of 200ms was used, 200ms is too small for some voices to send the first audio chunk, and therefore the voice will wait indefinitely for the free space to grow, which never happens. So the free space is now changed to be 2 seconds long, the minimum requirement in SAPI4 documentation. Failure HRESULT codes returned from _self.notifySink should be ignored, according to the SAPI4 documentation. Those are now ignored so that no errors will be logged.
Fix-up of #17720 Summary of the issue: #17720 fixed Excel element list dialog on non-English system, using the local list separator to request a range. Though, the way it was implemented could fail in case the Excel file or sheet names also contained a comma. Description of user facing changes Listing comments or formulas in Excel no longer fails when the name of the file or the sheet contains a comma. Description of development approach Split the range string on the last "!" character to isolate the cells range from the file/sheet names. Replace the separator only in the cells range part. Testing strategy:
Summary of the issue: LibLouis 3.33.0 was released. Description of how this pull request fixes the issue: Update submodule and add new tables Testing strategy: Tested that NVDA starts and new tables are displayed
#17747. Does not fix it completely, but makes it better. Summary of the issue: When audio ducking is set to always duck, starting Magnifier overrides the audio ducking behavior, until the user changes the NVDA setting again. Description of user facing changes NVDA will now change the audio ducking behavior back to "always duck" each time a new utterance is started. Although Magnifier can still cancel audio ducking when it's started, NVDA will fix this next time it starts an utterance. Description of development approach Made _setDuckingState(True) always executed regardless of the current ref count.
Summary of the issue: eSpeak-ng was listed separately to other components in 2025.1's what's new. Description of how this pull request fixes the issue: Unify with other "component updates".
This is the follow-up to #17727 Summary of the issue: Fixed some entries that caused parsing error. Deleted duplicate entries Description of user facing changes No parsing error.
Follow up of #17011 Slightly related to #17635, as this oversight was found there Summary of the issue: In #17011, `braille.filter_displaySize` was deprecated, but there was not yet a mechanism in place that logs warnings about usage of the deprecated extension point. Description of user facing changes Warnings in the log when `braille.filter_displaySize.register` is called. Description of development approach 1. Added an optional keyword argument `_deprecationmessage` to `HandlerRegistrar`. If set, it will be logged when a handler is registered. 2. Removed remaining handlers in core, changed them into handlers for `filter_displayDimensions` 3. Unit test expansion, missing tests for `filter_displayDimensions` Testing strategy: Tested that a warning is logged when registering Known issues with pull request: None known
Related to #17301 Summary of the issue: NVDA has no type checking for python. Python is a dynamically typed language meaning typing issues can occur at runtime. Static analysers like `mypy` or `pyright` can be used to avoid typing errors. Description of user facing changes None Description of development approach `pyright` was chosen over `mypy` for performance reasons. Additionally, pyright has better pre-commit integration, and is built-in to VS Code, which is used by most NVDA developers. We are far from compliant with static type checking, so most rules are currently disabled. The intention is to fix compliance and turn on rules over time. Various trivial typing fixes have occurred, particularly: - removing unnecessary casts - fixing type hints - adding relevant type ignore comments - removing redundant type ignore comments - adding type stubs for `gettext` builtins and `_buildVersion` generated build vars - remove duplicate imports - adding `__all__` to mark export for private classes - adding missing `match` cases Testing strategy: - [x] Smoke test NVDA - [x] pyright passing - [x] Automated testing passes Known issues with pull request: We are far from compliant with static type checking, so most rules are currently disabled. The intention is to fix compliance and turn on rules over time.
Summary of the issue: Since #16751, linting has been checked via pre-commit.ci rather than AppVeyor. As a result the lint check in AppVeyor is redundant and adds unnecessary noise and time to the AppVeyor build. Description of user facing changes None Description of development approach Remove linting from AppVeyor. Testing strategy: Automated CI Known issues with pull request: None
Summary of the issue: * We regularly need to create issues to track developer facing changes, but we do not have a good issue template for that. * https://github.com/nvaccess/nvda/issues/new/ no longer uses .github\ISSUE_TEMPLATE.md when we disable blank issues. So we should remove it. * The new issue experience allows types of issues (e.g. bug, feature, task), we should use them for our issue templates Description of user facing changes: None Description of development approach: * Add an issue template for dev changes * Remove redundant blank issue template * add issue types to templates
Summary of the issue: In #17718, I changed the SAPI4 synthesizer code, so that SAPI4 can now use WASAPI WavePlayer for audio output. This was done by creating a custom audio output destination class, and let the SAPI4 engines use the custom destination instead of the built-in `MMAudioDest` to output audio. The engines interact with the audio destination object directly, and each engine may have its own way to use the audio destination object. So while the current implementation works with some of the SAPI4 engines, it may not work well with some other engines. As different engines have different behaviors, it may be impossible to replicate the same issue with another voice. It would be better if I can get access to the exact same voice and study its behavior. But many of those voices are commercial products, which require purchasing and activating, so I cannot easily get the voices. The second option is to get the log file from the user and study the logs. While I am using logs to debug on my side, the logs may be too chatty for regular users, because every audio chunk would be logged, so I decided to leave the logging part out. But now I find it difficult to diagnose SAPI4-related problems without logs when I can't get access to the voice. Description of user facing changes When the debug log category `synthDriver` in the advanced settings page is enabled, additional verbose SAPI4 logs will be enabled, which includes most of the interactions between the SAPI4 engine and the custom audio destination object, including every audio data write. This can log many lines when using SAPI4 voices, so it's recommended to keep the log disabled when not necessary. Description of development approach Added logging in the SAPI4 module, which can be enabled or disabled by the `synthDriver` debug log category. Testing strategy: Tested manually.
christopherpross First-time contributor christopherpross commented on Oct 20, 2024 • Link to issue number: Fixes #17205 Summary of the issue: Users could configure an invalid update mirror URL, which would only be discovered when attempting to check for updates. This PR implements a validation mechanism that ensures the specified update mirror is valid before allowing it to be set in the settings. Description of user facing changes A new validation process has been added when setting an update mirror URL in NVDA's settings. Users will now receive feedback if the URL they provide is not a valid update mirror. The "Test" button in the settings will now ensure that the mirror responds with the expected format, preventing invalid configurations. Description of development approach Refactored parsing logic for update responses into a new function: parseUpdateCheckResponse. Defined the minimum schema for an update mirror response based on the following required keys: version launcherUrl apiVersion Implemented a new function _isResponseUpdateMirrorValid in settingsDialogs.py, which calls parseUpdateCheckResponse to validate the mirror's response. Added _isResponseUpdateMirrorValid as the responseValidator in the _SetURLDialog for update mirrors.
#4390 - The initial request for "NVDA Remote functionality Summary of the issue: This PR integrates NVDA Remote functionality into core with significant architectural improvements and modernization. While maintaining protocol compatibility with the existing add-on, it introduces cleaner architecture, type safety, proper event handling, and improved maintainability. Description of user facing changes Adds a new "Remote" submenu under NVDA's Tools menu with options to: Connect to another computer Disconnect from remote session Mute remote speech Push clipboard content Copy connection link Send Ctrl+Alt+Del New remote settings panel in NVDA Settings dialog with options for: Auto-connect on startup Host/client configuration Connection type (control/be controlled) Server address and port settings Connection key management Audio feedback preferences New keyboard shortcuts for remote control (note these are defaults and can all be changed): F11 to toggle between local and remote control NVDA+Alt+C to push clipboard NVDA+Alt+PageDown to disconnect NVDA+Alt+M to toggle remote mute Audio cues and visual feedback for connection events Comprehensive user documentation added to NVDA User Guide Description of development approach The implementation follows a modular architecture: Core Components: Remote client with session management Secure transport layer using SSL/TLS Protocol serialization for message passing Relay server infrastructure for connection brokering Integration Points: Hooks into NVDA's speech, braille and input subsystems UI integration via wx menu items and dialog boxes Extension point handling for event propagation Secure desktop support for UAC dialogs Added remaining extension points Security Considerations: SSL certificate validation and fingerprint verification Channel-based authentication The code has been ported from the nvdaremote/nvdaremote repository and significantly improved from the version most-recently deployed. Testing strategy:
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
See Commits and Changes for more details.
Created by
pull[bot]
Can you help keep this open source service alive? 💖 Please sponsor : )