diff --git a/docs/modules/Networkmanager.md b/docs/modules/Networkmanager.md
index bd318d9..e79cfde 100644
--- a/docs/modules/Networkmanager.md
+++ b/docs/modules/Networkmanager.md
@@ -10,64 +10,77 @@ Supports wired ethernet, wifi, cellular data and VPN connections among others.
> Type: `networkmanager`
-| Name | Type | Default | Description |
-|-------------|-----------|---------|-------------------------|
-| `icon_size` | `integer` | `24` | Size to render icon at. |
+| Name | Type | Default | Description |
+| ----------------------------- | ---------- | ----------------------------------------------------- | ------------------------------------------------- |
+| `icon_size` | `integer` | `24` | Size to render icon at. |
+| `icons.wired.connected` | `string` | `icon:network-wired-symbolic` | Icon to show when there is a wired connection |
+| `icons.wired.disconnected` | `string` | `icon:network-wired-symbolic` | Icon to show when there is no wired connection |
+| `icons.wifi.levels` | `string[]` | `["icon:network-wireless-signal-none-symbolic", ...]` | Icon to show when there is no wifi connection |
+| `icons.wifi.disconnected` | `string` | `icon:network-wireless-offline-symbolic` | Icon to show when there is no wifi connection |
+| `icons.wifi.disabled` | `string` | `icon:network-wireless-hardware-disabled-symbolic` | Icon to show when wifi is disabled |
+| `icons.cellular.connected` | `string` | `icon:network-cellular-connected-symbolic` | Icon to show when there is a cellular connection |
+| `icons.cellular.disconnected` | `string` | `icon:network-cellular-offline-symbolic` | Icon to show when there is no cellular connection |
+| `icons.cellular.disabled` | `string` | `icon:network-cellular-hardware-disabled-symbolic` | Icon to show when cellular connection is disabled |
+| `icons.vpn.connected` | `string` | `icon:network-vpn-symbolic` | Icon to show when there is a VPN connection |
- JSON
+JSON
+
+```json
+{
+ "end": [
+ {
+ "type": "networkmanager",
+ "icon_size": 32
+ }
+ ]
+}
+```
- ```json
- {
- "end": [
- {
- "type": "networkmanager",
- "icon_size": 32
- }
- ]
- }
- ```
- TOML
+TOML
+
+```toml
+[[end]]
+type = "networkmanager"
+icon_size = 32
+```
- ```toml
- [[end]]
- type = "networkmanager"
- icon_size = 32
- ```
- YAML
+YAML
+
+```yaml
+end:
+ - type: "networkmanager"
+ icon_size: 32
+```
- ```yaml
- end:
- - type: "networkmanager"
- icon_size: 32
- ```
- Corn
+Corn
+
+```corn
+{
+ end = [
+ {
+ type = "networkmanager"
+ icon_size = 32
+ }
+ ]
+}
+```
- ```corn
- {
- end = [
- {
- type = "networkmanager"
- icon_size = 32
- }
- ]
- }
- ```
## Styling
| Selector | Description |
-|------------------------|----------------------------------|
+| ---------------------- | -------------------------------- |
| `.networkmanager` | NetworkManager widget container. |
| `.networkmanger .icon` | NetworkManager widget icons. |
diff --git a/src/clients/networkmanager/dbus.rs b/src/clients/networkmanager/dbus.rs
index 5ab3889..a231dbe 100644
--- a/src/clients/networkmanager/dbus.rs
+++ b/src/clients/networkmanager/dbus.rs
@@ -1,3 +1,5 @@
+use std::collections::HashMap;
+
use color_eyre::Result;
use zbus::dbus_proxy;
use zbus::zvariant::{ObjectPath, OwnedValue, Str};
@@ -67,6 +69,47 @@ trait DeviceDbus {
#[dbus_proxy(property)]
fn state(&self) -> Result;
+
+ #[dbus_proxy(property)]
+ fn interface(&self) -> Result;
+
+ #[dbus_proxy(property)]
+ fn ip4_config(&self) -> Result;
+}
+
+#[dbus_proxy(
+ default_service = "org.freedesktop.NetworkManager",
+ interface = "org.freedesktop.NetworkManager.Device.Wireless"
+)]
+trait DeviceWirelessDbus {
+ #[dbus_proxy(property)]
+ fn active_access_point(&self) -> zbus::Result;
+}
+
+// based on code generated by `zbus-xmlgen system org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/AccessPoint/1`
+#[dbus_proxy(
+ default_service = "org.freedesktop.NetworkManager",
+ interface = "org.freedesktop.NetworkManager.AccessPoint"
+)]
+trait AccessPointDbus {
+ #[dbus_proxy(property)]
+ fn ssid(&self) -> zbus::Result>;
+
+ #[dbus_proxy(property)]
+ fn strength(&self) -> Result;
+
+ #[dbus_proxy(property)]
+ fn hw_address(&self) -> Result;
+}
+
+// based on code generated by `zbus-xmlgen system org.freedesktop.NetworkManager /org/freedesktop/NetworkManager/AccessPoint/1`
+#[dbus_proxy(
+ default_service = "org.freedesktop.NetworkManager",
+ interface = "org.freedesktop.NetworkManager.IP4Config"
+)]
+trait Ip4ConfigDbus {
+ #[dbus_proxy(property)]
+ fn address_data(&self) -> Result>>;
}
#[derive(Clone, Debug, OwnedValue, PartialEq)]
diff --git a/src/clients/networkmanager/mod.rs b/src/clients/networkmanager/mod.rs
index b0ac6a2..1134cf0 100644
--- a/src/clients/networkmanager/mod.rs
+++ b/src/clients/networkmanager/mod.rs
@@ -8,7 +8,8 @@ use zbus::blocking::Connection;
use zbus::zvariant::ObjectPath;
use crate::clients::networkmanager::dbus::{
- ActiveConnectionDbusProxyBlocking, DbusProxyBlocking, DeviceDbusProxyBlocking,
+ AccessPointDbusProxyBlocking, ActiveConnectionDbusProxyBlocking, DbusProxyBlocking,
+ DeviceDbusProxyBlocking,
};
use crate::clients::networkmanager::state::{
determine_cellular_state, determine_vpn_state, determine_wifi_state, determine_wired_state,
@@ -32,8 +33,22 @@ struct ClientInner<'l> {
root_object: &'l DbusProxyBlocking<'l>,
active_connections: RwLock>>,
devices: RwLock>>,
+ access_point: RwLock