From d35732d120b1a158c19cdd78da92f942cd81a096 Mon Sep 17 00:00:00 2001 From: Ashley Wulber Date: Tue, 10 Jan 2023 13:19:59 -0500 Subject: [PATCH] refactor nm state --- Cargo.lock | 75 +++++++-------- cosmic-applet-network/src/app.rs | 91 ++++++++----------- .../src/network_manager/mod.rs | 6 ++ 3 files changed, 84 insertions(+), 88 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f13c5529..e2042f86 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -567,6 +567,7 @@ dependencies = [ name = "cosmic-applet-network" version = "0.1.0" dependencies = [ + "anyhow", "cosmic-dbus-networkmanager", "futures", "futures-util", @@ -655,7 +656,7 @@ dependencies = [ [[package]] name = "cosmic-dbus-networkmanager" version = "0.1.0" -source = "git+https://github.com/pop-os/dbus-settings-bindings?branch=main#5adeb6dc11fd11d26d09ec35c25b93866bb21d31" +source = "git+https://github.com/pop-os/dbus-settings-bindings?branch=main#95f6d5e9ac86dfa5902ac74dee85b1a8cfc035fd" dependencies = [ "bitflags", "derive_builder", @@ -821,9 +822,9 @@ checksum = "b365fabc795046672053e29c954733ec3b05e4be654ab130fe8f1f94d7051f35" [[package]] name = "cxx" -version = "1.0.85" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5add3fc1717409d029b20c5b6903fc0c0b02fa6741d820054f4a2efa5e5816fd" +checksum = "51d1075c37807dcf850c379432f0df05ba52cc30f279c5cfc43cc221ce7f8579" dependencies = [ "cc", "cxxbridge-flags", @@ -833,9 +834,9 @@ dependencies = [ [[package]] name = "cxx-build" -version = "1.0.85" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c87959ba14bc6fbc61df77c3fcfe180fc32b93538c4f1031dd802ccb5f2ff0" +checksum = "5044281f61b27bc598f2f6647d480aed48d2bf52d6eb0b627d84c0361b17aa70" dependencies = [ "cc", "codespan-reporting", @@ -848,15 +849,15 @@ dependencies = [ [[package]] name = "cxxbridge-flags" -version = "1.0.85" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69a3e162fde4e594ed2b07d0f83c6c67b745e7f28ce58c6df5e6b6bef99dfb59" +checksum = "61b50bc93ba22c27b0d31128d2d130a0a6b3d267ae27ef7e4fae2167dfe8781c" [[package]] name = "cxxbridge-macro" -version = "1.0.85" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e7e2adeb6a0d4a282e581096b06e1791532b7d576dcde5ccd9382acf55db8e6" +checksum = "39e61fda7e62115119469c7b3591fd913ecca96fb766cfd3f2e2502ab7bc87a5" dependencies = [ "proc-macro2", "quote", @@ -1849,9 +1850,9 @@ dependencies = [ [[package]] name = "half" -version = "2.2.0" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c467d36af040b7b2681f5fddd27427f6da8d3d072f575a265e181d2f8e8d157" +checksum = "02b4af3693f1b705df946e9fe5631932443781d0aabb423b62fcd4d73f6d2fd0" dependencies = [ "crunchy", ] @@ -1912,9 +1913,9 @@ dependencies = [ [[package]] name = "i18n-config" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62affcd43abfb51f3cbd8736f9407908dc5b44fc558a9be07460bbfd104d983" +checksum = "3d9f93ceee6543011739bc81699b5e0cf1f23f3a80364649b6d80de8636bc8df" dependencies = [ "log", "serde", @@ -1926,9 +1927,9 @@ dependencies = [ [[package]] name = "i18n-embed" -version = "0.13.4" +version = "0.13.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7f21ed76e44de8ac3dfa36bb37ab2e6480be0dc75c612474949be1f3cb2c253" +checksum = "79ff7e6b37b61834ec97fc945d391315188d8bb87aa1d48f10f295e73a5f5bec" dependencies = [ "fluent", "fluent-langneg", @@ -1947,9 +1948,9 @@ dependencies = [ [[package]] name = "i18n-embed-fl" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9420a9718ef9d0ab727840a398e25408ea0daff9ba3c681707ba05485face98e" +checksum = "a425b9bbdc2e4cd797a2a79528662cb61894bd36db582e48da2c56c28eb727cd" dependencies = [ "dashmap", "find-crate", @@ -2373,9 +2374,9 @@ checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" [[package]] name = "libpulse-binding" -version = "2.26.0" +version = "2.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17be42160017e0ae993c03bfdab4ecb6f82ce3f8d515bd8da8fdf18d10703663" +checksum = "1745b20bfc194ac12ef828f144f0ec2d4a7fe993281fa3567a0bd4969aee6890" dependencies = [ "bitflags", "libc", @@ -2387,9 +2388,9 @@ dependencies = [ [[package]] name = "libpulse-glib-binding" -version = "2.25.1" +version = "2.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df0e7a964c9f7e95d4f073affc19adfda009fa0d55e8831dbb66c78be1d0e6e5" +checksum = "d39d9166164cf39b619f6a029ffafac958e718a10dabdc35bcebf8f69b5fa3cf" dependencies = [ "glib", "glib-sys", @@ -2399,9 +2400,9 @@ dependencies = [ [[package]] name = "libpulse-mainloop-glib-sys" -version = "1.19.2" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36f61c4064926cc77ea14bb206a21ce1d5a06e175e5c0ce078804bb6c4527b28" +checksum = "9b97cd2ed4e84e54f3825b85648ec8637bec273ea7fcb981032b0a575dfef697" dependencies = [ "glib-sys", "libpulse-sys", @@ -2410,9 +2411,9 @@ dependencies = [ [[package]] name = "libpulse-sys" -version = "1.19.3" +version = "1.20.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991e6bd0efe2a36e6534e136e7996925e4c1a8e35b7807fe533f2beffff27c30" +checksum = "2191e6880818d1df4cf72eac8e91dce7a5a52ba0da4b2a5cdafabc22b937eadb" dependencies = [ "libc", "num-derive", @@ -2855,7 +2856,7 @@ version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a5f3c7ca08b6879e7965fb25e24d1f5eeb32ea73f9ad99b3854778a38c57e93" dependencies = [ - "ttf-parser 0.18.0", + "ttf-parser 0.18.1", ] [[package]] @@ -3274,9 +3275,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.7.0" +version = "1.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a" +checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733" dependencies = [ "aho-corasick", "memchr", @@ -4053,9 +4054,9 @@ checksum = "375812fa44dab6df41c195cd2f7fecb488f6c09fbaafb62807488cefab642bff" [[package]] name = "ttf-parser" -version = "0.18.0" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbf554b6e535f9a160b2ed4ea83f99000f21cbc0a693df26e258eaf2c226a151" +checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633" [[package]] name = "twox-hash" @@ -4079,9 +4080,9 @@ dependencies = [ [[package]] name = "typed-arena" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0685c84d5d54d1c26f7d3eb96cd41550adb97baed141a761cf335d3d33bcd0ae" +checksum = "6af6ae20167a9ece4bcb41af5b80f8a1f1df981f6391189ce00fd257af04126a" [[package]] name = "typenum" @@ -4881,7 +4882,7 @@ dependencies = [ [[package]] name = "zbus" version = "3.7.0" -source = "git+https://gitlab.freedesktop.org/dbus/zbus?branch=main#e90e72eb2d0d5f77144bf40baa7337de89932a53" +source = "git+https://gitlab.freedesktop.org/dbus/zbus?branch=main#18240526a612e56e9379f64d42c07053eed9657e" dependencies = [ "async-broadcast", "async-executor", @@ -4931,7 +4932,7 @@ dependencies = [ [[package]] name = "zbus_macros" version = "3.7.0" -source = "git+https://gitlab.freedesktop.org/dbus/zbus?branch=main#e90e72eb2d0d5f77144bf40baa7337de89932a53" +source = "git+https://gitlab.freedesktop.org/dbus/zbus?branch=main#18240526a612e56e9379f64d42c07053eed9657e" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -4954,7 +4955,7 @@ dependencies = [ [[package]] name = "zbus_names" version = "2.5.0" -source = "git+https://gitlab.freedesktop.org/dbus/zbus?branch=main#e90e72eb2d0d5f77144bf40baa7337de89932a53" +source = "git+https://gitlab.freedesktop.org/dbus/zbus?branch=main#18240526a612e56e9379f64d42c07053eed9657e" dependencies = [ "serde", "static_assertions", @@ -4984,7 +4985,7 @@ dependencies = [ [[package]] name = "zvariant" version = "3.10.0" -source = "git+https://gitlab.freedesktop.org/dbus/zbus?branch=main#e90e72eb2d0d5f77144bf40baa7337de89932a53" +source = "git+https://gitlab.freedesktop.org/dbus/zbus?branch=main#18240526a612e56e9379f64d42c07053eed9657e" dependencies = [ "byteorder", "enumflags2", @@ -5009,7 +5010,7 @@ dependencies = [ [[package]] name = "zvariant_derive" version = "3.10.0" -source = "git+https://gitlab.freedesktop.org/dbus/zbus?branch=main#e90e72eb2d0d5f77144bf40baa7337de89932a53" +source = "git+https://gitlab.freedesktop.org/dbus/zbus?branch=main#18240526a612e56e9379f64d42c07053eed9657e" dependencies = [ "proc-macro-crate", "proc-macro2", diff --git a/cosmic-applet-network/src/app.rs b/cosmic-applet-network/src/app.rs index 2c478105..53b32726 100644 --- a/cosmic-applet-network/src/app.rs +++ b/cosmic-applet-network/src/app.rs @@ -68,12 +68,8 @@ struct CosmicNetworkApplet { popup: Option, id_ctr: u32, applet_helper: CosmicAppletHelper, - // STATE - airplane_mode: bool, - wifi: bool, - wireless_access_points: Vec, - active_conns: Vec, - known_access_points: Vec, + nm_state: NetworkManagerState, + // UI state nm_sender: Option>, show_visible_networks: bool, new_connection: Option, @@ -82,6 +78,7 @@ struct CosmicNetworkApplet { impl CosmicNetworkApplet { fn update_icon_name(&mut self) { self.icon_name = self + .nm_state .active_conns .iter() .fold("network-offline-symbolic", |icon_name, conn| { @@ -166,56 +163,42 @@ impl Application for CosmicNetworkApplet { Message::Errored(_) => todo!(), Message::Ignore => {} Message::ToggleAirplaneMode(enabled) => { - self.airplane_mode = enabled; + self.nm_state.airplane_mode = enabled; if let Some(tx) = self.nm_sender.as_mut() { let _ = tx.unbounded_send(NetworkManagerRequest::SetAirplaneMode(enabled)); } } Message::ToggleWiFi(enabled) => { - self.wifi = enabled; + if !enabled { + self.nm_state.clear(); + } + self.nm_state.wifi_enabled = enabled; + if let Some(tx) = self.nm_sender.as_mut() { let _ = tx.unbounded_send(NetworkManagerRequest::SetWiFi(enabled)); } } Message::NetworkManagerEvent(event) => match event { - NetworkManagerEvent::Init { - sender, - state: - NetworkManagerState { - wireless_access_points, - active_conns, - known_access_points, - wifi_enabled, - airplane_mode, - }, - } => { + NetworkManagerEvent::Init { sender, state } => { self.nm_sender.replace(sender); - self.wireless_access_points = wireless_access_points; - self.active_conns = active_conns; - self.wifi = wifi_enabled; - self.airplane_mode = airplane_mode; + self.nm_state = state; self.update_icon_name(); - self.known_access_points = known_access_points; } NetworkManagerEvent::WiFiEnabled(enabled) => { - self.wifi = enabled; + if !enabled { + self.nm_state.clear(); + } + self.nm_state.wifi_enabled = enabled; } NetworkManagerEvent::WirelessAccessPoints(access_points) => { - self.wireless_access_points = access_points; + self.nm_state.wireless_access_points = access_points; } NetworkManagerEvent::ActiveConns(conns) => { - self.active_conns = conns; + self.nm_state.active_conns = conns; self.update_icon_name(); } NetworkManagerEvent::RequestResponse { - state: - NetworkManagerState { - wireless_access_points, - active_conns, - known_access_points, - wifi_enabled, - airplane_mode, - }, + state, success, req, } => { @@ -225,16 +208,12 @@ impl Application for CosmicNetworkApplet { | NetworkManagerRequest::SetWiFi(_) => {} NetworkManagerRequest::SelectAccessPoint(_) | NetworkManagerRequest::Password(_, _) => { + dbg!("success"); + dbg!(&state); self.new_connection.take(); self.show_visible_networks = false; } } - self.wireless_access_points = wireless_access_points; - self.active_conns = active_conns; - self.known_access_points = known_access_points; - self.airplane_mode = airplane_mode; - self.wifi = wifi_enabled; - self.update_icon_name(); } else { match req { NetworkManagerRequest::SetAirplaneMode(_) @@ -259,6 +238,8 @@ impl Application for CosmicNetworkApplet { } } } + self.nm_state = state; + self.update_icon_name(); } }, Message::SelectWirelessAccessPoint(access_point) => { @@ -346,7 +327,7 @@ impl Application for CosmicNetworkApplet { SurfaceIdWrapper::Popup(_) => { let mut vpn_ethernet_col = column![]; let mut known_wifi = column![]; - for conn in &self.active_conns { + for conn in &self.nm_state.active_conns { match conn { ActiveConnectionInfo::Vpn { name, ip_addresses } => { let mut ipv4 = column![]; @@ -432,7 +413,7 @@ impl Application for CosmicNetworkApplet { } }; } - for known in &self.known_access_points { + for known in &self.nm_state.known_access_points { let mut btn = button(Button::Secondary) .custom(vec![ icon("network-wireless-symbolic", 24) @@ -469,7 +450,7 @@ impl Application for CosmicNetworkApplet { let mut content = column![ vpn_ethernet_col, container( - toggler(fl!("airplane-mode"), self.airplane_mode, |m| { + toggler(fl!("airplane-mode"), self.nm_state.airplane_mode, |m| { Message::ToggleAirplaneMode(m) }) .width(Length::Fill) @@ -477,8 +458,10 @@ impl Application for CosmicNetworkApplet { .padding([0, 12]), horizontal_rule(1), container( - toggler(fl!("wifi"), self.wifi, |m| { Message::ToggleWiFi(m) }) - .width(Length::Fill) + toggler(fl!("wifi"), self.nm_state.wifi_enabled, |m| { + Message::ToggleWiFi(m) + }) + .width(Length::Fill) ) .padding([0, 12]), horizontal_rule(1), @@ -579,7 +562,6 @@ impl Application for CosmicNetworkApplet { ] .align_items(Alignment::Center) .width(Length::Fill) - .padding([0, 24]) .spacing(12); let connecting = row![ id, @@ -589,7 +571,9 @@ impl Application for CosmicNetworkApplet { })) .width(Length::Units(24)) .height(Length::Units(24)), - ]; + ] + .spacing(8) + .padding([0, 24]); content = content.push(connecting); } NewConnectionState::Failure(access_point) => { @@ -632,10 +616,15 @@ impl Application for CosmicNetworkApplet { content = content.push(col); } } - } else if self.wifi { + } else if self.nm_state.wifi_enabled { let mut list_col = column![]; - for ap in &self.wireless_access_points { - if self.active_conns.iter().any(|a| ap.ssid == a.name()) { + for ap in &self.nm_state.wireless_access_points { + if self + .nm_state + .active_conns + .iter() + .any(|a| ap.ssid == a.name()) + { continue; } let button = button(button_style) diff --git a/cosmic-applet-network/src/network_manager/mod.rs b/cosmic-applet-network/src/network_manager/mod.rs index 6ea50ac0..f7e30c9c 100644 --- a/cosmic-applet-network/src/network_manager/mod.rs +++ b/cosmic-applet-network/src/network_manager/mod.rs @@ -539,4 +539,10 @@ impl NetworkManagerState { _self.known_access_points = known_access_points; Ok(_self) } + + pub fn clear(&mut self) { + self.active_conns = Vec::new(); + self.known_access_points = Vec::new(); + self.wireless_access_points = Vec::new(); + } }