pub(crate) fn is_voiceover_running() -> bool {
#[cfg(target_os = "macos")]
{
use std::process::Command;
if let Ok(output) = Command::new("pgrep").arg("-x").arg("VoiceOver").output() {
return output.status.success();
}
if let Ok(output) = Command::new("defaults")
.arg("read")
.arg("com.apple.universalaccess")
.arg("voiceOverOnOffKey")
.output()
{
if let Ok(stdout) = String::from_utf8(output.stdout) {
return stdout.trim() == "1";
}
}
}
false
}
pub(crate) fn is_windows_screen_reader_running() -> bool {
#[cfg(target_os = "windows")]
{
use std::process::Command;
let screen_readers = ["nvda", "narrator", "jfw"];
for sr in &screen_readers {
if let Ok(output) = Command::new("tasklist")
.arg("/FI")
.arg(format!("IMAGENAME eq {}.exe", sr))
.output()
{
if let Ok(stdout) = String::from_utf8(output.stdout) {
if stdout.contains(sr) {
return true;
}
}
}
}
}
false
}
pub(crate) fn is_atspi_available() -> bool {
#[cfg(target_os = "linux")]
{
use std::process::Command;
if let Ok(output) = Command::new("which").arg("spd-say").output() {
if output.status.success() {
return true;
}
}
if let Ok(output) = Command::new("pgrep").arg("-x").arg("orca").output() {
return output.status.success();
}
if let Ok(output) = Command::new("dbus-send")
.arg("--session")
.arg("--print-reply")
.arg("--dest=org.a11y.Bus")
.arg("/org/a11y/bus")
.arg("org.freedesktop.DBus.Properties.Get")
.arg("string:org.a11y.Status")
.arg("string:IsEnabled")
.output()
{
if let Ok(stdout) = String::from_utf8(output.stdout) {
return stdout.contains("true");
}
}
}
false
}