[orca/sayall-progress-event-scroll2: 1/2] Signal at-spi on speech progress
- From: Samuel Thibault <sthibaul src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [orca/sayall-progress-event-scroll2: 1/2] Signal at-spi on speech progress
- Date: Thu, 26 Sep 2019 16:27:27 +0000 (UTC)
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]