[orca] Improve presentation of layered pane selection changes



commit 861ea68da9001b263b6d3d4c178729c90e4087a2
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Sat Feb 27 22:13:11 2016 -0500

    Improve presentation of layered pane selection changes

 src/orca/script_utilities.py             |   17 +++++++++++++++++
 src/orca/scripts/toolkits/GAIL/script.py |   17 +++++++++++++++++
 src/orca/scripts/toolkits/gtk/script.py  |    9 +++++++--
 3 files changed, 41 insertions(+), 2 deletions(-)
---
diff --git a/src/orca/script_utilities.py b/src/orca/script_utilities.py
index c34df02..b459e6a 100644
--- a/src/orca/script_utilities.py
+++ b/src/orca/script_utilities.py
@@ -3200,6 +3200,23 @@ class Utilities:
 
         return children
 
+    def selectedChildCount(self, obj):
+        try:
+            selection = obj.querySelection()
+        except NotImplementedError:
+            msg = "INFO: %s does not implement the selection interface" % obj
+            debug.println(debug.LEVEL_INFO, msg, True)
+            return 0
+        except:
+            msg = "ERROR: Exception querying selection interface for %s" % obj
+            debug.println(debug.LEVEL_INFO, msg, True)
+            return 0
+
+        count = selection.nSelectedChildren
+        msg = "INFO: %s reports %i selected children" % (obj, count)
+        debug.println(debug.LEVEL_INFO, msg, True)
+        return count
+
     def focusedChild(self, obj):
         isFocused = lambda x: x and x.getState().contains(pyatspi.STATE_FOCUSED)
         child = pyatspi.findDescendant(obj, isFocused)
diff --git a/src/orca/scripts/toolkits/GAIL/script.py b/src/orca/scripts/toolkits/GAIL/script.py
index 698e72d..6e8a213 100644
--- a/src/orca/scripts/toolkits/GAIL/script.py
+++ b/src/orca/scripts/toolkits/GAIL/script.py
@@ -118,6 +118,14 @@ class Script(default.Script):
             orca.setLocusOfFocus(event, event.source)
             return
 
+        # Unfiled, but yet another case of only getting a focus: event.
+        # Seems to happen mainly when selecting.
+        if role == pyatspi.ROLE_ICON:
+            topLevelObject = self.utilities.topLevelObject(event.source)
+            if topLevelObject == orca_state.activeWindow:
+                orca.setLocusOfFocus(event, event.source)
+                return
+
         # Unfiled, but yet another case of only getting a focus: event when
         # a widget appears in a parent container and is already focused.
         if role == pyatspi.ROLE_TABLE:
@@ -129,6 +137,15 @@ class Script(default.Script):
             orca.setLocusOfFocus(event, obj)
             return
 
+    def onSelectionChanged(self, event):
+        """Callback for object:selection-changed accessibility events."""
+
+        if event.source.getRole() == pyatspi.ROLE_LAYERED_PANE \
+           and self.utilities.selectedChildCount(event.source) > 1:
+            return
+
+        super().onSelectionChanged(event)
+
     def onTextSelectionChanged(self, event):
         """Callback for object:text-selection-changed accessibility events."""
 
diff --git a/src/orca/scripts/toolkits/gtk/script.py b/src/orca/scripts/toolkits/gtk/script.py
index e7126e4..b1c3fed 100644
--- a/src/orca/scripts/toolkits/gtk/script.py
+++ b/src/orca/scripts/toolkits/gtk/script.py
@@ -198,11 +198,16 @@ class Script(default.Script):
     def onSelectionChanged(self, event):
         """Callback for object:selection-changed accessibility events."""
 
-        if event.source.getRole() == pyatspi.ROLE_COMBO_BOX \
+        role = event.source.getRole()
+        if role == pyatspi.ROLE_COMBO_BOX \
            and not event.source.getState().contains(pyatspi.STATE_FOCUSED):
             return
 
-        default.Script.onSelectionChanged(self, event)
+        if role == pyatspi.ROLE_LAYERED_PANE \
+           and self.utilities.selectedChildCount(event.source) > 1:
+            return
+
+        super().onSelectionChanged(event)
 
     def onShowingChanged(self, event):
         """Callback for object:state-changed:showing accessibility events."""


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