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/modules/networkmanager.rs b/src/modules/networkmanager.rs
index e5be89e..2689d90 100644
--- a/src/modules/networkmanager.rs
+++ b/src/modules/networkmanager.rs
@@ -1,3 +1,5 @@
+mod config;
+
use color_eyre::Result;
use futures_lite::StreamExt;
use futures_signals::signal::SignalExt;
@@ -22,6 +24,9 @@ pub struct NetworkManagerModule {
#[serde(default = "default_icon_size")]
icon_size: i32,
+ #[serde(default)]
+ icons: config::IconsConfig,
+
#[serde(flatten)]
pub common: Option,
}
@@ -106,34 +111,27 @@ impl Module for NetworkManagerModule {
}
update_icon!(wired_icon, wired, {
- WiredState::Connected => "icon:network-wired-symbolic",
- WiredState::Disconnected => "icon:network-wired-disconnected-symbolic",
+ WiredState::Connected => &self.icons.wired.connected,
+ WiredState::Disconnected => &self.icons.wired.disconnected,
WiredState::NotPresent | WiredState::Unknown => "",
});
update_icon!(wifi_icon, wifi, {
WifiState::Connected(state) => {
- let icons = [
- "icon:network-wireless-signal-none-symbolic",
- "icon:network-wireless-signal-weak-symbolic",
- "icon:network-wireless-signal-ok-symbolic",
- "icon:network-wireless-signal-good-symbolic",
- "icon:network-wireless-signal-excellent-symbolic",
- ];
- let n = strengh_to_level(state.strength, icons.len());
- icons[n]
+ let n = strengh_to_level(state.strength, self.icons.wifi.levels.len());
+ &self.icons.wifi.levels[n]
},
- WifiState::Disconnected => "icon:network-wireless-offline-symbolic",
- WifiState::Disabled => "icon:network-wireless-hardware-disabled-symbolic",
+ WifiState::Disconnected => &self.icons.wifi.disconnected,
+ WifiState::Disabled => &self.icons.wifi.disabled,
WifiState::NotPresent | WifiState::Unknown => "",
});
update_icon!(cellular_icon, cellular, {
- CellularState::Connected => "icon:network-cellular-connected-symbolic",
- CellularState::Disconnected => "icon:network-cellular-offline-symbolic",
- CellularState::Disabled => "icon:network-cellular-hardware-disabled-symbolic",
+ CellularState::Connected => &self.icons.cellular.connected,
+ CellularState::Disconnected => &self.icons.cellular.disconnected,
+ CellularState::Disabled => &self.icons.cellular.disabled,
CellularState::NotPresent | CellularState::Unknown => "",
});
update_icon!(vpn_icon, vpn, {
- VpnState::Connected(_) => "icon:network-vpn-symbolic",
+ VpnState::Connected(_) => &self.icons.vpn.connected,
VpnState::Disconnected | VpnState::Unknown => "",
});
});
diff --git a/src/modules/networkmanager/config.rs b/src/modules/networkmanager/config.rs
new file mode 100644
index 0000000..c2fd77c
--- /dev/null
+++ b/src/modules/networkmanager/config.rs
@@ -0,0 +1,120 @@
+use serde::Deserialize;
+
+macro_rules! default_function {
+ ($(($name:ident, $default:expr),)*) => {
+ $(
+ fn $name() -> String {
+ ($default).to_string()
+ }
+ )*
+ };
+}
+
+#[derive(Debug, Deserialize, Clone, Default)]
+#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
+pub struct IconsConfig {
+ #[serde(default)]
+ pub wired: IconsConfigWired,
+ #[serde(default)]
+ pub wifi: IconsConfigWifi,
+ #[serde(default)]
+ pub cellular: IconsConfigCellular,
+ #[serde(default)]
+ pub vpn: IconsConfigVpn,
+}
+
+#[derive(Debug, Deserialize, Clone)]
+#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
+pub struct IconsConfigWired {
+ #[serde(default = "default_wired_connected")]
+ pub connected: String,
+ #[serde(default = "default_wired_disconnected")]
+ pub disconnected: String,
+}
+impl Default for IconsConfigWired {
+ fn default() -> Self {
+ Self {
+ connected: default_wired_connected(),
+ disconnected: default_wired_disconnected(),
+ }
+ }
+}
+
+#[derive(Debug, Deserialize, Clone)]
+#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
+pub struct IconsConfigWifi {
+ #[serde(default = "default_wifi_levels")]
+ pub levels: Vec,
+ #[serde(default = "default_wifi_disconnected")]
+ pub disconnected: String,
+ #[serde(default = "default_wifi_disabled")]
+ pub disabled: String,
+}
+
+impl Default for IconsConfigWifi {
+ fn default() -> Self {
+ Self {
+ levels: default_wifi_levels(),
+ disconnected: default_wifi_disconnected(),
+ disabled: default_wifi_disabled(),
+ }
+ }
+}
+
+#[derive(Debug, Deserialize, Clone)]
+#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
+pub struct IconsConfigCellular {
+ #[serde(default = "default_cellular_connected")]
+ pub connected: String,
+ #[serde(default = "default_cellular_disconnected")]
+ pub disconnected: String,
+ #[serde(default = "default_cellular_disabled")]
+ pub disabled: String,
+}
+impl Default for IconsConfigCellular {
+ fn default() -> Self {
+ Self {
+ connected: default_cellular_connected(),
+ disconnected: default_cellular_disconnected(),
+ disabled: default_cellular_disabled(),
+ }
+ }
+}
+
+#[derive(Debug, Deserialize, Clone)]
+#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
+pub struct IconsConfigVpn {
+ #[serde(default = "default_vpn_connected")]
+ pub connected: String,
+}
+impl Default for IconsConfigVpn {
+ fn default() -> Self {
+ Self {
+ connected: default_vpn_connected(),
+ }
+ }
+}
+
+pub fn default_wifi_levels() -> Vec {
+ vec![
+ "icon:network-wireless-signal-none-symbolic".to_string(),
+ "icon:network-wireless-signal-weak-symbolic".to_string(),
+ "icon:network-wireless-signal-ok-symbolic".to_string(),
+ "icon:network-wireless-signal-good-symbolic".to_string(),
+ "icon:network-wireless-signal-excellent-symbolic".to_string(),
+ ]
+}
+
+default_function! {
+ (default_wired_connected, "icon:network-wired-symbolic"),
+ (default_wired_disconnected, "icon:network-wired-disconnected-symbolic"),
+
+ (default_wifi_disconnected, "icon:network-wireless-offline-symbolic"),
+ (default_wifi_disabled, "icon:network-wireless-hardware-disabled-symbolic"),
+
+ (default_cellular_connected,"icon:network-cellular-connected-symbolic"),
+ (default_cellular_disconnected,"icon:network-cellular-offline-symbolic"),
+ (default_cellular_disabled,"icon:network-cellular-hardware-disabled-symbolic"),
+
+ (default_vpn_connected, "icon:network-vpn-symbolic"),
+}