3 Commits

11 changed files with 33 additions and 192 deletions

View File

@@ -45,6 +45,12 @@ rate=0.5
pitch=0.5
# Pitch for capital letters
capital_pitch=0.9
# How to indicate capital letters:
# pitch = change speech pitch (uses capital_pitch value)
# beep = play Caps.wav sound icon
# both = play beep AND change pitch
# none = no special indication
capital_indicator=pitch
# Volume controls the loudness of the voice, select from 0, quietest, to 1.0, loudest.
volume=1.0
@@ -243,20 +249,6 @@ leave_review_on_cursor_change=True
# Exit review mode when switching to a different TTY/screen
leave_review_on_screen_change=True
[promote]
# Enable promoting (announcing) important text updates automatically
enabled=True
# Seconds of inactivity before promoting text updates (prevents spam during active typing)
inactive_timeout_sec=120
# Comma-separated list of text patterns to promote when detected
# Leave empty to disable pattern-based promotion
# Examples:
# error,warning,failed - Announce build/command errors
# complete,finished,done - Announce task completions
# new message,@username - Announce chat notifications
# download complete - Announce download completions
list=
[menu]
# Custom path for VMenu (virtual menu) profiles
# Leave empty to use default location (/etc/fenrirscreenreader/vmenu-profiles/)

View File

@@ -46,8 +46,6 @@ ErrorSpeech='ErrorSpeech.wav'
ErrorScreen='ErrorScreen.wav'
# If you cursor over an text that has attributs (like color)
HasAttributes='has_attribute.wav'
# fenrir can promote strings if they appear on the screen.
PromotedText='PromotedText.wav'
# missspelled indicator
mispell='mispell.wav'
# the for capital letter

View File

@@ -50,8 +50,6 @@ ErrorBraille=''
ErrorScreen=''
# If you cursor over an text that has attributs (like color)
HasAttributes=''
# fenrir can promote strings if they appear on the screen.
PromotedText=''
# misspelled indicator
mispell=''
# the for capital letter:

View File

@@ -1095,23 +1095,6 @@ announce=True
interrupt=False
....
==== Promoted List
Promoted Lists are a nice feature if you are away from your computer or
performing more longer tasks. you can define a list of words which you
want to hear a sound icon for after a period of inactivity. Example if
the word "Chrys" appears after 120 Seconds of inactivity:
....
[promote]
enabled=True
inactive_timeout_sec=120
list=Chrys
....
See section link:#Promote[Promote] in `+settings.conf+` for more
information.
=== Dictionary
You can make use of different kinds of built-in dictionary's. A
@@ -2049,39 +2032,6 @@ leave_review_on_screen_change=True
Values: on=`+True+`, off=`+False+`
==== Promote
"Promoted Lists" are configured in the section `+[promote]+`. Turn
Promoted Lists" on or off:
....
enabled=True
....
Values: on=`+True+`, off=`+False+`
The minimum time interval of inactivity to activate promoting. By
default it promotes after 120 Seconds inactivity:
....
inactive_timeout_sec=120
....
Values: in Seconds
Define a list of promoted words comma seperated:
....
list=
....
Values: text (comma seperated) Example to promote the word "nickname" or
a bash prompt:
....
list=nickname,$:,#:
....
==== Time
The automated time announcement is configured in the section `+[time]+`.

View File

@@ -729,15 +729,6 @@ Example on fix minutes in an hour. example every quarter "delaySec=0" and "onMin
onMinutes=00,15,30,45
announce=True
interrupt=False
==== Promoted List ====
Promoted Lists are a nice feature if you are away from your computer or performing more longer tasks.
you can define a list of words which you want to hear a sound icon for after a period of inactivity.
Example if the word "Chrys" appears after 120 Seconds of inactivity:
[promote]
enabled=True
inactive_timeout_sec=120
list=Chrys
See section [[#Promote|Promote]] in ''settings.conf'' for more information.
==== Punctuation ====
Fenrir handles punctuation levels and names for you with several provided dictionaries.
@@ -1199,23 +1190,6 @@ Values: on=''True'', off=''False''
Leave the review mode when changing the screen (From TTY3 to TTY4):
leave_review_on_screen_change=True
Values: on=''True'', off=''False''
==== Promote ====
"Promoted Lists" are configured in the section ''[promote]''.
Turn Promoted Lists" on or off:
enabled=True
Values: on=''True'', off=''False''
The minimum time interval of inactivity to activate promoting.
By default it promotes after 120 Seconds inactivity:
inactive_timeout_sec=120
Values: in Seconds
Define a list of promoted words comma seperated:
list=
Values: text (comma seperated)
Example to promote the word "nickname" or a bash prompt:
list=nickname,$:,#:
==== Time ====
The automated time announcement is configured in the section ''[time]''.
Time announcement is disabled by default.

View File

@@ -1,66 +0,0 @@
#!/usr/bin/env python3
import time
from fenrirscreenreader.core.i18n import _
# -*- coding: utf-8 -*-
# Fenrir TTY screen reader
# By Chrys, Storm Dragon, and contributors.
class command:
def __init__(self):
pass
def initialize(self, environment):
self.env = environment
def shutdown(self):
pass
def get_description(self):
return "No Description found"
def run(self):
if not self.env["runtime"]["SettingsManager"].get_setting_as_bool(
"promote", "enabled"
):
return
if (
self.env["runtime"]["SettingsManager"]
.get_setting("promote", "list")
.strip(" \t\n")
== ""
):
return
if int(time.time() - self.env["input"]["last_input_time"]) < self.env[
"runtime"
]["SettingsManager"].get_setting_as_int(
"promote", "inactive_timeout_sec"
):
return
if (
len(
self.env["runtime"]["SettingsManager"].get_setting(
"promote", "list"
)
)
== 0
):
return
for promote in (
self.env["runtime"]["SettingsManager"]
.get_setting("promote", "list")
.split(",")
):
if promote in self.env["screen"]["new_delta"]:
self.env["runtime"]["OutputManager"].play_sound_icon(
"PromotedText"
)
self.env["input"]["last_input_time"] = time.time()
return
def set_callback(self, callback):
pass

View File

@@ -17,8 +17,7 @@ from fenrirscreenreader.core.eventData import FenrirEventType
class EventManager:
def __init__(self):
self.running = Value(c_bool, True)
# Bounded queue to prevent memory exhaustion
self._eventQueue = Queue(maxsize=100)
self._eventQueue = Queue()
self.clean_event_queue()
def initialize(self, environment):
@@ -107,23 +106,5 @@ class EventManager:
return False
if event == FenrirEventType.ignore:
return False
# Use bounded queue - if full, this will block briefly or drop older
# events
try:
self._eventQueue.put({"Type": event, "data": data}, timeout=0.1)
except Exception as e:
# Queue full - drop oldest event and add new one for critical
# events
if event in [
FenrirEventType.screen_update,
FenrirEventType.keyboard_input,
]:
try:
self._eventQueue.get_nowait() # Remove oldest
self._eventQueue.put(
{"Type": event, "data": data}, timeout=0.1
)
except BaseException:
pass # If still can't add, drop the event
# For non-critical events, just drop them if queue is full
self._eventQueue.put({"Type": event, "data": data})
return True

View File

@@ -65,13 +65,31 @@ class OutputManager:
return
if (len(text) > 1) and (text.strip(string.whitespace) == ""):
return
to_announce_capital = announce_capital and text[0].isupper()
if to_announce_capital:
if self.play_sound_icon("capital", False):
to_announce_capital = False
is_capital = announce_capital and text[0].isupper()
use_pitch_for_capital = False
if is_capital:
indicator = self.env["runtime"]["SettingsManager"].get_setting(
"speech", "capital_indicator"
).lower()
if indicator == "none":
pass # No indication
elif indicator == "beep":
# Play beep with interrupt=True to fix stacking
self.play_sound_icon("capital", True)
elif indicator == "pitch":
use_pitch_for_capital = True
elif indicator == "both":
self.play_sound_icon("capital", True)
use_pitch_for_capital = True
else:
# Default to pitch for unknown values
use_pitch_for_capital = True
self.last_echo = text
self.speak_text(
text, interrupt, ignore_punctuation, to_announce_capital, flush
text, interrupt, ignore_punctuation, use_pitch_for_capital, flush
)
def get_last_echo(self):

View File

@@ -23,6 +23,7 @@ settings_data = {
"rate": 0.75,
"pitch": 0.5,
"capital_pitch": 0.8,
"capital_indicator": "pitch",
"volume": 1.0,
"module": "",
"voice": "en-us",
@@ -97,11 +98,6 @@ settings_data = {
"vmenu_path": "",
"quick_menu": "speech#rate;speech#pitch;speech#volume",
},
"promote": {
"enabled": True,
"inactive_timeout_sec": 120,
"list": "",
},
"time": {
"enabled": False,
"present_time": True,

View File

@@ -4,5 +4,5 @@
# Fenrir TTY screen reader
# By Chrys, Storm Dragon, and contributors.
version = "2025.12.20"
version = "2025.12.30"
code_name = "master"