improv(network): reduce CPU usage
connections don't need to be updated when popup is closed
This commit is contained in:
parent
1034622dc4
commit
c113768ac5
2 changed files with 56 additions and 51 deletions
30
Cargo.lock
generated
30
Cargo.lock
generated
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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> {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue