[orca/sayall-progress-event-scroll2: 1/2] Signal at-spi on speech progress



commit be0886c6b100073380815aac32b40f6f707f906d
Author: Samuel Thibault <samuel thibault ens-lyon org>
Date:   Tue May 21 13:35:24 2019 +0200

    Signal at-spi on speech progress
    
    So that e.g. focus tracking in magnifiers can show the speech progress.
    
    Fixes #36

 src/orca/eventsynthesizer.py                  |  6 ++++++
 src/orca/scripts/default.py                   |  7 +++++++
 src/orca/scripts/toolkits/WebKitGtk/script.py |  8 +++++++-
 src/orca/scripts/web/script.py                |  5 +++++
 src/orca/speechdispatcherfactory.py           | 22 ++++++++++++++++------
 src/orca/speechserver.py                      |  1 +
 6 files changed, 42 insertions(+), 7 deletions(-)
---
diff --git a/src/orca/eventsynthesizer.py b/src/orca/eventsynthesizer.py
index 31f92e226..ed5458331 100644
--- a/src/orca/eventsynthesizer.py
+++ b/src/orca/eventsynthesizer.py
@@ -325,3 +325,9 @@ def grabFocusOn(obj):
         return False
 
     return component.grabFocus()
+
+def notifyReadingPosition(obj, startOffset, endOffset):
+    try:
+        obj.emit("region-changed", startOffset, endOffset)
+    except:
+        return
diff --git a/src/orca/scripts/default.py b/src/orca/scripts/default.py
index 8ab458b5b..e09edcd23 100644
--- a/src/orca/scripts/default.py
+++ b/src/orca/scripts/default.py
@@ -3029,6 +3029,9 @@ class Script(script.Script):
             return
 
         if progressType == speechserver.SayAllContext.PROGRESS:
+            if context.nextOffset != None:
+                eventsynthesizer.notifyReadingPosition(context.obj, \
+                    context.currentOffset, context.nextOffset)
             return
         elif progressType == speechserver.SayAllContext.INTERRUPTED:
             if isinstance(orca_state.lastInputEvent, input_event.KeyboardEvent):
@@ -3041,9 +3044,13 @@ class Script(script.Script):
 
             self._inSayAll = False
             self._sayAllContexts = []
+            eventsynthesizer.notifyReadingPosition(context.obj, \
+                context.currentOffset, context.currentOffset)
             text.setCaretOffset(context.currentOffset)
         elif progressType == speechserver.SayAllContext.COMPLETED:
             orca.setLocusOfFocus(None, context.obj, notifyScript=False)
+            eventsynthesizer.notifyReadingPosition(context.obj, \
+                context.currentOffset, context.currentOffset)
             text.setCaretOffset(context.currentOffset)
 
         # If there is a selection, clear it. See bug #489504 for more details.
diff --git a/src/orca/scripts/toolkits/WebKitGtk/script.py b/src/orca/scripts/toolkits/WebKitGtk/script.py
index d3542fc9e..adfd90059 100644
--- a/src/orca/scripts/toolkits/WebKitGtk/script.py
+++ b/src/orca/scripts/toolkits/WebKitGtk/script.py
@@ -554,10 +554,14 @@ class Script(default.Script):
         self._sayAllContexts = []
 
     def __sayAllProgressCallback(self, context, progressType):
+        obj = context.obj
+
         if progressType == speechserver.SayAllContext.PROGRESS:
+            if context.nextOffset != None:
+                eventsynthesizer.notifyReadingPosition(obj, \
+                    context.currentOffset, context.nextOffset)
             return
 
-        obj = context.obj
         orca.setLocusOfFocus(None, obj, notifyScript=False)
 
         offset = context.currentOffset
@@ -574,6 +578,7 @@ class Script(default.Script):
 
             self._inSayAll = False
             self._sayAllContexts = []
+            eventsynthesizer.notifyReadingPosition(obj, offset, offset)
             if not self._lastCommandWasStructNav:
                 text.setCaretOffset(offset)
             return
@@ -592,6 +597,7 @@ class Script(default.Script):
             if [l for l in links if l.startIndex <= offset <= l.endIndex]:
                 return
 
+        eventsynthesizer.notifyReadingPosition(obj, offset, offset)
         text.setCaretOffset(offset)
 
     def getTextLineAtCaret(self, obj, offset=None, startOffset=None, endOffset=None):
diff --git a/src/orca/scripts/web/script.py b/src/orca/scripts/web/script.py
index 183c568a4..7b2e10c58 100644
--- a/src/orca/scripts/web/script.py
+++ b/src/orca/scripts/web/script.py
@@ -738,6 +738,8 @@ class Script(default.Script):
                 elif lastKey == "Up" and self._rewindSayAll(context):
                     return
                 elif not self._lastCommandWasStructNav:
+                    eventsynthesizer.notifyReadingPosition(context.obj, \
+                        context.currentOffset, context.currentOffset)
                     self.utilities.setCaretPosition(context.obj, context.currentOffset)
                     self.updateBraille(context.obj)
 
@@ -747,6 +749,9 @@ class Script(default.Script):
             return
 
         orca.setLocusOfFocus(None, context.obj, notifyScript=False)
+        if context.nextOffset != None:
+            eventsynthesizer.notifyReadingPosition(context.obj, \
+                context.currentOffset, context.nextOffset)
         self.utilities.setCaretContext(context.obj, context.currentOffset)
 
     def inFocusMode(self):
diff --git a/src/orca/speechdispatcherfactory.py b/src/orca/speechdispatcherfactory.py
index 4081bd245..4f8daac65 100644
--- a/src/orca/speechdispatcherfactory.py
+++ b/src/orca/speechdispatcherfactory.py
@@ -353,8 +353,8 @@ class SpeechServer(speechserver.SpeechServer):
         # string offsets
         # Note: we need to do this before disturbing the text offsets
         # Note2: we assume that text mangling below leave U+E000 untouched
-        marks_offsets = []
-        marked_text = ""
+        marks_offsets = [0]
+        marked_text = "\ue000"
 
         for i in range(len(text)):
             c = text[i]
@@ -371,6 +371,8 @@ class SpeechServer(speechserver.SpeechServer):
                 marks_offsets.append(i + 1)
                 marked_text += '\ue000'
 
+        marks_offsets.append(len(text))
+
         text = marked_text
 
         text = self.__addVerbalizedPunctuation(text)
@@ -400,7 +402,7 @@ class SpeechServer(speechserver.SpeechServer):
                     msg = "%uth U+E000 does not have corresponding index" % i
                     debug.println(debug.LEVEL_WARNING, msg, True)
                 else:
-                    ssml += '<mark name="%u"/>' % marks_offsets[i]
+                    ssml += '<mark name="%u:%u"/>' % (marks_offsets[i], marks_offsets[i+1])
                 i += 1
             # Disable for now, until speech dispatcher properly parses them (version 0.8.9 or later)
             #elif c == '"':
@@ -439,13 +441,21 @@ class SpeechServer(speechserver.SpeechServer):
                 t = self._CALLBACK_TYPE_MAP[callbackType]
                 if t == speechserver.SayAllContext.PROGRESS:
                     if index_mark:
-                        context.currentOffset = context.startOffset + int(index_mark)
-                        msg = "SPEECH DISPATCHER: Got mark %d / %d-%d" % (context.currentOffset, 
context.startOffset, context.endOffset)
-                        debug.println(debug.LEVEL_INFO, msg, True)
+                        index = index_mark.split(':')
+                        if len(index) >= 2:
+                            start, end = index[0:2]
+                            context.currentOffset = context.startOffset + int(start)
+                            context.nextOffset = context.startOffset + int(end)
+                            msg = "SPEECH DISPATCHER: Got mark %d:%d / %d-%d" % \
+                                (context.currentOffset, context.nextOffset, \
+                                 context.startOffset, context.endOffset)
+                            debug.println(debug.LEVEL_INFO, msg, True)
                     else:
                         context.currentOffset = context.startOffset
+                        context.nextOffset = None
                 elif t == speechserver.SayAllContext.COMPLETED:
                     context.currentOffset = context.endOffset
+                    context.nextOffset = None
                 GLib.idle_add(orca_callback, context, t)
                 if t == speechserver.SayAllContext.COMPLETED:
                     GLib.idle_add(self._say_all, iterator, orca_callback)
diff --git a/src/orca/speechserver.py b/src/orca/speechserver.py
index a8729b70f..07cf65fae 100644
--- a/src/orca/speechserver.py
+++ b/src/orca/speechserver.py
@@ -83,6 +83,7 @@ class SayAllContext:
         self.utterance     = utterance
         self.startOffset   = startOffset
         self.currentOffset = startOffset
+        self.nextOffset    = None
         self.endOffset     = endOffset
 
 


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