Date   
Re: Missing link for Downloading Add-on Template on NVDA Add-on Development Guide

 

Hi,

Oops, my fault. I’ll provide the template zip file before end of this week.

Cheers,

Joseph

 

From: nvda-devel@groups.io <nvda-devel@groups.io> On Behalf Of agrawal.vishesh.178@...
Sent: Monday, April 1, 2019 12:32 PM
To: nvda-devel@groups.io
Subject: [nvda-devel] Missing link for Downloading Add-on Template on NVDA Add-on Development Guide

 

Hi,

Under the System Requirements Heading (here) on the 7th Bullet Point for The NVDA Community Add-on template it says 

(optional; [click here][3] to download the add-on template)

without any link to the actual download. I was unsure if this is an issue I am supposed to open on GitHub, so I just posted it here.

Cheers,

Vishesh

Visual Studio IntelliSense: progress update, some additional thoughts posted in GitHub

 

Hi all, especially Visual Studio users,

 

After talking to Microsoft engineers, I decided to tackle the following problem in hopes of providing guidance for anyone wishing to resolve it:

https://github.com/nvaccess/nvda/issues/8336

 

Preliminary results indicate that tracking UIA item status event might be a viable way to resolving this problem (NVDA 2019.1 and later). The remaining issue is suppressing code editor text output while browsing intelliSense suggestions.

 

Also, I added a note about how to deal with UIA events in that issue in hopes that some of you might find it useful. Basically, if you want to find out which UIA event NVDA is meeting throughout its run, install Windows 10 App Essentials add-on (Windows 10 Version 1803 and later), restart NVDA with debug logging enabled, and see what the log viewer says (this is sort of my first go to tool when I need to troubleshoot an issue with features in Windows insider Preview builds; in fact, modern keyboard support (including support for emoji panel) was possible thanks in part to this method).

 

Cheers,

Joseph

Re: Problem with fast browse mode - multiple NVDAObjects are created

Tony Malykh
 

Hello Michael,

Did you see my previous emails?

--Tony

On 3/25/2019 3:12 PM, Tony Malykh via Groups.Io wrote:
Hello Michael,

I was wondering if I could have any assistance with this issue? I was under impression that you offered to help me with debugging fast browse mode PR... I haven't heard from you for more than two weeks, so should I keep waiting? Or did I misunderstand you and I'm own my own with this PR?

Thanks

--Tony

On 3/20/2019 9:20 AM, Tony Malykh via Groups.Io wrote:
Moving this thread to new mailing list.

[BCC old mailing list]


--Tony

On 3/9/2019 2:49 PM, Tony Malykh wrote:
Hello NVDA devs and especially Michael,

I am trying to work on fast browse mode PR (a.k.a. focus follows browse mode off).
Just a quick recap: In v1 of this PR there were some  bugs related to the fact that some logic was asynchronous and it relied on gainFocus event being received from the operating system. However in some cases for unknown reason operating system wouldn't send this event, causing bugs that are hard to deal with, such as inability to activate form elements on web pages.
I am now working on v2:
https://github.com/nvaccess/nvda/pull/9360
The code is by no means ready to be reviewed, but it's just for the reference.
The main change in v2 is replacing asynchronous logic with synchronous logic there, and in general it works, but there is one new bugI'm facing that I would like to discuss and maybe ask for some help.

Basic description of the bug:
When unchecking a checkbox on a web page, its new state is not being announced. The bug only reproduces for unchecking - that is checking previously blank checkbox works as expected.
Here are the concrete steps to reproduce the bug.
1. Enter Fast browse mode by pressing NVDA+num row 8.
2. In Chrome or Firefox navigate to https://www.ironspider.ca/forms/checkradio.htm
3. Check the first 3 checkboxes on the page
4. Go back to the first check box
5. Press space to uncheck it. The check box will be successfully unchecked, but the new state will not be announced immediately.

I spent some time debugging this , and here are my findings so far.
Announcing state change works like this. First speech.speakObject(obj,controlTypes.REASON_ONLYCACHE) is called to cache the previous state. In traditional browse mode this function is called when user navigates to that checkbox, and therefore system focus is switched to that checkbox as well. This happens in BrowseModeDocumentTreeInterceptor.event_gainFocus.
Then, assuming that user presses space bar on a checkbox, BrowseModeTreeInterceptor._activatePosition is triggered, which activates this checkbox. Shortly, in response to that we receive a state changed event, that is processed in NVDAObject.event_stateChange(), which in turn calls speech.speakObjectProperties(self,states=True, reason=controlTypes.REASON_CHANGE).
So we make two calls to speech module: the first one to cache object properties, the second one to speak whatever properties have changed. Cached properties are stored inside NVDAObject, so it is very important that the same object is passed to both these calls.

Now back to fast browse mode v2. Since we don't update system focus on every browse mode focus change, we need to update system focus right before activating the checkbox. This is accomplished in BrowseModeTreeInterceptor.maybeSyncFocus(). And in the same function, right after I call obj.setFocus(), I also call speech.speakObject(obj,controlTypes.REASON_ONLYCACHE).
However, here is the problem. When we receive state changed event, the function NVDAObject.event_stateChange is called on a different NVDA object instance. So we completely miss the cached state.
When I say a different NVDAObject instance, I only mean a different python object. So there are apparently (at least) two NVDAObjects, I'll call them NVDAObject1 and NVDAObject2. Both represent the same checkbox in the browser, both have the same IA2UniqueID and windowHandle. Yet in the first call (cacheonly) I see NVDAObject1, and the state changed event comes in with NVDAObject2.
To illustrate this, here is the example from my logs (slightly formatted):
cacheonly from maybeSyncFocus():
    <NVDAObjects.IAccessible.mozilla.Mozilla object at 0x07A6A370>
    uniqueID = (67548, -33555216)
speakObject on stateChanged
    <NVDAObjects.IAccessible.mozilla.Mozilla object at 0x07A6A1F0>
    uniqueID = (67548L, -33555216)

So the big question I have is why there are two separate NVDAObjects created for the same checkbox in my scenario? And why they are not created Without my PR? What is logic behind creating new NVDA Objects? I did some cursory debugging of that and I saw that most of NVDAObjects are created using function getNVDAObjectFromEvent() defined in IAccessible2\__init__.py, and there doesn't seem to be any caching logic there.
It seems there are two potential approaches of tackling this issue.
1. We need to figure out why two separate NVDA objects are created.
2. Potentially another approach is to allow creating multiple python NVDAObjects for the same Checkbox (or any other real IAccessible2 object), and have a properties cache that would take this into account. Some kind of weakKeyDictionary might work. Property caching logic in speech.py might have to be redesigned though.

And also another thing worth noticing in the logs that I pasted above. UniqueID is a tuple of WindowHandle and IA2UniqueID . If you looked at both entries carefully, you would notice that WindowHandle is slightly different: even though the value is the same, in the first entry it is int, and in the second entry it is long. This looks very suspicious to me. Do you think this might be the reason why two copies of NVDAObjects are created? On the other hand it doesn't explain why two objects are not created in stock NVDA.

Anyway, this is current state of my second attempt to implement fast browse mode. Any suggestions will be appreciated!
Best
--Tony

Re: skype 7 support broken in latest master

 

Wait, is Skype 7 still supported? I thought an update to Skype 8 was enforced for everyone?

On 1-4-2019 10:37, enes sarıbaş wrote:
Update: this appears to affect uwp as well.

On 4/1/2019 9:25 AM, enes sarıbaş wrote:
Hi all,

There are reports of  skype 7 support being broken by the commits done on friday. Notifications are not read automatically any longer. This might have to due with removal of skype app modjule in 8846.




Re: skype 7 support broken in latest master

enes sarıbaş
 

Hi,

If you auto signin you can still use it.


On 4/1/2019 1:51 PM, Leonard de Ruijter wrote:

Wait, is Skype 7 still supported? I thought an update to Skype 8 was enforced for everyone?

On 1-4-2019 10:37, enes sarıbaş wrote:
Update: this appears to affect uwp as well.

On 4/1/2019 9:25 AM, enes sarıbaş wrote:
Hi all,

There are reports of  skype 7 support being broken by the commits done on friday. Notifications are not read automatically any longer. This might have to due with removal of skype app modjule in 8846.




Re: Missing link for Downloading Add-on Template on NVDA Add-on Development Guide

Vishesh Agrawal <agrawal.vishesh.178@...>
 

Found another small problem under "Input and output: scripts and UI messages" in Example 2

def script_sayHello(self, gesture):
    ui.message"Hello!")

ui.message is missing an opening parenthesis.
 
Cheers,
Vishesh

Re: Missing link for Downloading Add-on Template on NVDA Add-on Development Guide

 

Hi,

Oops, will correct this mistake in just a moment.

Cheers,

Joseph

 

From: nvda-devel@groups.io <nvda-devel@groups.io> On Behalf Of Vishesh Agrawal
Sent: Wednesday, April 3, 2019 11:11 AM
To: nvda-devel@groups.io
Subject: Re: [nvda-devel] Missing link for Downloading Add-on Template on NVDA Add-on Development Guide

 

Found another small problem under "Input and output: scripts and UI messages" in Example 2

def script_sayHello(self, gesture):
    ui.message"Hello!")

 

ui.message is missing an opening parenthesis.

 

Cheers,

Vishesh

The following error occurred when compiling NVDA locally using visual studio 2019

 

hello
The following error occurs when compiling NVDA locally using visual studio 2019 The following is the log:
C:\Users\dpy\source\repos\nvda>scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... cl /Fobuild\x86\remote\gdiHooks.obj /c build \x86\remote\gdiHooks.cpp /TP /EHsc /nologo /W3 /WX /Od /MT /DUNICODE /D_CRT_SECURE_NO_DEPRECATE /DLOGLEVEL=15 /D _WIN32_WINNT=_WIN32_WINNT_WIN7 /DNDEBUG /Iinclude /Imiscdeps\include /Ibuild\x86 /Z7 gdiHooks .cpp C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(36): error C2039: "wstring": Not a member of "std" C:\Program Files (x86)\ Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\deque(19): note: See the statement for "std" C:\Users\dpy\source\repos\nvda\build\x86\ Remote\displayModel.h(36): error C3646: "text": Unknown rewrite specifier C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(36): error C4430: Missing type specifier - assumed to be int. Note: C++ does not support the default int C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(51): error C2039: "wstring": Not a member of "std" C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\deque(19): note: See the statement for "std" C:\Users\dpy\source\repos\nvda \build\x86\remote\displayModel.h(51): error C2061: Syntax error: Identifier "wstring" C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(98) : error C2039: "wstring": Not a member of "std" C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\deque(19): note: See "std" for the statement C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(98): error C4430: Missing type specifier - assumed to be int. Note: C++ does not support the default int C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(98): error C2143: Syntax error: Missing "," (in front of "&" C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(139): error C2039: "wstring": Not a member of "std" C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\deque(19): note: See the statement for "std" C:\Users\dpy\source\repos\nvda\build\x86\remote \displayModel.h(139): error C2061: Syntax error: Identifier "wstring" C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(148): error C2039: "wstring ": Not a member of "std" C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\deque(19): note: See the statement for "std" C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(148): error C2061: Syntax error: Identifier "wstring" build\x86\remote\gdiHooks.cpp(502): Error C2661: "displayModel_t::insertChunk : Not override function accepts seven parameters scons: *** [build \ x86 \ remote \ gdiHooks.obj] Error 2 scons: building terminated because of errors.
Reproduce steps:
Upgrade visual studio to 2019 16.0.0
Then compile NVDA with scons and the above error occurs.
thank

Re: The following error occurred when compiling NVDA locally using visual studio 2019

Brian's Mail list account
 

Not my end of the ship but has this got anything to do with your issue?
[nvaccess/nvda] SCons and Visual Studio 2019 (#9446)

Brian
bglists@...
Sent via blueyonder.
Please address personal E-mail to:-
briang1@..., putting 'Brian Gaff'
in the display name field.

----- Original Message -----
From: "dingpengyu" <@dingpengyu>
To: <nvda-devel@groups.io>
Sent: Thursday, April 04, 2019 10:07 AM
Subject: [nvda-devel] The following error occurred when compiling NVDA locally using visual studio 2019


hello
The following error occurs when compiling NVDA locally using visual studio 2019 The following is the log:
C:\Users\dpy\source\repos\nvda>scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... cl /Fobuild\x86\remote\gdiHooks.obj /c build \x86\remote\gdiHooks.cpp /TP /EHsc /nologo /W3 /WX /Od /MT /DUNICODE /D_CRT_SECURE_NO_DEPRECATE /DLOGLEVEL=15 /D _WIN32_WINNT=_WIN32_WINNT_WIN7 /DNDEBUG /Iinclude /Imiscdeps\include /Ibuild\x86 /Z7 gdiHooks .cpp C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(36): error C2039: "wstring": Not a member of "std" C:\Program Files (x86)\ Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\deque(19): note: See the statement for "std" C:\Users\dpy\source\repos\nvda\build\x86\ Remote\displayModel.h(36): error C3646: "text": Unknown rewrite specifier C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(36): error C4430: Missing type specifier - assumed to be int. Note: C++ does not support the default int C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(51): error C2039: "wstring": Not a member of "std" C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\deque(19): note: See the statement for "std" C:\Users\dpy\source\repos\nvda \build\x86\remote\displayModel.h(51): error C2061: Syntax error: Identifier "wstring" C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(98) : error C2039: "wstring": Not a member of "std" C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\deque(19): note: See "std" for the statement C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(98): error C4430: Missing type specifier - assumed to be int. Note: C++ does not support the default int C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(98): error C2143: Syntax error: Missing "," (in front of "&" C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(139): error C2039: "wstring": Not a member of "std" C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\deque(19): note: See the statement for "std" C:\Users\dpy\source\repos\nvda\build\x86\remote \displayModel.h(139): error C2061: Syntax error: Identifier "wstring" C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(148): error C2039: "wstring ": Not a member of "std" C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.20.27508\include\deque(19): note: See the statement for "std" C:\Users\dpy\source\repos\nvda\build\x86\remote\displayModel.h(148): error C2061: Syntax error: Identifier "wstring" build\x86\remote\gdiHooks.cpp(502): Error C2661: "displayModel_t::insertChunk : Not override function accepts seven parameters scons: *** [build \ x86 \ remote \ gdiHooks.obj] Error 2 scons: building terminated because of errors.
Reproduce steps:
Upgrade visual studio to 2019 16.0.0
Then compile NVDA with scons and the above error occurs.
thank

Word locking up on some files

Brian's Mail list account
 

Hi, just in case its important, Here is the log when the copy of word had problems and stopped speaking. Note Jarte and email were also open and still working with nvda, so it could be the file itself which was at fault.

IO - inputCore.InputManager.executeGesture (15:44:24.069):
Input: kb(desktop):upArrow
IO - inputCore.InputManager.executeGesture (15:44:25.292):
Input: kb(desktop):downArrow
IO - inputCore.InputManager.executeGesture (15:44:25.957):
Input: kb(desktop):upArrow
IO - inputCore.InputManager.executeGesture (15:44:26.316):
Input: kb(desktop):downArrow
IO - inputCore.InputManager.executeGesture (15:44:26.637):
Input: kb(desktop):upArrow
IO - inputCore.InputManager.executeGesture (15:44:27.132):
Input: kb(desktop):downArrow
IO - inputCore.InputManager.executeGesture (15:44:27.476):
Input: kb(desktop):upArrow
DEBUGWARNING - RPC process 1808 (dwm.exe) (15:44:28.430):
Thread 4372, build\x86_64\remote\injection.cpp, inproc_winEventCallback, 66:
SetWindowsHookEx with WH_GETMESSAGE failed, GetLastError returned 5

DEBUGWARNING - RPC process 1808 (dwm.exe) (15:44:28.431):
Thread 4372, build\x86_64\remote\injection.cpp, inproc_winEventCallback, 69:
SetWindowsHookEx with WH_CALLWNDPROC failed, GetLastError returned 5

IO - inputCore.InputManager.executeGesture (15:44:28.572):
Input: kb(desktop):tab
DEBUGWARNING - watchdog._watcher (15:44:28.793):
Trying to recover from freeze, core stack:
File "nvda.pyw", line 231, in <module>
File "core.pyc", line 519, in main
File "wx\core.pyc", line 2134, in MainLoop
File "gui\__init__.pyc", line 1003, in Notify
File "core.pyc", line 489, in run
File "IAccessibleHandler.pyc", line 897, in pumpAll
File "IAccessibleHandler.pyc", line 620, in processGenericWinEvent
File "IAccessibleHandler.pyc", line 532, in winEventToNVDAEvent
File "NVDAObjects\IAccessible\__init__.pyc", line 46, in getNVDAObjectFromEvent
File "NVDAObjects\__init__.pyc", line 85, in __call__
File "NVDAObjects\IAccessible\__init__.pyc", line 507, in findOverlayClasses
File "NVDAObjects\IAccessible\msOffice.pyc", line 108, in appliesTo
File "baseObject.pyc", line 47, in __get__
File "baseObject.pyc", line 147, in _getPropertyViaCache
File "NVDAObjects\IAccessible\__init__.pyc", line 921, in _get_childCount

DEBUGWARNING - core.CorePump.run (15:44:28.795):
errors in this core pump cycle
Traceback (most recent call last):
File "core.pyc", line 489, in run
File "IAccessibleHandler.pyc", line 897, in pumpAll
File "IAccessibleHandler.pyc", line 620, in processGenericWinEvent
File "IAccessibleHandler.pyc", line 532, in winEventToNVDAEvent
File "NVDAObjects\IAccessible\__init__.pyc", line 46, in getNVDAObjectFromEvent
File "NVDAObjects\__init__.pyc", line 85, in __call__
File "NVDAObjects\IAccessible\__init__.pyc", line 507, in findOverlayClasses
File "NVDAObjects\IAccessible\msOffice.pyc", line 108, in appliesTo
File "baseObject.pyc", line 47, in __get__
File "baseObject.pyc", line 147, in _getPropertyViaCache
File "watchdog.pyc", line 202, in _COMError_init
CallCancelled
IO - inputCore.InputManager.executeGesture (15:44:29.252):
Input: kb(desktop):downArrow
IO - inputCore.InputManager.executeGesture (15:44:29.551):
Input: kb(desktop):upArrow
IO - inputCore.InputManager.executeGesture (15:44:32.227):
Input: kb(desktop):windows+m
IO - speech.speak (15:44:33.124):
Speaking [LangChangeCommand ('en_GB'), u'Desktop list']
IO - speech.speak (15:44:33.138):
Speaking [LangChangeCommand ('en_GB'), u'Jarte 14 of 74']
IO - speech.speak (15:44:33.148):
Speaking [LangChangeCommand ('en_GB'), u'Jarte 14 of 74']
IO - inputCore.InputManager.executeGesture (15:44:34.292):
Input: kb(desktop):alt+tab
IO - speech.speak (15:44:34.325):
Speaking [LangChangeCommand ('en_GB'), u'Inbox - Outlook Express - Kingston Talking Newspaper icon 1 of 4']
IO - inputCore.InputManager.executeGesture (15:44:36.045):
Input: kb(desktop):alt+tab
IO - speech.speak (15:44:36.108):
Speaking [LangChangeCommand ('en_GB'), u'Jarte (screen reader mode) icon 2 of 4']
IO - inputCore.InputManager.executeGesture (15:44:37.397):
Input: kb(desktop):alt+tab
IO - speech.speak (15:44:37.428):
Speaking [LangChangeCommand ('en_GB'), u'Traffic Bulletin week commencing 8th April 2019 - Unicode (UTF-8) icon 3 of 4']
IO - speech.speak (15:44:38.390):
Speaking [LangChangeCommand ('en_GB'), u'Traffic Bulletin week commencing 8th April 2019 - Unicode (UTF-8)']


Eventually I got it back, but goodness knows whatit was up to.I'll watch this.
Brian
bglists@...
Sent via blueyonder.
Please address personal E-mail to:-
briang1@..., putting 'Brian Gaff'
in the display name field.

How to use text and caret MSAA roles correctly.

Ian Reed
 

I am implementing a custom textbox control using Windows Forms from the .NET Framework.
I see that I can create AccessibilityObjects that contain MSAA values such as Name, Role, Value, and a variety of states like focusable and selected.
These objects can have roles like text or caret, and can have children.
Can you tell me what a basic MSAA DOM should look like for a simple textbox that has a caret and some selected text?

I printed the hierarchy of AccessibilityObjects for a standard windows forms textbox, but it had no children and I did not see an object with the caret role.
I examined an existing Windows Forms textbox in the NVDA log viewer, which said:
DEBUG - editableText.EditableText._hasCaretMoved (06:40:57.660):
Caret move detected using bookmarks. Elapsed: 0 ms

I'm not sure what bookmarks are, but some other reading indicates that screen readers often just look for a blinking cursor to detect the caret. Is that what NVDA does?

How can I use the text and caret roles to get NVDA to understand the caret's current location, and to support selecting text?

Thanks,
Ian Reed

Help with sysListView selection

Alberto Buffolino
 

Hi all,
I'm working on ColumnsReview add-on, but I have a very specific question about sysListView, so nvda-devel could be a good place too...
I'd like to select/unselect programmatically one or more list items, but it seems not so easy indeed. I found this promising page:
http://vbnet.mvps.org/index.html?code/comctl/lvselectall.htm
and so, starting from a list item and opening NVDA console, I wrote:
***
from NVDAObjects.IAccessible.sysListView32 import *
import watchdog
LVM_SETITEMSTATE = (LVM_FIRST + 43)
***
but then I don't know how to proceed exactly. I tried creating an LVITEM instance (class is in sysListView32) with various mask/state/etc parameters, and passing it as 4th arguments of
***
watchdog.cancellableSendMessage(nav.parent.windowHandle, LVM_SETITEMSTATE, -1, LVITEMInstance)
***
but even if I receive no errors, I don't see changes... and I tried and tried various solutions, with LPARAM, and so on, without success.
Do you have any suggestions?
Thanks in advance.
Alberto

Re: How to use text and caret MSAA roles correctly.

Ian Reed
 

I've started playing with UIAutomation as well to see if that will give me better control over how NVDA perceives my controls.
I see that I am able to override some behavior, but that NVDA still detects either the underlying windows forms control or MSAA object, and uses things like the role and display text from them instead of the Value or ControlType I set in UIAutomation.

Is UIAutomation a better option than MSAA to give me more fine grained control over how NVDA perceives my controls?
Is there a simple way to get NVDA to prefer what I set in UIAutomation instead of using the window class or MSAA object?
Is there documentation I can read that outlines the best ways to communicate with NVDA through an accessibility model and how it decides what information to prefer?

Thanks.

On 4/5/2019 7:34 AM, Ian Reed via Groups.Io wrote:
I am implementing a custom textbox control using Windows Forms from the .NET Framework.
I see that I can create AccessibilityObjects that contain MSAA values such as Name, Role, Value, and a variety of states like focusable and selected.
These objects can have roles like text or caret, and can have children.
Can you tell me what a basic MSAA DOM should look like for a simple textbox that has a caret and some selected text?

I printed the hierarchy of AccessibilityObjects for a standard windows forms textbox, but it had no children and I did not see an object with the caret role.
I examined an existing Windows Forms textbox in the NVDA log viewer, which said:
DEBUG - editableText.EditableText._hasCaretMoved (06:40:57.660):
Caret move detected using bookmarks. Elapsed: 0 ms

I'm not sure what bookmarks are, but some other reading indicates that screen readers often just look for a blinking cursor to detect the caret. Is that what NVDA does?

How can I use the text and caret roles to get NVDA to understand the caret's current location, and to support selecting text?

Thanks,
Ian Reed


Re: Help with sysListView selection

Abdel
 

Hi Alberto,

You wrote:

I tried creating an LVITEM instance (class is in sysListView32) with various mask/state/etc parameters, and passing it as 4th arguments of watchdog.cancellableSendMessage.

In fact, the fourth parameter of watchdog.cancellableSendMessage, or the second parameter of the LVM_SETITEMSTATE message, is not an instance of the LVITEM structure, but a pointer to this instance.

Here is an example for selecting all items that works here on the desktop, under a Windows-10.

It is imperative that the type of your list view is as follows:

class 'NVDAObjects.IAccessible.sysListView32.List'

For example, you can put your nav object on the first parent of the desktop window or use focus.parent.windowHandle in your console.

Once on your desktop, you open the Python console with NVDA + Control + Z.

This done, you write the following:

from NVDAObjects.IAccessible.sysListView32 import *
from watchdog import cancellableSendMessage
from ctypes import byref
# Instantiation of the LVITEM object.
lvItem = LVITEM (mask=LVIF_STATE, state=LVIS_SELECTED, stateMask=LVIS_SELECTED)
# You must then pass this instantiation as a pointer, using byref, to the cancellableSendMessage function.
cancellableSendMessage (nav.windowHandle, LVM_SETITEMSTATE, -1, byref(lvItem))

For unselecting all items you juste have to assign LVIF_STATE to the mask member and LVIS_SELECTED to stateMask as described here:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/45b14a4b-6ee8-42c4-9d94-912008931552/deselect-all-items-in-listview-c?forum=vcgeneral

However, I find that it does not always work, so it's not really reliable.

You will find a detailed description of the members of the LVITEM structure on Microsoft Doc:

https://docs.microsoft.com/en-us/windows/desktop/api/commctrl/ns-commctrl-taglvitema

Hope this helps.

Kind regards,
Abdel.


Le 05/04/2019 à 19:27, Alberto Buffolino a écrit :
Hi all,
I'm working on ColumnsReview add-on, but I have a very specific question about sysListView, so nvda-devel could be a good place too...
I'd like to select/unselect programmatically one or more list items, but it seems not so easy indeed. I found this promising page:
http://vbnet.mvps.org/index.html?code/comctl/lvselectall.htm
and so, starting from a list item and opening NVDA console, I wrote:
***
from NVDAObjects.IAccessible.sysListView32 import *
import watchdog
LVM_SETITEMSTATE = (LVM_FIRST + 43)
***
but then I don't know how to proceed exactly. I tried creating an LVITEM instance (class is in sysListView32) with various mask/state/etc parameters, and passing it as 4th arguments of
***
watchdog.cancellableSendMessage(nav.parent.windowHandle, LVM_SETITEMSTATE, -1, LVITEMInstance)
***
but even if I receive no errors, I don't see changes... and I tried and tried various solutions, with LPARAM, and so on, without success.
Do you have any suggestions?
Thanks in advance.
Alberto


Code contributions: an upcoming series of discussion on ins and outs of giving back to the community with code

 

Hi all,

 

Some of you may recall that there is a subgroup of NVDA users list called “devlearning”. After asking on the list, folks over there felt it would be best to combine the lists into one – bringing folks from the devlearning subgroup to this mailing list in the next few months. But before doing so, there is an important series of topics I need to teach: code contributions.

 

In 2019, NV Access was selected as a mentor organization for Google Summer of Code (GSoC), an event where college students studying computer science and related fields can work with an organization to code various features. NV Access has posted a list of code contributions they would like to receive from participants of GSoC 2019, including experimenting with 64-bit NVDA, performance improvements and others.

 

Prior to that, since late 2017, I’ve been teaching NVDA internals to a group of new developers. I discussed how to download and compile NVDA source code, code layout and folder structure, internals of NVDA objects, working with accessibility API’s, input and output and many other things. As a result, at least one person provided pull requests recently based on lessons I taught.

 

Given that one avenue for GSoC participants to meet NV Access and the NVDA community is through this mailing list, coupled with a desire from those who studied with me to come over and join this list, I decided to open up NVDA Internals unit 5 (code contributions) to everyone on both lists. For members of devlearning, it should serve as a last set of lessons before everyone is brought to this mailing list and devlearning group closed. For members of nvda-devel mailing list, a chance to learn from a seasoned NVDA code contributor regarding code contribution and a chance for GSoC students to learn more about what to expect as they work on bringing their dream features to life. For me, it would be a chance to demonstrate my know-how and serving as a teaching experience in teaching a large group of people (already sort of doing that with speech competitions). Of course, because these two lists are geared towards a bit more technically abled, we’ll talk about NVDA internals here and there (see below for an example).

 

The content of this combined course will include:

 

  • A really high-level introduction to NVDA (for benefit of GSoC students)
  • What exactly is code contribution
  • Important terms: pull request, code review
  • Thinking about a dream feature (or a bug fix, for some)
  • Listen, elaborate, plan, explain, write, test (mandatory)
  • Write, write, and write again (mandatory)
  • Tests, tests, and more tests (mandatory)
  • Packaging a dream feature into a branch
  • Pull request basics
  • Code reviews
  • Having willingness to say, “you are right”
  • Yay, my feature is now part of NVDA… or maybe not
  • So now what?

 

At the end of this course, you should be able to:

 

  1. Explain what NVDA is to a new user or a developer.
  2. Define code contribution and related terms.
  3. Explain steps involved in code contribution.
  4. Ready to assist NV Access and the community with contributions (for those planning to do so).

 

For those curious about my statement on NVDA internals, let me give you an example:

 

What is the process involved in choosing overlay classes? In a nutshell, NVDA itself doesn’t know how to deal with overlay classes at first. The only NVDA object classes it knows about are those that come with NVDA – built-in app modules, and most importantly, API classes (UIA, MSAA, etc.).

 

So one day NVDA comes across a curious screen element – say, an unknown UIA slider control. At least NVDA can tell it is a UIA object because it can detect them (not all UIA objects are detected by NVDA, by the way). In an attempt to find out more about this screen element, NVDA will go through the following:

 

  1. Create a class list (clsList) to hold a record of object types it has seen so far.
  2. Ask the app module about this element (calls obj.appModule.chooseNVDAObjectOverlayClasses if defined).
  3. NVDA will then ask a group of shareholders to come forward and explain the object (i.e. loops through global plugins and ask globalPlugin.chooseNVDAObjectOverlayClasses).
  4. If the app module and one or more global plugins provided suitable answers about the object, the class list should be filled with all sorts of entries about what the object is now, helping NVDA “unfog the future” (pardon the pun).
  5. NVDA will now invoke Python to construct a proper method resolution order (MRO) for this object, which is then used to build script lookup order, inheritance, and other information.

 

With this finished, the newly “awakened” overlay NVDA object is ready for use. For a source code explanation, take a look at source/NVDAObjects/__init__.py under dynamic object type.

 

My overall hope is that this course will serve as an eye-opening experience for many of you.

 

Cheers,

Joseph

New contributor

Arnold Loubriat
 

Dear NVDA developers and contributors,
Some of you may already have encountered me on GitHub, I'm Arnold (also known as DataTriny). I'm a 21 years old software developer from France. Since I am currently unemployed, I decided to spare some time on this project (which greatly helps me daily as I am visually impaired).
I started submitting bug reports a long time ago, but I'm now trying to send pull requests. One or two already got merged, others are being reviewed, thanks for all the work!
I know several programming languages, (Python being one of them of course), and web technologies. I am fluent in English so I can pretty much understand all the discussions on GitHub (even with people using translators).
So, if you need someone to try replicating a bug, to do a particular task or whatever regarding this project, feel free to ping me @DataTriny.
Have a nice day, or night!

Arnold

Re: Code contributions: an upcoming series of discussion on ins and outs of giving back to the community with code

Juan Hernandez
 

Hi, how does one join this course?

 

Best,

 

Juan

 

From: nvda-devel@groups.io <nvda-devel@groups.io> On Behalf Of Joseph Lee
Sent: Monday, April 08, 2019 11:00 PM
To: nvda-devel@groups.io
Subject: [nvda-devel] Code contributions: an upcoming series of discussion on ins and outs of giving back to the community with code

 

Hi all,

 

Some of you may recall that there is a subgroup of NVDA users list called “devlearning”. After asking on the list, folks over there felt it would be best to combine the lists into one – bringing folks from the devlearning subgroup to this mailing list in the next few months. But before doing so, there is an important series of topics I need to teach: code contributions.

 

In 2019, NV Access was selected as a mentor organization for Google Summer of Code (GSoC), an event where college students studying computer science and related fields can work with an organization to code various features. NV Access has posted a list of code contributions they would like to receive from participants of GSoC 2019, including experimenting with 64-bit NVDA, performance improvements and others.

 

Prior to that, since late 2017, I’ve been teaching NVDA internals to a group of new developers. I discussed how to download and compile NVDA source code, code layout and folder structure, internals of NVDA objects, working with accessibility API’s, input and output and many other things. As a result, at least one person provided pull requests recently based on lessons I taught.

 

Given that one avenue for GSoC participants to meet NV Access and the NVDA community is through this mailing list, coupled with a desire from those who studied with me to come over and join this list, I decided to open up NVDA Internals unit 5 (code contributions) to everyone on both lists. For members of devlearning, it should serve as a last set of lessons before everyone is brought to this mailing list and devlearning group closed. For members of nvda-devel mailing list, a chance to learn from a seasoned NVDA code contributor regarding code contribution and a chance for GSoC students to learn more about what to expect as they work on bringing their dream features to life. For me, it would be a chance to demonstrate my know-how and serving as a teaching experience in teaching a large group of people (already sort of doing that with speech competitions). Of course, because these two lists are geared towards a bit more technically abled, we’ll talk about NVDA internals here and there (see below for an example).

 

The content of this combined course will include:

 

  • A really high-level introduction to NVDA (for benefit of GSoC students)
  • What exactly is code contribution
  • Important terms: pull request, code review
  • Thinking about a dream feature (or a bug fix, for some)
  • Listen, elaborate, plan, explain, write, test (mandatory)
  • Write, write, and write again (mandatory)
  • Tests, tests, and more tests (mandatory)
  • Packaging a dream feature into a branch
  • Pull request basics
  • Code reviews
  • Having willingness to say, “you are right”
  • Yay, my feature is now part of NVDA… or maybe not
  • So now what?

 

At the end of this course, you should be able to:

 

  1. Explain what NVDA is to a new user or a developer.
  2. Define code contribution and related terms.
  3. Explain steps involved in code contribution.
  4. Ready to assist NV Access and the community with contributions (for those planning to do so).

 

For those curious about my statement on NVDA internals, let me give you an example:

 

What is the process involved in choosing overlay classes? In a nutshell, NVDA itself doesn’t know how to deal with overlay classes at first. The only NVDA object classes it knows about are those that come with NVDA – built-in app modules, and most importantly, API classes (UIA, MSAA, etc.).

 

So one day NVDA comes across a curious screen element – say, an unknown UIA slider control. At least NVDA can tell it is a UIA object because it can detect them (not all UIA objects are detected by NVDA, by the way). In an attempt to find out more about this screen element, NVDA will go through the following:

 

  1. Create a class list (clsList) to hold a record of object types it has seen so far.
  2. Ask the app module about this element (calls obj.appModule.chooseNVDAObjectOverlayClasses if defined).
  3. NVDA will then ask a group of shareholders to come forward and explain the object (i.e. loops through global plugins and ask globalPlugin.chooseNVDAObjectOverlayClasses).
  4. If the app module and one or more global plugins provided suitable answers about the object, the class list should be filled with all sorts of entries about what the object is now, helping NVDA “unfog the future” (pardon the pun).
  5. NVDA will now invoke Python to construct a proper method resolution order (MRO) for this object, which is then used to build script lookup order, inheritance, and other information.

 

With this finished, the newly “awakened” overlay NVDA object is ready for use. For a source code explanation, take a look at source/NVDAObjects/__init__.py under dynamic object type.

 

My overall hope is that this course will serve as an eye-opening experience for many of you.

 

Cheers,

Joseph

Re: Code contributions: an upcoming series of discussion on ins and outs of giving back to the community with code

 

Hi,
There's no separate course - a series of email discussions.
Cheers,
Joseph

----- Original Message -----
From: "Juan Hernandez" <juanhernandez98@...
To: <nvda-devel@groups.io
Date sent: Tue, 9 Apr 2019 09:04:12 -0700
Subject: Re: [nvda-devel] Code contributions: an upcoming series of discussion on ins and outs of giving back to the community with code

Hi, how does one join this course?



Best,



Juan



From: nvda-devel@groups.io <nvda-devel@groups.io> On Behalf Of Joseph Lee
Sent: Monday, April 08, 2019 11:00 PM
To: nvda-devel@groups.io
Subject: [nvda-devel] Code contributions: an upcoming series of discussion
on ins and outs of giving back to the community with code



Hi all,



Some of you may recall that there is a subgroup of NVDA users list called
"devlearning". After asking on the list, folks over there felt it would be
best to combine the lists into one - bringing folks from the devlearning
subgroup to this mailing list in the next few months. But before doing so,
there is an important series of topics I need to teach: code contributions.



In 2019, NV Access was selected as a mentor organization for Google Summer
of Code (GSoC), an event where college students studying computer science
and related fields can work with an organization to code various features.
NV Access has posted a list of code contributions they would like to receive
from participants of GSoC 2019, including experimenting with 64-bit NVDA,
performance improvements and others.



Prior to that, since late 2017, I've been teaching NVDA internals to a group
of new developers. I discussed how to download and compile NVDA source code,
code layout and folder structure, internals of NVDA objects, working with
accessibility API's, input and output and many other things. As a result, at
least one person provided pull requests recently based on lessons I taught.



Given that one avenue for GSoC participants to meet NV Access and the NVDA
community is through this mailing list, coupled with a desire from those who
studied with me to come over and join this list, I decided to open up NVDA
Internals unit 5 (code contributions) to everyone on both lists. For members
of devlearning, it should serve as a last set of lessons before everyone is
brought to this mailing list and devlearning group closed. For members of
nvda-devel mailing list, a chance to learn from a seasoned NVDA code
contributor regarding code contribution and a chance for GSoC students to
learn more about what to expect as they work on bringing their dream
features to life. For me, it would be a chance to demonstrate my know-how
and serving as a teaching experience in teaching a large group of people
(already sort of doing that with speech competitions). Of course, because
these two lists are geared towards a bit more technically abled, we'll talk
about NVDA internals here and there (see below for an example).



The content of this combined course will include:



* A really high-level introduction to NVDA (for benefit of GSoC
students)
* What exactly is code contribution
* Important terms: pull request, code review
* Thinking about a dream feature (or a bug fix, for some)
* Listen, elaborate, plan, explain, write, test (mandatory)
* Write, write, and write again (mandatory)
* Tests, tests, and more tests (mandatory)
* Packaging a dream feature into a branch
* Pull request basics
* Code reviews
* Having willingness to say, "you are right"
* Yay, my feature is now part of NVDA. or maybe not
* So now what?



At the end of this course, you should be able to:



1. Explain what NVDA is to a new user or a developer.
2. Define code contribution and related terms.
3. Explain steps involved in code contribution.
4. Ready to assist NV Access and the community with contributions (for
those planning to do so).



For those curious about my statement on NVDA internals, let me give you an
example:



What is the process involved in choosing overlay classes? In a nutshell,
NVDA itself doesn't know how to deal with overlay classes at first. The only
NVDA object classes it knows about are those that come with NVDA - built-in
app modules, and most importantly, API classes (UIA, MSAA, etc.).



So one day NVDA comes across a curious screen element - say, an unknown UIA
slider control. At least NVDA can tell it is a UIA object because it can
detect them (not all UIA objects are detected by NVDA, by the way). In an
attempt to find out more about this screen element, NVDA will go through the
following:



1. Create a class list (clsList) to hold a record of object types it
has seen so far.
2. Ask the app module about this element (calls
obj.appModule.chooseNVDAObjectOverlayClasses if defined).
3. NVDA will then ask a group of shareholders to come forward and
explain the object (i.e. loops through global plugins and ask
globalPlugin.chooseNVDAObjectOverlayClasses).
4. If the app module and one or more global plugins provided suitable
answers about the object, the class list should be filled with all sorts of
entries about what the object is now, helping NVDA "unfog the future"
(pardon the pun).
5. NVDA will now invoke Python to construct a proper method resolution
order (MRO) for this object, which is then used to build script lookup
order, inheritance, and other information.



With this finished, the newly "awakened" overlay NVDA object is ready for
use. For a source code explanation, take a look at
source/NVDAObjects/__init__.py under dynamic object type.



My overall hope is that this course will serve as an eye-opening experience
for many of you.



Cheers,

Joseph

Re: New contributor

Reef Turner
 

Welcome Arnold!

Thank you for your contributions, looking forward to working with you.

On Wed, 10 Apr 2019 at 03:55, Arnold Loubriat <datatriny@...> wrote:
Dear NVDA developers and contributors,
Some of you may already have encountered me on GitHub, I'm Arnold (also known as DataTriny). I'm a 21 years old software developer from France. Since I am currently unemployed, I decided to spare some time on this project (which greatly helps me daily as I am visually impaired).
I started submitting bug reports a long time ago, but I'm now trying to send pull requests. One or two already got merged, others are being reviewed, thanks for all the work!
I know several programming languages, (Python being one of them of course), and web technologies. I am fluent in English so I can pretty much understand all the discussions on GitHub (even with people using translators).
So, if you need someone to try replicating a bug, to do a particular task or whatever regarding this project, feel free to ping me @DataTriny.
Have a nice day, or night!

Arnold



--
Reef Turner
Software Developer 
 


Re: Problem with fast browse mode - multiple NVDAObjects are created

Reef Turner
 

Hi Tony,

I can't speak for Michael, or the previous conversations that you have had. However, I can point out that this has been a very busy month for us at NV Access. We have had a week at CSUN AT conference (and got over the resulting jetlag), worked hard to get 2019.1 out the door and are pursuing a 2019.1.1 release. Michael and the rest of the team are taking some leave before we get into the work for the next quarter. I'm telling you this just to give some context.

Internal to NV Access, I'm sure you can appreciate that we have our own priorities and quite a busy schedule. The best advice I can give you for getting help on your project, is to try to distil the problem down to it's core, explain it is simply and succinctly as you can. You may find that there are other people on this list who can help.

On Tue, 2 Apr 2019 at 18:15, Tony Malykh <anton.malykh@...> wrote:
Hello Michael,

Did you see my previous emails?

--Tony



On 3/25/2019 3:12 PM, Tony Malykh via Groups.Io wrote:
> Hello Michael,
>
> I was wondering if I could have any assistance with this issue? I was
> under impression that you offered to help me with debugging fast
> browse mode PR... I haven't heard from you for more than two weeks, so
> should I keep waiting? Or did I misunderstand you and I'm own my own
> with this PR?
>
> Thanks
>
> --Tony
>
> On 3/20/2019 9:20 AM, Tony Malykh via Groups.Io wrote:
>> Moving this thread to new mailing list.
>>
>> [BCC old mailing list]
>>
>>
>> --Tony
>>
>> On 3/9/2019 2:49 PM, Tony Malykh wrote:
>>> Hello NVDA devs and especially Michael,
>>>
>>> I am trying to work on fast browse mode PR (a.k.a. focus follows
>>> browse mode off).
>>> Just a quick recap: In v1 of this PR there were some  bugs related
>>> to the fact that some logic was asynchronous and it relied on
>>> gainFocus event being received from the operating system. However in
>>> some cases for unknown reason operating system wouldn't send this
>>> event, causing bugs that are hard to deal with, such as inability to
>>> activate form elements on web pages.
>>> I am now working on v2:
>>> https://github.com/nvaccess/nvda/pull/9360
>>> The code is by no means ready to be reviewed, but it's just for the
>>> reference.
>>> The main change in v2 is replacing asynchronous logic with
>>> synchronous logic there, and in general it works, but there is one
>>> new bugI'm facing that I would like to discuss and maybe ask for
>>> some help.
>>>
>>> Basic description of the bug:
>>> When unchecking a checkbox on a web page, its new state is not being
>>> announced. The bug only reproduces for unchecking - that is checking
>>> previously blank checkbox works as expected.
>>> Here are the concrete steps to reproduce the bug.
>>> 1. Enter Fast browse mode by pressing NVDA+num row 8.
>>> 2. In Chrome or Firefox navigate to
>>> https://www.ironspider.ca/forms/checkradio.htm
>>> 3. Check the first 3 checkboxes on the page
>>> 4. Go back to the first check box
>>> 5. Press space to uncheck it. The check box will be successfully
>>> unchecked, but the new state will not be announced immediately.
>>>
>>> I spent some time debugging this , and here are my findings so far.
>>> Announcing state change works like this. First
>>> speech.speakObject(obj,controlTypes.REASON_ONLYCACHE) is called to
>>> cache the previous state. In traditional browse mode this function
>>> is called when user navigates to that checkbox, and therefore system
>>> focus is switched to that checkbox as well. This happens in
>>> BrowseModeDocumentTreeInterceptor.event_gainFocus.
>>> Then, assuming that user presses space bar on a checkbox,
>>> BrowseModeTreeInterceptor._activatePosition is triggered, which
>>> activates this checkbox. Shortly, in response to that we receive a
>>> state changed event, that is processed in
>>> NVDAObject.event_stateChange(), which in turn calls
>>> speech.speakObjectProperties(self,states=True,
>>> reason=controlTypes.REASON_CHANGE).
>>> So we make two calls to speech module: the first one to cache object
>>> properties, the second one to speak whatever properties have
>>> changed. Cached properties are stored inside NVDAObject, so it is
>>> very important that the same object is passed to both these calls.
>>>
>>> Now back to fast browse mode v2. Since we don't update system focus
>>> on every browse mode focus change, we need to update system focus
>>> right before activating the checkbox. This is accomplished in
>>> BrowseModeTreeInterceptor.maybeSyncFocus(). And in the same
>>> function, right after I call obj.setFocus(), I also call
>>> speech.speakObject(obj,controlTypes.REASON_ONLYCACHE).
>>> However, here is the problem. When we receive state changed event,
>>> the function NVDAObject.event_stateChange is called on a different
>>> NVDA object instance. So we completely miss the cached state.
>>> When I say a different NVDAObject instance, I only mean a different
>>> python object. So there are apparently (at least) two NVDAObjects,
>>> I'll call them NVDAObject1 and NVDAObject2. Both represent the same
>>> checkbox in the browser, both have the same IA2UniqueID and
>>> windowHandle. Yet in the first call (cacheonly) I see NVDAObject1,
>>> and the state changed event comes in with NVDAObject2.
>>> To illustrate this, here is the example from my logs (slightly
>>> formatted):
>>> cacheonly from maybeSyncFocus():
>>>     <NVDAObjects.IAccessible.mozilla.Mozilla object at 0x07A6A370>
>>>     uniqueID = (67548, -33555216)
>>> speakObject on stateChanged
>>>     <NVDAObjects.IAccessible.mozilla.Mozilla object at 0x07A6A1F0>
>>>     uniqueID = (67548L, -33555216)
>>>
>>> So the big question I have is why there are two separate NVDAObjects
>>> created for the same checkbox in my scenario? And why they are not
>>> created Without my PR? What is logic behind creating new NVDA
>>> Objects? I did some cursory debugging of that and I saw that most of
>>> NVDAObjects are created using function getNVDAObjectFromEvent()
>>> defined in IAccessible2\__init__.py, and there doesn't seem to be
>>> any caching logic there.
>>> It seems there are two potential approaches of tackling this issue.
>>> 1. We need to figure out why two separate NVDA objects are created.
>>> 2. Potentially another approach is to allow creating multiple python
>>> NVDAObjects for the same Checkbox (or any other real IAccessible2
>>> object), and have a properties cache that would take this into
>>> account. Some kind of weakKeyDictionary might work. Property caching
>>> logic in speech.py might have to be redesigned though.
>>>
>>> And also another thing worth noticing in the logs that I pasted
>>> above. UniqueID is a tuple of WindowHandle and IA2UniqueID . If you
>>> looked at both entries carefully, you would notice that WindowHandle
>>> is slightly different: even though the value is the same, in the
>>> first entry it is int, and in the second entry it is long. This
>>> looks very suspicious to me. Do you think this might be the reason
>>> why two copies of NVDAObjects are created? On the other hand it
>>> doesn't explain why two objects are not created in stock NVDA.
>>>
>>> Anyway, this is current state of my second attempt to implement fast
>>> browse mode. Any suggestions will be appreciated!
>>> Best
>>> --Tony
>>>
>>
>>
>>
>
>
>





--
Reef Turner
Software Developer