Ticket #97 (accepted enhancement)

Opened 7 months ago

Last modified 2 weeks ago

Allow NVDA to handle multiple input desktops

Reported by: jteh Owned by: jteh
Priority: major Milestone:
Component: Core Version: trunk
Keywords: Cc:
Blocking: #100 Blocked By:

Description

Currently, NVDA only handles a single input desktop; i.e. the input desktop on which it was started. This means that programs which run in other desktops cannot be read by NVDA, such as the Windows logon screen, the Windows security screen, the "Unlock Computer" screen, Vista's UAC screens and applications run as administrator in Vista. A Windows service needs to be implemented which can detect when the input desktop changes and act accordingly. This service should be light-weight, so it probably needs to be written in C/C++.

Ideally, NVDA should simply re-register all events in the new input desktop and switch, but this is probably not possible with the current architecture. The alternative is for a new instance of NVDA to be started on a new input desktop.

Issues to be discussed include:

  • Should NVDA be terminated on the previous input desktop or should it just be silenced or the like?
  • What should happen with regard to current configuration?
    • Current configuration needs to be communicated to the new instance of NVDA.
    • Any configuration changes need to be communicated back to the previous instance.
    • What happens if the user requests to save the configuration while running another instance?

Change History

Changed 7 months ago by jteh

  • blocking set to 100

Changed 6 months ago by jteh

  • owner set to jteh
  • status changed from new to accepted

Mick started (and I am completing) writing a service to handle input desktop switches for NVDA. So far, it is working very well.

It seems that this service is only required under Windows 2000 and XP. In fact, from our testing and research, it is not possible to start NVDA on the secure (winlogon) desktop under Windows Vista using a service.

In Vista, we need to use the Ease of Access facility to handle this. This requires an embedded manifest and the executable must also be authenticode signed. This latter requirement poses a problem for us, as we must either register a trusted root certificate or have our key signed by a commercial root authority.

Changed 6 months ago by jteh

Bzr branch for this work is at:
http://bzr.nvaccess.org/nvda/secureDesktop/
It currently includes the service for XP and embedded manifest for Vista.

Changed 5 months ago by jteh

XP:

  • While the service is running, NVDA is running, restarting when the input desktop switches as required. That is, you cannot start the service if NVDA is already running and once you quit NVDA, the service exits.
    • The disadvantage of this is that if you exit NVDA as a user without administrative privileges, you can't start it as a service again, as you don't have permission to start services.
    • The solution is to always have the service running.
      • The service would always start NVDA on the logon screen.
      • Once logged in, if NVDA is running on the default input desktop, NVDA will be restarted when the input desktop switches to the winlogon desktop.
      • This means that if the user exits NVDA, the service will keep running, but NVDA will not be started on the winlogon desktop for the Windows Security screen.
        • Can we distinguish between the Windows Security screen and the Windows logon screen? They both run on the winlogon desktop.
        • Both are possible without an intervening logout if fast user switching is enabled.
  • Does the current service handle fast user switching?
    • This needs to be tested.
  • How do we start NVDA with the correct environment for the logged in user?
    • Currently, NVDA gets the environment of the system account.
    • This means that the log file (and soon the config file) will be stored in the wrong location. In particular, the log file goes to c:\windows\temp.

Vista:

  • Ease of Access kills the executable it starts each time the input desktop switches and restarts it on the new desktop.
  • If the executable started by Ease of Access is exited, Ease of Access does not restart it on either desktop until the user logs out.
    • Other screen readers seem to be able to change this behaviour so that the executable is always started even if it is executed, but we haven't figured out how yet.
  • We probably need some sort of launcher which:
    • Starts NVDA when the input desktop changes if NVDA was running on the previous desktop. Like the XP service, this means NVDA won't be started for the winlogon desktop if the user exits NVDA.
    • Once running, it will simply sleep until killed. This is to ensure that Ease of Access restarts it on the next input desktop switch.

General:

  • Do we want to only ever have one copy of NVDA running or should we always leave the copy of NVDA on the default desktop running?
    • One copy consumes less resources, but state will be lost; e.g. virtual buffer position.
  • If we want to run multiple copies, we need a way to suspend/ignore speech for an inactive copy.
Note: See TracTickets for help on using tickets.