orca r4072 - in trunk: . src/orca



Author: wwalker
Date: Fri Aug  1 20:47:02 2008
New Revision: 4072
URL: http://svn.gnome.org/viewvc/orca?rev=4072&view=rev

Log:
Fix for bug #536985 - Orca no longer reads applets on the panel


Modified:
   trunk/ChangeLog
   trunk/src/orca/braillegenerator.py
   trunk/src/orca/focus_tracking_presenter.py
   trunk/src/orca/speechgenerator.py

Modified: trunk/src/orca/braillegenerator.py
==============================================================================
--- trunk/src/orca/braillegenerator.py	(original)
+++ trunk/src/orca/braillegenerator.py	Fri Aug  1 20:47:02 2008
@@ -80,6 +80,8 @@
              self._getBrailleRegionsForDialog
         self.brailleGenerators[pyatspi.ROLE_DIRECTORY_PANE]      = \
              self._getBrailleRegionsForDirectoryPane
+        self.brailleGenerators[pyatspi.ROLE_EMBEDDED]            = \
+             self._getBrailleRegionsForEmbedded
         self.brailleGenerators[pyatspi.ROLE_FRAME]               = \
              self._getBrailleRegionsForFrame
         self.brailleGenerators[pyatspi.ROLE_HTML_CONTAINER]      = \
@@ -548,6 +550,39 @@
 
         return self._getDefaultBrailleRegions(obj)
 
+    def _getBrailleRegionsForEmbedded(self, obj, role=None):
+        """Gets text to be displayed for the current embedded object.
+
+        Arguments:
+        - obj: an Accessible
+        - role: Role to use as an override.
+
+        Returns a list where the first element is a list of Regions to
+        display and the second element is the Region which should get
+        focus.
+        """
+
+        self._debugGenerator("_getBrailleRegionsForEmbedded", obj)
+
+        regions = []
+
+        text = ""
+        text = self._script.appendString(
+            text, self._script.getDisplayedLabel(obj))
+        text = self._script.appendString(
+            text, self._script.getDisplayedText(obj))
+        if not text:
+            try:
+                text = obj.getApplication().name
+            except:
+                pass
+
+        regions = []
+        componentRegion = braille.Component(obj, text)
+        regions.append(componentRegion)
+
+        return [regions, componentRegion]
+
     def _getBrailleRegionsForFrame(self, obj):
         """Get the braille for a frame.
 

Modified: trunk/src/orca/focus_tracking_presenter.py
==============================================================================
--- trunk/src/orca/focus_tracking_presenter.py	(original)
+++ trunk/src/orca/focus_tracking_presenter.py	Fri Aug  1 20:47:02 2008
@@ -596,6 +596,8 @@
             try:
                 state = event.source.getState()
                 if not state.contains(pyatspi.STATE_ICONIFIED):
+                    eType = event.type
+                    setNewActiveScript = eType == "window:activate"
 
                     # [[[TODO: WDW - HACK we look for frame that get
                     # focus: as a means to detect active scripts
@@ -605,24 +607,45 @@
                     # in use, and then issues a focus: event on the
                     # main window, which is a frame.]]]
                     #
+                    setNewActiveScript = setNewActiveScript \
+                        or (eType.startswith("focus") \
+                            and (event.source.getRole() == pyatspi.ROLE_FRAME))
+
                     # Added in a further check. We look for modal panels
                     # that are now showing (such as gnome-screensaver-dialog).
                     # See bug #530368 for more details.
                     #
+                    setNewActiveScript = setNewActiveScript \
+                        or (eType.startswith("object:state-changed:showing")
+                            and (event.source.getRole() == pyatspi.ROLE_PANEL)
+                            and state.contains(pyatspi.STATE_MODAL))
+
                     # Also, we might be running into a gnome-panel
                     # applet, which is indicated by a host application
                     # with no children.  See bug #536985.
                     #
-                    eType = event.type
-                    if (eType == "window:activate") \
-                       or ((eType.startswith("focus")) 
-                         and (event.source.getRole() == pyatspi.ROLE_FRAME)) \
-                       or (eType.startswith("object:state-changed:showing")
-                         and (event.source.getRole() == pyatspi.ROLE_PANEL)
-                         and state.contains(pyatspi.STATE_MODAL)) \
-                       or (event.host_application \
-                           and len(event.host_application) == 0):
+                    setNewActiveScript = setNewActiveScript \
+                        or (event.host_application \
+                            and len(event.host_application) == 0 \
+                            and orca_state.activeScript \
+                            and (orca_state.activeScript.app \
+                                 != event.host_application))
+
+                    # Or, we might just be getting a focus event.  In this
+                    # case, assume the window has focus and we missed an
+                    # event for it somehow.
+                    #
+                    if not setNewActiveScript:
+                        if eType.startswith("focus") \
+                           or (eType.startswith("object:state-changed:focused")\
+                               and event.detail1):
+                            setNewActiveScript = \
+                                orca_state.activeScript \
+                                and event.host_application \
+                                and (orca_state.activeScript.app \
+                                     != event.host_application)
 
+                    if setNewActiveScript:
                         # We'll let someone else decide if it's important
                         # to stop speech or not.
                         #speech.stop()

Modified: trunk/src/orca/speechgenerator.py
==============================================================================
--- trunk/src/orca/speechgenerator.py	(original)
+++ trunk/src/orca/speechgenerator.py	Fri Aug  1 20:47:02 2008
@@ -78,6 +78,8 @@
              self._getSpeechForDialog
         self.speechGenerators[pyatspi.ROLE_DIRECTORY_PANE]      = \
              self._getSpeechForDirectoryPane
+        self.speechGenerators[pyatspi.ROLE_EMBEDDED]            = \
+             self._getSpeechForEmbedded
         self.speechGenerators[pyatspi.ROLE_FRAME]               = \
              self._getSpeechForFrame
         self.speechGenerators[pyatspi.ROLE_HTML_CONTAINER]      = \
@@ -616,6 +618,39 @@
 
         return utterances
 
+    def _getSpeechForEmbedded(self, obj, already_focused, role=None):
+        """Gets a list of utterances to be spoken for the current
+        embedded component (i.e., something in a panel).
+
+        Arguments:
+        - obj: an Accessible
+        - already_focused: False if object just received focus
+        - role: A role that should be used instead of the Accessible's 
+          possible role.
+
+        Returns a list of utterances to be spoken for the object.
+        """
+
+        utterances = []
+
+        label = self._getSpeechForObjectLabel(obj)
+        utterances.extend(label)
+        name = self._getSpeechForObjectName(obj)
+        if name != label:
+            utterances.extend(name)
+        if not utterances:
+            try:
+                utterances.append(obj.getApplication().name)
+            except:
+                pass
+
+        self._debugGenerator("_getSpeechForEmbedded",
+                             obj,
+                             already_focused,
+                             utterances)
+
+        return utterances
+
     def _getSpeechForFrame(self, obj, already_focused):
         """Get the speech for a frame.
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]