def shutdown(): """Shuts down the magnifier module. Returns True if the shutdown procedure was run or False if this module has not been initialized. """ global _initialized global _magnifier if not _magnifierAvailable: return False if not _initialized: return False atspi.Registry().deregisterEventListener(__onMouseEvent, "mouse:abs") # Someone might have killed the magnifier on us. They shouldn't # have done so, but we need to be able to recover if they did. # See http://bugzilla.gnome.org/show_bug.cgi?id=375396. # try: _magnifier.clearAllZoomRegions() _magnifier.dispose() except: debug.printException(debug.LEVEL_WARNING) _magnifier = None _initialized = False return True
def __init__(self): # Dictionary that keeps count of event listeners by type. # This is a bit convoluted for now, but what happens is that # scripts tell the FocusTrackingPresenter to listen for # object events based on what they want, and the # FocusTrackingPresenter then eventually passes them to the # script. Because both the FocusTrackingPresenter and scripts # are interested in object events, and the FocusTrackingPresenter # is what delves them out, we keep at most one listener to avoid # receiving the same event twice in a row. # self.registry = atspi.Registry() self._knownScripts = {} self._knownAppSettings = {} self._oldAppSettings = None self._eventQueue = Queue.Queue(0) self._gidleId = 0 self._gidleLock = threading.Lock() self.noFocusTimestamp = 0.0 self.setActiveScript(None) if settings.debugEventQueue: self._enqueueEventCount = 0 self._dequeueEventCount = 0
def init(): """Initializes the magnifier, bringing the magnifier up on the display. Returns True if the initialization procedure was run or False if this module has already been initialized. """ global _initialized global _magnifier if not _magnifierAvailable: return False if _initialized: return False _magnifier = bonobo.get_object("OAFIID:GNOME_Magnifier_Magnifier:0.9", "GNOME/Magnifier/Magnifier") try: applySettings() atspi.Registry().registerEventListener(__onMouseEvent, "mouse:abs") _initialized = True # Zoom to the upper left corner of the display for now. # __setROICenter(0, 0) return True except: _magnifier.dispose() raise
def shutdown(script=None, inputEvent=None): """Exits Orca. Unregisters any event listeners and cleans up. Also quits the bonobo main loop and resets the initialized state to False. Returns True if the shutdown procedure ran or False if this module was never initialized. """ global _initialized if not _initialized: return False # Try to say goodbye, but be defensive if something has hung. # if settings.timeoutCallback and (settings.timeoutTime > 0): signal.signal(signal.SIGALRM, settings.timeoutCallback) signal.alarm(settings.timeoutTime) # Translators: this is what Orca speaks and brailles when it quits. # speech.speak(_("Goodbye.")) braille.displayMessage(_("Goodbye.")) # Deregister our event listeners # registry = atspi.Registry() registry.deregisterEventListener(_onChildrenChanged, "object:children-changed:") registry.deregisterEventListener(_onMouseButton, "mouse:button") if _currentPresentationManager >= 0: _PRESENTATION_MANAGERS[_currentPresentationManager].deactivate() # Shutdown all the other support. # if settings.enableSpeech: speech.shutdown() if settings.enableBraille: braille.shutdown() if settings.enableMagnifier: mag.shutdown() registry.stop() if settings.timeoutCallback and (settings.timeoutTime > 0): signal.alarm(0) _initialized = False return True
def generateKeyboardEvent(keycode, keystring, type): """Generates a keyboard event. Arguments: - keyval: a long integer indicating the keycode or keysym of the key event being synthesized. - keystring: an (optional) UTF-8 string which, if keyval is NULL, indicates a 'composed' keyboard input string which is being synthesized; this type of keyboard event synthesis does not emulate hardware keypresses but injects the string as though a composing input method (such as XIM) were used. - type: an AccessibleKeySynthType flag indicating whether keyval is to be interpreted as a keysym rather than a keycode (atspi.Accessibility.KEY_SYM), or whether to synthesize KEY_PRESS, KEY_RELEASE, or both (KEY_PRESSRELEASE). """ d = atspi.Registry().registry.getDeviceEventController() d.generateKeyboardEvent(keycode, keystring, type)
def generateMouseEvent(x, y, eventName): """Synthesize a mouse event at a specific screen coordinate. Most AT clients should use the #AccessibleAction interface when tempted to generate mouse events, rather than this method. Event names: b1p = button 1 press; b2r = button 2 release; b3c = button 3 click; b2d = button 2 double-click; abs = absolute motion; rel = relative motion. Arguments: - x: the x screen coordinate - y: the y screen coordinate - eventName: the event name string (as described above) """ debug.println(debug.LEVEL_FINER, "SYNTHESIZING MOUSE EVENT: (%d, %d) %s"\ % (x, y, eventName)) d = atspi.Registry().registry.getDeviceEventController() d.generateMouseEvent(x, y, eventName)
def _onChildrenChanged(e): """Tracks children-changed events on the desktop to determine when apps start and stop. Arguments: - e: at-spi event from the at-api registry """ registry = atspi.Registry() if e.source == registry.desktop: # If the desktop is empty, the user has logged out-- shutdown Orca # try: if registry.desktop.childCount == 0: speech.speak(_("Goodbye.")) shutdown() return except: # could be a CORBA.COMM_FAILURE debug.printException(debug.LEVEL_FINEST) shutdown() return
def main(): """The main entry point for Orca. The exit codes for Orca will loosely be based on signals, where the exit code will be the signal used to terminate Orca (if a signal was used). Otherwise, an exit code of 0 means normal completion and an exit code of 50 means Orca exited because of a hang.""" global _commandLineSettings # Method to call when we think something might be hung. # settings.timeoutCallback = timeout # Various signal handlers we want to listen for. # signal.signal(signal.SIGHUP, shutdownOnSignal) signal.signal(signal.SIGINT, shutdownOnSignal) signal.signal(signal.SIGTERM, shutdownOnSignal) signal.signal(signal.SIGQUIT, shutdownOnSignal) signal.signal(signal.SIGSEGV, abortOnSignal) # See if the desktop is running. If it is, the import of gtk will # succeed. If it isn't, the import will fail. # desktopRunning = False try: if gtk.gdk.display_get_default(): desktopRunning = True except: pass # Parse the command line options. # # Run the preferences setup if the user has specified # "--setup" or "--text-setup" on the command line. If the # desktop is not running, we will fallback to the console-based # method as appropriate. # bypassSetup = False setupRequested = False showGUI = False # We hack a little here because the shell script to start orca can # conflate all of command line arguments into one string, which is # not what we want. We detect this by seeing if the length of the # argument list is 1. # arglist = sys.argv[1:] if len(arglist) == 1: arglist = arglist[0].split() try: # ? is for help # e is for enabling a feature # d is for disabling a feature # h is for help # u is for alternate user preferences location # s is for setup # n is for no setup # t is for text setup # v is for version # opts, args = getopt.getopt(arglist, "?stnvd:e:u:", [ "help", "user-prefs-dir=", "enable=", "disable=", "setup", "gui-setup", "text-setup", "no-setup", "version" ]) for opt, val in opts: if opt in ("-u", "--user-prefs-dir"): userPrefsDir = val.strip() try: os.chdir(userPrefsDir) settings.userPrefsDir = userPrefsDir except: debug.printException(debug.LEVEL_FINEST) if opt in ("-e", "--enable"): feature = val.strip() if feature == "speech": _commandLineSettings["enableSpeech"] = True elif feature == "braille": _commandLineSettings["enableBraille"] = True elif feature == "braille-monitor": _commandLineSettings["enableBrailleMonitor"] = True elif feature == "magnifier": _commandLineSettings["enableMagnifier"] = True elif feature == "main-window": _commandLineSettings["showMainWindow"] = True else: usage() os._exit(2) if opt in ("-d", "--disable"): feature = val.strip() if feature == "speech": _commandLineSettings["enableSpeech"] = False elif feature == "braille": _commandLineSettings["enableBraille"] = False elif feature == "braille-monitor": _commandLineSettings["enableBrailleMonitor"] = False elif feature == "magnifier": _commandLineSettings["enableMagnifier"] = False elif feature == "main-window": _commandLineSettings["showMainWindow"] = False else: usage() os._exit(2) if opt in ("-s", "--gui-setup", "--setup"): setupRequested = True showGUI = desktopRunning if opt in ("-t", "--text-setup"): setupRequested = True showGUI = False if opt in ("-n", "--no-setup"): bypassSetup = True if opt in ("-?", "--help"): usage() os._exit(0) if opt in ("-v", "--version"): print "Orca %s" % platform.version os._exit(0) except: debug.printException(debug.LEVEL_OFF) usage() os._exit(2) # Do not run Orca if accessibility has not been enabled. # We do allow, however, one to force Orca to run via the # "-n" switch. The main reason is so that things such # as accessible login can work -- in those cases, the gconf # setting is typically not set since the gdm user does not # have a home. # a11yEnabled = settings.isAccessibilityEnabled() if (not bypassSetup) and (not a11yEnabled): _showPreferencesConsole() abort() if setupRequested and (not bypassSetup) and (not showGUI): _showPreferencesConsole() if not desktopRunning: print "Cannot start Orca because it cannot connect" print "to the Desktop. Please make sure the DISPLAY" print "environment variable has been set." return 1 userprefs = settings.userPrefsDir sys.path.insert(0, userprefs) sys.path.insert(0, '') # current directory registry = atspi.Registry() init(registry) try: message = _("Welcome to Orca.") speech.speak(message) braille.displayMessage(message) except: debug.printException(debug.LEVEL_SEVERE) # Check to see if the user wants the configuration GUI. It's # done here so that the user's existing preferences can be used # to set the initial GUI state. We'll also force the set to # be run if the preferences file doesn't exist, unless the # user has bypassed any setup via the --no-setup switch. # if setupRequested and (not bypassSetup) and showGUI: _showPreferencesGUI() elif (not _userSettings) and (not bypassSetup): if desktopRunning: _showPreferencesGUI() else: _showPreferencesConsole() start(registry) # waits until we stop the registry return 0