From db88e12b8e3ba01c520d5aced852e8682f294616 Mon Sep 17 00:00:00 2001 From: Reinout Meliesie Date: Thu, 4 Sep 2025 14:54:23 +0200 Subject: [PATCH] refactor(networkmanager): identify devices by their number outside of the client --- src/clients/networkmanager/event.rs | 4 ++-- src/clients/networkmanager/mod.rs | 26 ++++++++++++++++---------- src/modules/networkmanager.rs | 16 ++++++++-------- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/src/clients/networkmanager/event.rs b/src/clients/networkmanager/event.rs index 85293f5..2fdca55 100644 --- a/src/clients/networkmanager/event.rs +++ b/src/clients/networkmanager/event.rs @@ -3,12 +3,12 @@ use crate::clients::networkmanager::dbus::{DeviceState, DeviceType}; #[derive(Debug, Clone)] pub enum ClientToModuleEvent { DeviceChanged { - interface: String, + number: u32, r#type: DeviceType, new_state: DeviceState, }, DeviceRemoved { - interface: String, + number: u32, }, } diff --git a/src/clients/networkmanager/mod.rs b/src/clients/networkmanager/mod.rs index 350a68f..a0758af 100644 --- a/src/clients/networkmanager/mod.rs +++ b/src/clients/networkmanager/mod.rs @@ -121,12 +121,9 @@ impl ClientInner { watcher.state_watcher.abort(); watchers.remove(removed_device_path); - // TODO: Replace the identifier sent to modules with the dbus device number (last segment of its path) - let dbus_connection = &self.dbus_connection().await?; - let device = DeviceDbusProxy::new(dbus_connection, removed_device_path).await?; - let interface = device.interface().await?.to_string(); + let number = get_number_from_dbus_path(removed_device_path); self.controller_sender - .send(ClientToModuleEvent::DeviceRemoved { interface })?; + .send(ClientToModuleEvent::DeviceRemoved { number })?; debug!("D-bus device watchers for {} stopped", removed_device_path); } @@ -148,12 +145,12 @@ impl ClientInner { let dbus_connection = &self.dbus_connection().await?; let device = DeviceDbusProxy::new(dbus_connection, device_path).await?; - let interface = device.interface().await?.to_string(); + let number = get_number_from_dbus_path(device_path); let r#type = device.device_type().await?; let new_state = device.state().await?; self.controller_sender .send(ClientToModuleEvent::DeviceChanged { - interface, + number, r#type, new_state, })?; @@ -177,14 +174,14 @@ impl ClientInner { let dbus_connection = Connection::system().await?; let device = DeviceDbusProxy::new(&dbus_connection, path.clone()).await?; - let interface = device.interface().await?; + let number = get_number_from_dbus_path(&path); let r#type = device.device_type().await?; // Send an event communicating the initial state let new_state = device.state().await?; self.controller_sender .send(ClientToModuleEvent::DeviceChanged { - interface: interface.to_string(), + number, r#type: r#type.clone(), new_state, })?; @@ -194,7 +191,7 @@ impl ClientInner { let new_state = state_change.get().await?; self.controller_sender .send(ClientToModuleEvent::DeviceChanged { - interface: interface.to_string(), + number, r#type: r#type.clone(), new_state, })?; @@ -225,4 +222,13 @@ pub fn create_client() -> ClientResult { Ok(client) } +fn get_number_from_dbus_path(path: &ObjectPath) -> u32 { + let (_, number_str) = path + .rsplit_once('/') + .expect("Path must have at least two segments to contain an object number"); + number_str + .parse() + .expect("Last segment was not a positive integer") +} + register_fallible_client!(Client, network_manager); diff --git a/src/modules/networkmanager.rs b/src/modules/networkmanager.rs index 34225b7..238f558 100644 --- a/src/modules/networkmanager.rs +++ b/src/modules/networkmanager.rs @@ -91,17 +91,17 @@ async fn handle_update_events( image_provider: Provider, ) -> Result<()> { // TODO: Ensure the visible icons are always in the same order - let mut icons = HashMap::::new(); + let mut icons = HashMap::::new(); while let Result::Ok(event) = widget_receiver.recv().await { match event { ClientToModuleEvent::DeviceChanged { - interface, + number, r#type, new_state, } => { - let icon: &_ = icons.entry(interface.clone()).or_insert_with(|| { - debug!("Adding icon for {}", interface); + let icon: &_ = icons.entry(number).or_insert_with(|| { + debug!("Adding icon for device {}", number); let icon = Image::new(); icon.add_class("icon"); @@ -123,14 +123,14 @@ async fn handle_update_events( } } } - ClientToModuleEvent::DeviceRemoved { interface } => { + ClientToModuleEvent::DeviceRemoved { number } => { let icon = icons - .get(interface.as_str()) + .get(&number) .expect("The icon for {} was about to be removed but was not present"); container.remove(icon); - icons.remove(interface.as_str()); + icons.remove(&number); - debug!("Removed icon for {}", interface); + debug!("Removed icon for device {}", number); } } }