Use subscriptions to monitor cosmic-panel configs

This commit is contained in:
Ian Douglas Scott 2025-11-10 14:40:01 -08:00 committed by Ian Douglas Scott
parent e56db2bae8
commit 41a940660c
3 changed files with 65 additions and 0 deletions

24
Cargo.lock generated
View file

@ -1149,6 +1149,20 @@ dependencies = [
"xdg",
]
[[package]]
name = "cosmic-panel-config"
version = "0.1.0"
source = "git+https://github.com/pop-os/cosmic-panel#8f445a4ce944b6422e6310da06ad15a311c2bbf8"
dependencies = [
"anyhow",
"cosmic-config",
"serde",
"smithay-client-toolkit 0.20.0",
"tracing",
"wayland-protocols-wlr",
"xdg-shell-wrapper-config",
]
[[package]]
name = "cosmic-protocols"
version = "0.1.0"
@ -1238,6 +1252,7 @@ dependencies = [
"cosmic-comp-config",
"cosmic-config",
"cosmic-freedesktop-icons",
"cosmic-panel-config",
"delegate",
"env_logger",
"futures-channel",
@ -6765,6 +6780,15 @@ dependencies = [
"windows-sys 0.59.0",
]
[[package]]
name = "xdg-shell-wrapper-config"
version = "0.1.0"
source = "git+https://github.com/pop-os/cosmic-panel#8f445a4ce944b6422e6310da06ad15a311c2bbf8"
dependencies = [
"serde",
"wayland-protocols-wlr",
]
[[package]]
name = "xkbcommon"
version = "0.7.0"

View file

@ -39,6 +39,7 @@ zbus = "5.9.0"
tokio-stream = { version = "0.1.17", features = ["sync"] }
ash = { version = "0.38.0", features = ["loaded"] }
bytemuck = "1.23.2"
cosmic-panel-config = { git = "https://github.com/pop-os/cosmic-panel" }
[dependencies.i18n-embed]
version = "0.16"

View file

@ -31,6 +31,7 @@ use cosmic::{
};
use cosmic_comp_config::CosmicCompConfig;
use cosmic_config::{CosmicConfigEntry, cosmic_config_derive::CosmicConfigEntry};
use cosmic_panel_config::{CosmicPanelConfig, CosmicPanelContainerConfigEntry};
use i18n_embed::DesktopLanguageRequester;
use std::{
collections::{HashMap, HashSet},
@ -117,6 +118,8 @@ enum Msg {
EnteredWorkspaceSidebarEntry(ExtWorkspaceHandleV1, bool),
DbusInterface(zbus::Result<dbus::Interface>),
DBus(dbus::Event),
PanelContainerEntries(Vec<String>),
PanelConfig(CosmicPanelConfig),
Ignore,
}
@ -196,6 +199,7 @@ struct App {
drop_target: Option<DropTarget>,
scroll: Option<(f32, Instant)>,
dbus_interface: Option<dbus::Interface>,
panel_configs: HashMap<String, Option<CosmicPanelConfig>>,
}
#[derive(Debug, Default)]
@ -735,6 +739,17 @@ impl Application for App {
dbus::Event::Hide => self.hide(),
};
}
Msg::PanelContainerEntries(entries) => {
self.panel_configs.retain(|k, _| entries.contains(&k));
for entry in entries {
if !self.panel_configs.contains_key(&entry) {
self.panel_configs.insert(entry, None);
}
}
}
Msg::PanelConfig(config) => {
self.panel_configs.insert(config.name.clone(), Some(config));
}
Msg::Ignore => {}
}
@ -822,6 +837,7 @@ impl Application for App {
if let Some(interface) = &self.dbus_interface {
subscriptions.push(interface.subscription().map(Msg::DBus));
}
subscriptions.push(panel_subscriptions(self.panel_configs.keys()));
iced::Subscription::batch(subscriptions)
}
@ -850,6 +866,30 @@ impl Application for App {
}
}
fn panel_subscriptions<'a>(
container_entries: impl Iterator<Item = &'a String>,
) -> Subscription<Msg> {
let mut subscriptions = vec![
cosmic_config::config_subscription::<_, CosmicPanelContainerConfigEntry>(
"panel-config-subscription",
"com.system76.CosmicPanel".into(),
1,
)
.map(|update| Msg::PanelContainerEntries(update.config.entries)),
];
for entry in container_entries {
subscriptions.push(
cosmic_config::config_subscription::<_, CosmicPanelConfig>(
("panel-config-subscription", entry.to_owned()),
format!("com.system76.CosmicPanel.{}", entry).into(),
1,
)
.map(|update| Msg::PanelConfig(update.config)),
);
}
iced::Subscription::batch(subscriptions)
}
fn init_localizer() {
let localizer = crate::localize::localizer();
let requested_languages = DesktopLanguageRequester::requested_languages();