improv(network): reduce CPU usage

connections don't need to be updated when popup is closed
This commit is contained in:
Ashley Wulber 2026-01-06 13:53:20 -05:00 • committed by Michael Murphy
parent 1034622dc4
commit c113768ac5
2 changed files with 56 additions and 51 deletions

30
Cargo.lock generated
View file

@ -1516,7 +1516,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-config" name = "cosmic-config"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"atomicwrites", "atomicwrites",
"cosmic-config-derive", "cosmic-config-derive",
@ -1537,7 +1537,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-config-derive" name = "cosmic-config-derive"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"quote", "quote",
"syn 2.0.111", "syn 2.0.111",
@ -1802,7 +1802,7 @@ dependencies = [
[[package]] [[package]]
name = "cosmic-theme" name = "cosmic-theme"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"almost", "almost",
"cosmic-config", "cosmic-config",
@ -3169,7 +3169,7 @@ dependencies = [
[[package]] [[package]]
name = "iced" name = "iced"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"dnd", "dnd",
"iced_accessibility", "iced_accessibility",
@ -3187,7 +3187,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_accessibility" name = "iced_accessibility"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"accesskit", "accesskit",
"accesskit_winit", "accesskit_winit",
@ -3196,7 +3196,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_core" name = "iced_core"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"bitflags 2.10.0", "bitflags 2.10.0",
"bytes", "bytes",
@ -3220,7 +3220,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_futures" name = "iced_futures"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"futures", "futures",
"iced_core", "iced_core",
@ -3246,7 +3246,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_graphics" name = "iced_graphics"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"bitflags 2.10.0", "bitflags 2.10.0",
"bytemuck", "bytemuck",
@ -3268,7 +3268,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_renderer" name = "iced_renderer"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"iced_graphics", "iced_graphics",
"iced_tiny_skia", "iced_tiny_skia",
@ -3280,7 +3280,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_runtime" name = "iced_runtime"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"bytes", "bytes",
"cosmic-client-toolkit", "cosmic-client-toolkit",
@ -3295,7 +3295,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_tiny_skia" name = "iced_tiny_skia"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"cosmic-text", "cosmic-text",
@ -3311,7 +3311,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_wgpu" name = "iced_wgpu"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"as-raw-xcb-connection", "as-raw-xcb-connection",
"bitflags 2.10.0", "bitflags 2.10.0",
@ -3342,7 +3342,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_widget" name = "iced_widget"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"cosmic-client-toolkit", "cosmic-client-toolkit",
"dnd", "dnd",
@ -3361,7 +3361,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_winit" name = "iced_winit"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"cosmic-client-toolkit", "cosmic-client-toolkit",
"dnd", "dnd",
@ -4125,7 +4125,7 @@ checksum = "37c93d8daa9d8a012fd8ab92f088405fb202ea0b6ab73ee2482ae66af4f42091"
[[package]] [[package]]
name = "libcosmic" name = "libcosmic"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/pop-os/libcosmic#421552dea1c06e876d5999333794b9ee918340a1" source = "git+https://github.com/pop-os/libcosmic#f6039597b72d3eefe2ee1d6528a04077982db238"
dependencies = [ dependencies = [
"apply", "apply",
"ashpd 0.12.0", "ashpd 0.12.0",

View file

@ -15,6 +15,7 @@ use std::{
borrow::Cow, borrow::Cow,
collections::{BTreeMap, BTreeSet}, collections::{BTreeMap, BTreeSet},
sync::{Arc, LazyLock}, sync::{Arc, LazyLock},
time::Duration,
}; };
use cosmic::{ use cosmic::{
@ -590,25 +591,42 @@ pub fn update_devices(conn: zbus::Connection) -> Task<Message> {
impl CosmicNetworkApplet { impl CosmicNetworkApplet {
fn connect(&mut self, conn: zbus::Connection) -> Task<Message> { fn connect(&mut self, conn: zbus::Connection) -> Task<Message> {
if self.nm_task.is_none() { if self.nm_task.is_none() {
let popup = self.popup;
let (canceller, task) = crate::utils::forward_event_loop(move |emitter| async move { let (canceller, task) = crate::utils::forward_event_loop(move |emitter| async move {
let (tx, mut rx) = futures::channel::mpsc::channel(1); let (tx, mut rx) = futures::channel::mpsc::channel(1);
let watchers = std::pin::pin!(async move { if popup.is_some() {
futures::join!( let watchers = std::pin::pin!(async move {
network_manager::watch(conn.clone(), tx.clone()), futures::join!(
network_manager::active_conns::watch(conn.clone(), tx.clone()), network_manager::watch(conn.clone(), tx.clone()),
network_manager::wireless_enabled::watch(conn.clone(), tx.clone()), network_manager::active_conns::watch(conn.clone(), tx.clone(),),
network_manager::watch_connections_changed(conn, tx) network_manager::wireless_enabled::watch(conn.clone(), tx.clone()),
); network_manager::watch_connections_changed(conn, tx,)
}); );
});
let forwarder = std::pin::pin!(async move {
while let Some(message) = rx.next().await {
_ = emitter.emit(Message::NetworkManager(message)).await;
}
});
let forwarder = std::pin::pin!(async move { futures::future::select(watchers, forwarder).await;
while let Some(message) = rx.next().await { } else {
_ = emitter.emit(Message::NetworkManager(message)).await; let watchers = std::pin::pin!(async move {
} futures::join!(
}); network_manager::watch(conn.clone(), tx.clone()),
network_manager::active_conns::watch(conn.clone(), tx.clone(),),
network_manager::wireless_enabled::watch(conn.clone(), tx.clone()),
);
});
let forwarder = std::pin::pin!(async move {
while let Some(message) = rx.next().await {
_ = emitter.emit(Message::NetworkManager(message)).await;
}
});
futures::future::select(watchers, forwarder).await; futures::future::select(watchers, forwarder).await;
};
}); });
self.nm_task = Some(canceller); self.nm_task = Some(canceller);
@ -802,15 +820,7 @@ impl cosmic::Application for CosmicNetworkApplet {
None, None,
); );
if let Some(tx) = self.nm_sender.as_mut() { tasks.push(system_conn());
if let Err(err) = tx.unbounded_send(network_manager::Request::Reload) {
if err.is_disconnected() {
return system_conn().map(cosmic::Action::App);
}
tracing::error!("{err:?}");
}
}
tasks.push(get_popup(popup_settings)); tasks.push(get_popup(popup_settings));
return Task::batch(tasks).map(cosmic::Action::App); return Task::batch(tasks).map(cosmic::Action::App);
@ -898,13 +908,15 @@ impl cosmic::Application for CosmicNetworkApplet {
self.new_connection = None; self.new_connection = None;
} }
Message::CloseRequested(id) => { Message::CloseRequested(id) => {
if let Some(cancel) = self.nm_task.take() {
_ = cancel.send(());
}
if Some(id) == self.popup { if Some(id) == self.popup {
self.popup = None; self.popup = None;
if let Some(cancel) = self.nm_task.take() {
_ = cancel.send(());
}
self.secret_tx = None;
return system_conn().map(cosmic::Action::App);
} }
self.secret_tx = None;
} }
Message::OpenSettings => { Message::OpenSettings => {
let exec = "cosmic-settings network".to_string(); let exec = "cosmic-settings network".to_string();
@ -1972,15 +1984,8 @@ impl cosmic::Application for CosmicNetworkApplet {
.as_subscription() .as_subscription()
.map(|(_, now)| Message::Frame(now)); .map(|(_, now)| Message::Frame(now));
let token_sub = activation_token_subscription(0).map(Message::Token); let token_sub = activation_token_subscription(0).map(Message::Token);
if let Some((conn, id)) = self.conn.clone().zip(self.popup.as_ref()) {
Subscription::batch([ Subscription::batch([timeline, token_sub])
active_conns_subscription(*id, conn).map(|e| Message::NetworkManager(e)),
timeline,
token_sub,
])
} else {
Subscription::batch([timeline, token_sub])
}
} }
fn style(&self) -> Option<cosmic::iced_runtime::Appearance> { fn style(&self) -> Option<cosmic::iced_runtime::Appearance> {