From 72721abb22ad11ecf850690afe85ea53ec5c893c Mon Sep 17 00:00:00 2001 From: Storm Dragon Date: Sun, 9 Mar 2025 23:00:32 -0400 Subject: [PATCH] Toggle screen reader is now a gui, so you can see which one is currently running and switch if you want. --- scripts/toggle_screenreader.sh | 103 +++++++++++++++++++++++++-------- 1 file changed, 80 insertions(+), 23 deletions(-) diff --git a/scripts/toggle_screenreader.sh b/scripts/toggle_screenreader.sh index ed5fb5e..4755479 100755 --- a/scripts/toggle_screenreader.sh +++ b/scripts/toggle_screenreader.sh @@ -1,47 +1,104 @@ #!/usr/bin/env bash # This file is part of I38. - +# # I38 is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, # either version 3 of the License, or (at your option) any later version. - +# # I38 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR # PURPOSE. See the GNU General Public License for more details. - +# # You should have received a copy of the GNU General Public License along with I38. If not, see . -#!/bin/bash - -# Function to check if a process is running is_running() { pgrep -x "$1" >/dev/null return $? } -# Speak messages speak() { spd-say -P important -Cw -- "$*" } -# Make sure both screen readers are available -for i in $(command -v cthulhu 2> /dev/null) $(command -v orca 2> /dev/null) ; do - if ! command -v "$i" &> /dev/null ; then - speak "${i##*/} not found, cannot switch to it." - exit 1 - fi -done +# Make sure screen readers are available +orcaAvailable=false +cthulhuAvailable=false -# Toggle between screen readers +if command -v orca &> /dev/null; then + orcaAvailable=true +fi + +if command -v cthulhu &> /dev/null; then + cthulhuAvailable=true +fi + +# Check if at least one screen reader is available +if ! $orcaAvailable && ! $cthulhuAvailable; then + speak "No screen readers found. Please install Orca or Cthulhu." + yad --center --title="I38" --alert="No screen readers found.\nPlease install Orca or Cthulhu." + exit 1 +fi + +# Determine current state +currentReader="none" if is_running "cthulhu"; then - speak "Switching from Cthulhu to Orca..." - pkill -15 cthulhu - sleep .5 - command orca & + currentReader="cthulhu" elif is_running "orca"; then - speak "Switching from Orca to Cthulhu..." - pkill -15 orca - sleep .5 - command cthulhu & + currentReader="orca" +fi + +# Build YAD command based on available screen readers +items=() + +# First add the currently active screen reader +if [ "$currentReader" != "none" ]; then + if [ "$currentReader" = "cthulhu" ] && $cthulhuAvailable; then + items+=("Cthulhu (active)" "cthulhu") + elif [ "$currentReader" = "orca" ] && $orcaAvailable; then + items+=("Orca (active)" "orca") + fi +fi + +if $cthulhuAvailable && [ "$currentReader" != "cthulhu" ]; then + items+=("Cthulhu" "cthulhu") +fi + +if $orcaAvailable && [ "$currentReader" != "orca" ]; then + items+=("Orca" "orca") +fi + +# Display the dialog +result=$(yad --center --title="Screen Reader Toggle" --text="Select screen reader:" \ + --list --on-top --skip-taskbar \ + --button="Cancel:1" --button="OK:0" \ + --column="Screen Reader" --column=ID:HD "${items[@]}") +exitCode=$? +if [ $exitCode -ne 0 ]; then + exit 0 +fi + +if [ -n "$result" ]; then + # Extract the selected reader from the result + selectedReader=$(echo "$result" | cut -d'|' -f2) + + # Don't do anything if selecting the already active reader + if [ "$selectedReader" = "$currentReader" ]; then + exit 0 + fi + + # Stop current screen reader + if [ "$currentReader" != "none" ]; then + speak "Switching from $currentReader to $selectedReader." + pkill -15 "$currentReader" + sleep 0.5 + else + speak "Starting $selectedReader." + fi + + if [ "$selectedReader" = "orca" ]; then + orca & + else + cthulhu & + fi fi exit 0