[orca] Handle row-reordered event spam



commit 8a73e3718e1376f156d1f544d1ffe02a78618aec
Author: Joanmarie Diggs <jdiggs igalia com>
Date:   Fri Apr 22 15:21:28 2016 -0400

    Handle row-reordered event spam

 src/orca/input_event.py                 |    6 +++++
 src/orca/script_utilities.py            |   36 +++++++++++++++++++++++++++++++
 src/orca/scripts/apps/soffice/script.py |    6 -----
 src/orca/scripts/default.py             |   24 ++++++++------------
 4 files changed, 52 insertions(+), 20 deletions(-)
---
diff --git a/src/orca/input_event.py b/src/orca/input_event.py
index c2eb841..722eb4e 100644
--- a/src/orca/input_event.py
+++ b/src/orca/input_event.py
@@ -543,6 +543,12 @@ class KeyboardEvent(InputEvent):
 
         return False
 
+    def isHandledBy(self, method):
+        if not self._handler:
+            return False
+
+        return method.__func__ == self._handler.function
+
     def _present(self, inputEvent=None):
         if self.isPressedKey():
             self._script.presentationInterrupt()
diff --git a/src/orca/script_utilities.py b/src/orca/script_utilities.py
index bd39af5..c750caf 100644
--- a/src/orca/script_utilities.py
+++ b/src/orca/script_utilities.py
@@ -3880,6 +3880,42 @@ class Utilities:
 
         return False
 
+    def lastInputEventWasTableSort(self, delta=0.5):
+        event = orca_state.lastInputEvent
+        if not event:
+            return False
+
+        now = time.time()
+        if now - event.time > delta:
+            return False
+
+        lastSortTime = self._script.pointOfReference.get('last-table-sort-time', 0.0)
+        if now - lastSortTime < delta:
+            return False
+
+        if isinstance(event, input_event.MouseButtonEvent):
+            if not self.lastInputEventWasPrimaryMouseRelease():
+                return False
+        elif isinstance(event, input_event.KeyboardEvent):
+            if not event.isHandledBy(self._script.leftClickReviewItem):
+                keyString, mods = self.lastKeyAndModifiers()
+                if keyString not in ["Return", "space", " "]:
+                    return False
+
+        try:
+            role = orca_state.locusOfFocus.getRole()
+        except:
+            msg = "ERROR: Exception getting role for %s" % orca_state.locusOfFocus
+            debug.println(debug.LEVEL_INFO, msg, True)
+            return False
+
+        roles = [pyatspi.ROLE_COLUMN_HEADER,
+                 pyatspi.ROLE_ROW_HEADER,
+                 pyatspi.ROLE_TABLE_COLUMN_HEADER,
+                 pyatspi.ROLE_TABLE_ROW_HEADER]
+
+        return role in roles
+
     def treatEventAsTerminalCommand(self, event):
         try:
             role = event.source.getRole()
diff --git a/src/orca/scripts/apps/soffice/script.py b/src/orca/scripts/apps/soffice/script.py
index 6ceefd9..e9c5384 100644
--- a/src/orca/scripts/apps/soffice/script.py
+++ b/src/orca/scripts/apps/soffice/script.py
@@ -833,12 +833,6 @@ class Script(default.Script):
         if weToggledIt:
             speech.speak(self.speechGenerator.generateSpeech(obj))
 
-    def onRowReordered(self, event):
-        """Callback for object:row-reordered accessibility events."""
-
-        # We're seeing a crazy ton of these emitted bogusly.
-        pass
-
     def onSelectedChanged(self, event):
         """Callback for object:state-changed:selected accessibility events."""
 
diff --git a/src/orca/scripts/default.py b/src/orca/scripts/default.py
index 02b4b20..0721b92 100644
--- a/src/orca/scripts/default.py
+++ b/src/orca/scripts/default.py
@@ -2647,31 +2647,27 @@ class Script(script.Script):
         self.updateBraille(obj)
 
     def onColumnReordered(self, event):
-        """Called whenever the columns in a table are reordered.
+        """Callback for object:column-reordered accessibility events."""
 
-        Arguments:
-        - event: the Event
-        """
+        if not self.utilities.lastInputEventWasTableSort():
+            return
 
-        parentTable = self.utilities.ancestorWithRole(
-            orca_state.locusOfFocus, [pyatspi.ROLE_TABLE], [pyatspi.ROLE_FRAME])
-        if event.source != parentTable:
+        if event.source != self.utilities.getTable(orca_state.locusOfFocus):
             return
 
+        self.pointOfReference['last-table-sort-time'] = time.time()
         self.presentMessage(messages.TABLE_REORDERED_COLUMNS)
 
     def onRowReordered(self, event):
-        """Called whenever the rows in a table are reordered.
+        """Callback for object:row-reordered accessibility events."""
 
-        Arguments:
-        - event: the Event
-        """
+        if not self.utilities.lastInputEventWasTableSort():
+            return
 
-        parentTable = self.utilities.ancestorWithRole(
-            orca_state.locusOfFocus, [pyatspi.ROLE_TABLE], [pyatspi.ROLE_FRAME])
-        if event.source != parentTable:
+        if event.source != self.utilities.getTable(orca_state.locusOfFocus):
             return
 
+        self.pointOfReference['last-table-sort-time'] = time.time()
         self.presentMessage(messages.TABLE_REORDERED_ROWS)
 
     def onValueChanged(self, event):


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