diff --git a/cosmic-settings/src/app.rs b/cosmic-settings/src/app.rs index b76b4e3..e3c4be6 100644 --- a/cosmic-settings/src/app.rs +++ b/cosmic-settings/src/app.rs @@ -42,8 +42,6 @@ use cosmic::{ #[cfg(feature = "wayland")] use cosmic_panel_config::CosmicPanelConfig; use cosmic_settings_page::{self as page, section}; -#[cfg(feature = "page-accessibility")] -use cosmic_settings_subscriptions::accessibility::subscription as a11y_subscription; #[cfg(feature = "wayland")] use desktop::{ dock, @@ -290,7 +288,9 @@ impl cosmic::Application for SettingsApp { } fn subscription(&self) -> Subscription { - Subscription::batch(vec![ + let page = &self.pages.page[self.active_page]; + + let subscriptions = vec![ #[cfg(feature = "ashpd")] crate::subscription::daytime().map(|daytime| { Message::PageMessage(pages::Message::Appearance(appearance::Message::Daytime( @@ -313,6 +313,7 @@ impl cosmic::Application for SettingsApp { // Watch for changes to installed desktop entries desktop_files(0).map(|_| Message::DesktopInfo), // Watch for configuration changes to the panel. + // TODO: This should only be active when the panel page is active. #[cfg(feature = "wayland")] self.core() .watch_config::("com.system76.CosmicPanel.Panel") @@ -323,6 +324,7 @@ impl cosmic::Application for SettingsApp { Message::PanelConfig(update.config) }), + // TODO: This should only be active when the dock page is active. #[cfg(feature = "wayland")] self.core() .watch_config::("com.system76.CosmicPanel.Dock") @@ -333,21 +335,10 @@ impl cosmic::Application for SettingsApp { Message::PanelConfig(update.config) }), - // Watch for state changes from the cosmic-bg session service. - self.core() - .watch_state::(cosmic_bg_config::NAME) - .map(|update| { - Message::PageMessage(pages::Message::DesktopWallpaper( - pages::desktop::wallpaper::Message::UpdateState(update.config), - )) - }), - #[cfg(feature = "page-accessibility")] - a11y_subscription().map(|m| { - Message::PageMessage(pages::Message::Accessibility( - pages::accessibility::Message::DBusUpdate(m), - )) - }), - ]) + page.subscription(self.core()).map(Message::PageMessage), + ]; + + Subscription::batch(subscriptions) } #[allow(clippy::too_many_lines)] diff --git a/cosmic-settings/src/pages/accessibility/mod.rs b/cosmic-settings/src/pages/accessibility/mod.rs index 7bfed3e..37d9026 100644 --- a/cosmic-settings/src/pages/accessibility/mod.rs +++ b/cosmic-settings/src/pages/accessibility/mod.rs @@ -13,7 +13,9 @@ use cosmic_settings_page::{ self as page, Insert, section::{self, Section}, }; -use cosmic_settings_subscriptions::accessibility::{DBusRequest, DBusUpdate}; +use cosmic_settings_subscriptions::accessibility::{ + DBusRequest, DBusUpdate, subscription as a11y_subscription, +}; use cosmic_settings_subscriptions::cosmic_a11y_manager; use num_traits::FromPrimitive; use slotmap::SlotMap; @@ -88,6 +90,18 @@ pub enum Message { ScreenReaderEnabled(bool), } +impl From for crate::pages::Message { + fn from(message: Message) -> Self { + crate::pages::Message::Accessibility(message) + } +} + +impl From for crate::app::Message { + fn from(message: Message) -> Self { + crate::app::Message::PageMessage(message.into()) + } +} + impl page::Page for Page { fn set_id(&mut self, entity: page::Entity) { self.entity = entity; @@ -150,6 +164,13 @@ impl page::Page for Page { cosmic::Task::none() } + + fn subscription( + &self, + _core: &cosmic::Core, + ) -> cosmic::iced::Subscription { + a11y_subscription().map(|m| super::Message::Accessibility(Message::DBusUpdate(m))) + } } impl page::AutoBind for Page { diff --git a/cosmic-settings/src/pages/desktop/wallpaper/mod.rs b/cosmic-settings/src/pages/desktop/wallpaper/mod.rs index 7dd5d43..ef667ab 100644 --- a/cosmic-settings/src/pages/desktop/wallpaper/mod.rs +++ b/cosmic-settings/src/pages/desktop/wallpaper/mod.rs @@ -293,6 +293,17 @@ impl page::Page for Page { .title(fl!("color-picker")) }) } + + /// Watch for state changes from the cosmic-bg session service. + fn subscription( + &self, + core: &cosmic::Core, + ) -> cosmic::iced::Subscription { + core.watch_state::(cosmic_bg_config::NAME) + .map(|update| { + crate::pages::Message::DesktopWallpaper(Message::UpdateState(update.config)) + }) + } } impl page::AutoBind for Page {} diff --git a/page/src/lib.rs b/page/src/lib.rs index 1a2465a..23f894d 100644 --- a/page/src/lib.rs +++ b/page/src/lib.rs @@ -5,7 +5,7 @@ mod binder; pub use binder::{AutoBind, Binder}; mod insert; -use cosmic::{Element, Task, app::ContextDrawer}; +use cosmic::{Element, Task, app::ContextDrawer, iced::Subscription}; use downcast_rs::{Downcast, impl_downcast}; pub use insert::Insert; @@ -89,6 +89,12 @@ pub trait Page: Downcast { Task::none() } + /// Subscription unique to the page when it is active. + #[inline] + fn subscription(&self, _core: &cosmic::Core) -> Subscription { + Subscription::none() + } + /// Assigns the entity ID of the page to the page. #[allow(unused)] #[inline]