From cc25cdd08e0bba798acc60925d136434f1aa9c02 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Thu, 27 Mar 2025 18:50:40 -0400 Subject: [PATCH] feat(a11y): mono sound toggle --- Cargo.lock | 11 +++++ cosmic-settings/Cargo.toml | 2 + .../src/pages/accessibility/mod.rs | 44 ++++++++++++++++++- i18n/en/cosmic_settings.ftl | 4 ++ 4 files changed, 59 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index e27fe72..8460dd2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1676,6 +1676,7 @@ dependencies = [ "cosmic-randr", "cosmic-randr-shell", "cosmic-settings-config", + "cosmic-settings-daemon-config", "cosmic-settings-page", "cosmic-settings-subscriptions", "cosmic-settings-system", @@ -1753,6 +1754,16 @@ dependencies = [ "zbus 4.4.0", ] +[[package]] +name = "cosmic-settings-daemon-config" +version = "0.1.0" +source = "git+https://github.com/pop-os/cosmic-settings-daemon?branch=sound-mono#d9056a0fd2ff2b404e54c455ec9c00fc4028aba9" +dependencies = [ + "cosmic-config", + "ron 0.8.1", + "serde", +] + [[package]] name = "cosmic-settings-page" version = "0.1.0" diff --git a/cosmic-settings/Cargo.toml b/cosmic-settings/Cargo.toml index 0b5a5ad..2a63f5e 100644 --- a/cosmic-settings/Cargo.toml +++ b/cosmic-settings/Cargo.toml @@ -28,6 +28,7 @@ cosmic-settings-config = { git = "https://github.com/pop-os/cosmic-settings-daem cosmic-settings-page = { path = "../page" } cosmic-settings-system = { path = "../pages/system", optional = true } cosmic-settings-wallpaper = { path = "../pages/wallpapers" } +cosmic-settings-daemon-config = { git = "https://github.com/pop-os/cosmic-settings-daemon", optional = true, branch = "sound-mono" } derivative = "2.2.0" derive_setters = "0.1.6" dirs = "5.0.1" @@ -137,6 +138,7 @@ page-accessibility = [ "dep:cosmic-comp-config", "dep:cosmic-protocols", "dep:cosmic-settings-config", + "dep:cosmic-settings-daemon-config", "dep:sctk", ] page-about = ["dep:cosmic-settings-system", "dep:hostname1-zbus", "dep:zbus"] diff --git a/cosmic-settings/src/pages/accessibility/mod.rs b/cosmic-settings/src/pages/accessibility/mod.rs index 3ab609d..39108ab 100644 --- a/cosmic-settings/src/pages/accessibility/mod.rs +++ b/cosmic-settings/src/pages/accessibility/mod.rs @@ -8,6 +8,7 @@ use cosmic::{ }; pub use cosmic_comp_config::ZoomMovement; use cosmic_config::CosmicConfigEntry; +use cosmic_settings_daemon_config::CosmicSettingsDaemonConfig; use cosmic_settings_page::{ self as page, Insert, section::{self, Section}, @@ -32,10 +33,13 @@ pub struct Page { wayland_thread: Option, theme: Box, high_contrast: Option, + daemon_config: CosmicSettingsDaemonConfig, + daemon_helper: cosmic_config::Config, } impl Default for Page { fn default() -> Self { + let daemon_helper = CosmicSettingsDaemonConfig::config().unwrap(); Page { entity: page::Entity::default(), magnifier_state: false, @@ -55,6 +59,9 @@ impl Default for Page { wayland_thread: None, theme: Box::default(), high_contrast: None, + daemon_config: CosmicSettingsDaemonConfig::get_entry(&daemon_helper) + .unwrap_or_default(), + daemon_helper, } } } @@ -70,6 +77,7 @@ pub enum Message { SetScreenFilterActive(bool), SetScreenFilterSelection(ColorFilter), Surface(surface::Action), + SetSoundMono(bool), } impl page::Page for Page { @@ -89,7 +97,7 @@ impl page::Page for Page { &self, sections: &mut SlotMap>, ) -> Option { - Some(vec![sections.insert(vision())]) + Some(vec![sections.insert(vision()), sections.insert(hearing())]) } fn on_enter(&mut self) -> cosmic::Task { @@ -250,6 +258,31 @@ pub fn vision() -> section::Section { }) } +pub fn hearing() -> section::Section { + crate::slab!(descriptions { + hearing = fl!("hearing"); + mono = fl!("hearing", "mono"); + }); + + Section::default() + .title(&descriptions[hearing]) + .descriptions(descriptions) + .view::(move |_, page, section| { + let descriptions = §ion.descriptions; + + settings::section() + .title(§ion.title) + .add( + cosmic::Element::from( + settings::item::builder(&descriptions[mono]) + .toggler(page.daemon_config.mono_sound, Message::SetSoundMono), + ) + .map(crate::pages::Message::Accessibility), + ) + .into() + }) +} + impl Page { pub fn update(&mut self, message: Message) -> cosmic::iced::Task { match message { @@ -363,8 +396,15 @@ impl Page { Message::Surface(a) => { return cosmic::task::message(crate::app::Message::Surface(a)); } + Message::SetSoundMono(active) => { + if let Err(err) = self + .daemon_config + .set_mono_sound(&self.daemon_helper, active) + { + tracing::error!("{err:?}"); + } + } } - cosmic::iced::Task::none() } } diff --git a/i18n/en/cosmic_settings.ftl b/i18n/en/cosmic_settings.ftl index 04994fb..45284f3 100644 --- a/i18n/en/cosmic_settings.ftl +++ b/i18n/en/cosmic_settings.ftl @@ -138,6 +138,10 @@ accessibility = Accessibility .high-contrast = High contrast mode .invert-colors = Invert Colors .color-filters = Color filters + +hearing = Hearing + .mono = Play stereo audio as mono + default = Default magnifier = Magnifier .controls = Or use these shortcuts: { $zoom_in ->