diff --git a/docs/modules/Volume.md b/docs/modules/Volume.md
index 43856464..3afed7f2 100644
--- a/docs/modules/Volume.md
+++ b/docs/modules/Volume.md
@@ -4,7 +4,7 @@ the default playback device, and control application volume levels individually.
This requires PulseAudio to function (`pipewire-pulse` is supported).
-TODO: Screenshot
+[!The volume widget, with its popup open. A single stream is playing audio.](https://f.jstanger.dev/github/ironbar/volume.png)
## Configuration
diff --git a/examples/config.json b/examples/config.json
index 028b653b..f32664e3 100644
--- a/examples/config.json
+++ b/examples/config.json
@@ -1,30 +1,67 @@
{
"anchor_to_edges": true,
+ "position": "bottom",
+ "icon_theme": "Paper",
+ "start": [
+ {
+ "type": "workspaces",
+ "all_monitors": false,
+ "name_map": {
+ "1": "",
+ "2": "icon:firefox",
+ "3": "",
+ "Games": "icon:steam",
+ "Code": ""
+ }
+ },
+ {
+ "type": "launcher",
+ "favorites": [
+ "firefox",
+ "discord",
+ "steam"
+ ],
+ "show_names": false,
+ "show_icons": true
+ },
+ {
+ "type": "label",
+ "label": "random num: {{500:echo FIXME}}"
+ }
+ ],
"end": [
{
- "music_dir": "/home/jake/Music",
+ "type": "music",
"player_type": "mpd",
+ "music_dir": "/home/jake/Music",
"truncate": {
- "max_length": 100,
- "mode": "end"
- },
- "type": "music"
+ "mode": "end",
+ "max_length": 100
+ }
},
{
- "host": "chloe:6600",
+ "type": "music",
"player_type": "mpd",
- "truncate": "end",
- "type": "music"
+ "host": "chloe:6600",
+ "truncate": "end"
},
{
+ "type": "script",
"cmd": "/home/jake/bin/phone-battery",
"show_if": {
"cmd": "/home/jake/bin/phone-connected",
"interval": 500
- },
- "type": "script"
+ }
},
{
+ "type": "sys_info",
+ "interval": {
+ "memory": 30,
+ "cpu": 1,
+ "temps": 5,
+ "disks": 300,
+ "networks": 3
+ },
"format": [
" {cpu_percent}% | {temp_c:k10temp_Tccd1}°C",
" {memory_used} / {memory_total} GB ({memory_percent}%)",
@@ -33,103 +70,77 @@
" {net_down:enp39s0} / {net_up:enp39s0} Mbps",
" {load_average:1} | {load_average:5} | {load_average:15}",
" {uptime}"
- ],
- "interval": {
- "cpu": 1,
- "disks": 300,
- "memory": 30,
- "networks": 3,
- "temps": 5
- },
- "type": "sys_info"
+ ]
+ },
+ {
+ "type": "volume",
+ "format": "{icon} {volume}%",
+ "max_volume": 100,
+ "icons": {
+ "volume_high": "",
+ "volume_medium": "",
+ "volume_low": "",
+ "muted": ""
+ }
},
{
+ "type": "clipboard",
"max_items": 3,
"truncate": {
- "length": 50,
- "mode": "end"
- },
- "type": "clipboard"
+ "mode": "end",
+ "length": 50
+ }
},
{
+ "type": "custom",
+ "class": "power-menu",
"bar": [
{
- "label": "",
+ "type": "button",
"name": "power-btn",
- "on_click": "popup:toggle",
- "type": "button"
+ "label": "",
+ "on_click": "popup:toggle"
}
],
- "class": "power-menu",
"popup": [
{
- "orientation": "vertical",
"type": "box",
+ "orientation": "vertical",
"widgets": [
{
- "label": "Power menu",
+ "type": "label",
"name": "header",
- "type": "label"
+ "label": "Power menu"
},
{
"type": "box",
"widgets": [
{
+ "type": "button",
"class": "power-btn",
"label": "",
- "on_click": "!shutdown now",
- "type": "button"
+ "on_click": "!shutdown now"
},
{
+ "type": "button",
"class": "power-btn",
"label": "",
- "on_click": "!reboot",
- "type": "button"
+ "on_click": "!reboot"
}
]
},
{
- "label": "Uptime: {{30000:uptime -p | cut -d ' ' -f2-}}",
+ "type": "label",
"name": "uptime",
- "type": "label"
+ "label": "Uptime: {{30000:uptime -p | cut -d ' ' -f2-}}"
}
]
}
],
- "tooltip": "Up: {{30000:uptime -p | cut -d ' ' -f2-}}",
- "type": "custom"
+ "tooltip": "Up: {{30000:uptime -p | cut -d ' ' -f2-}}"
},
{
"type": "clock"
}
- ],
- "icon_theme": "Paper",
- "position": "bottom",
- "start": [
- {
- "all_monitors": false,
- "name_map": {
- "1": "",
- "2": "icon:firefox",
- "3": "",
- "Code": "",
- "Games": "icon:steam"
- },
- "type": "workspaces"
- },
- {
- "favorites": [
- "firefox",
- "discord",
- "steam"
- ],
- "show_icons": true,
- "show_names": false,
- "type": "launcher"
- },
- {
- "label": "random num: {{500:echo FIXME}}",
- "type": "label"
- }
]
}
diff --git a/examples/config.toml b/examples/config.toml
index bbff7379..489605c4 100644
--- a/examples/config.toml
+++ b/examples/config.toml
@@ -1,31 +1,57 @@
anchor_to_edges = true
-icon_theme = "Paper"
position = "bottom"
+icon_theme = "Paper"
+
+[[start]]
+type = "workspaces"
+all_monitors = false
+
+[start.name_map]
+1 = ""
+2 = "icon:firefox"
+3 = ""
+Games = "icon:steam"
+Code = ""
+
+[[start]]
+type = "launcher"
+favorites = [
+ "firefox",
+ "discord",
+ "steam",
+]
+show_names = false
+show_icons = true
+
+[[start]]
+type = "label"
+label = "random num: {{500:echo FIXME}}"
[[end]]
-music_dir = "/home/jake/Music"
-player_type = "mpd"
type = "music"
+player_type = "mpd"
+music_dir = "/home/jake/Music"
[end.truncate]
-max_length = 100
mode = "end"
+max_length = 100
[[end]]
-host = "chloe:6600"
+type = "music"
player_type = "mpd"
+host = "chloe:6600"
truncate = "end"
-type = "music"
[[end]]
-cmd = "/home/jake/bin/phone-battery"
type = "script"
+cmd = "/home/jake/bin/phone-battery"
[end.show_if]
cmd = "/home/jake/bin/phone-connected"
interval = 500
[[end]]
+type = "sys_info"
format = [
" {cpu_percent}% | {temp_c:k10temp_Tccd1}°C",
" {memory_used} / {memory_total} GB ({memory_percent}%)",
@@ -35,88 +61,73 @@ format = [
" {load_average:1} | {load_average:5} | {load_average:15}",
" {uptime}",
]
-type = "sys_info"
[end.interval]
+memory = 30
cpu = 1
+temps = 5
disks = 300
-memory = 30
networks = 3
-temps = 5
[[end]]
-max_items = 3
+type = "volume"
+format = "{icon} {volume}%"
+max_volume = 100
+
+[end.icons]
+volume_high = ""
+volume_medium = ""
+volume_low = ""
+muted = ""
+
+[[end]]
type = "clipboard"
+max_items = 3
[end.truncate]
-length = 50
mode = "end"
+length = 50
[[end]]
+type = "custom"
class = "power-menu"
tooltip = "Up: {{30000:uptime -p | cut -d ' ' -f2-}}"
-type = "custom"
[[end.bar]]
-label = ""
+type = "button"
name = "power-btn"
+label = ""
on_click = "popup:toggle"
-type = "button"
[[end.popup]]
-orientation = "vertical"
type = "box"
+orientation = "vertical"
[[end.popup.widgets]]
-label = "Power menu"
-name = "header"
type = "label"
+name = "header"
+label = "Power menu"
[[end.popup.widgets]]
type = "box"
[[end.popup.widgets.widgets]]
+type = "button"
class = "power-btn"
label = ""
on_click = "!shutdown now"
-type = "button"
[[end.popup.widgets.widgets]]
+type = "button"
class = "power-btn"
label = ""
on_click = "!reboot"
-type = "button"
[[end.popup.widgets]]
-label = "Uptime: {{30000:uptime -p | cut -d ' ' -f2-}}"
-name = "uptime"
type = "label"
+name = "uptime"
+label = "Uptime: {{30000:uptime -p | cut -d ' ' -f2-}}"
[[end]]
type = "clock"
-[[start]]
-all_monitors = false
-type = "workspaces"
-
-[start.name_map]
-1 = ""
-2 = "icon:firefox"
-3 = ""
-Code = ""
-Games = "icon:steam"
-
-[[start]]
-favorites = [
- "firefox",
- "discord",
- "steam",
-]
-show_icons = true
-show_names = false
-type = "launcher"
-
-[[start]]
-label = "random num: {{500:echo FIXME}}"
-type = "label"
-
diff --git a/examples/config.yaml b/examples/config.yaml
index c9ef8aa5..49923ee4 100644
--- a/examples/config.yaml
+++ b/examples/config.yaml
@@ -1,21 +1,48 @@
anchor_to_edges: true
+position: bottom
+icon_theme: Paper
+start:
+- type: workspaces
+ all_monitors: false
+ name_map:
+ '1':
+ '2': icon:firefox
+ '3':
+ Games: icon:steam
+ Code:
+- type: launcher
+ favorites:
+ - firefox
+ - discord
+ - steam
+ show_names: false
+ show_icons: true
+- type: label
+ label: 'random num: {{500:echo FIXME}}'
end:
-- music_dir: /home/jake/Music
+- type: music
player_type: mpd
+ music_dir: /home/jake/Music
truncate:
- max_length: 100
mode: end
- type: music
-- host: chloe:6600
+ max_length: 100
+- type: music
player_type: mpd
+ host: chloe:6600
truncate: end
- type: music
-- cmd: /home/jake/bin/phone-battery
+- type: script
+ cmd: /home/jake/bin/phone-battery
show_if:
cmd: /home/jake/bin/phone-connected
interval: 500
- type: script
-- format:
+- type: sys_info
+ interval:
+ memory: 30
+ cpu: 1
+ temps: 5
+ disks: 300
+ networks: 3
+ format:
- {cpu_percent}% | {temp_c:k10temp_Tccd1}°C
- {memory_used} / {memory_total} GB ({memory_percent}%)
- '| {swap_used} / {swap_total} GB ({swap_percent}%)'
@@ -23,65 +50,46 @@ end:
- {net_down:enp39s0} / {net_up:enp39s0} Mbps
- {load_average:1} | {load_average:5} | {load_average:15}
- {uptime}
- interval:
- cpu: 1
- disks: 300
- memory: 30
- networks: 3
- temps: 5
- type: sys_info
-- max_items: 3
+- type: volume
+ format: '{icon} {volume}%'
+ max_volume: 100
+ icons:
+ volume_high:
+ volume_medium:
+ volume_low:
+ muted:
+- type: clipboard
+ max_items: 3
truncate:
- length: 50
mode: end
- type: clipboard
-- bar:
- - label:
+ length: 50
+- type: custom
+ class: power-menu
+ bar:
+ - type: button
name: power-btn
+ label:
on_click: popup:toggle
- type: button
- class: power-menu
popup:
- - orientation: vertical
- type: box
+ - type: box
+ orientation: vertical
widgets:
- - label: Power menu
+ - type: label
name: header
- type: label
+ label: Power menu
- type: box
widgets:
- - class: power-btn
+ - type: button
+ class: power-btn
label:
on_click: '!shutdown now'
- type: button
- - class: power-btn
+ - type: button
+ class: power-btn
label:
on_click: '!reboot'
- type: button
- - label: 'Uptime: {{30000:uptime -p | cut -d '' '' -f2-}}'
+ - type: label
name: uptime
- type: label
+ label: 'Uptime: {{30000:uptime -p | cut -d '' '' -f2-}}'
tooltip: 'Up: {{30000:uptime -p | cut -d '' '' -f2-}}'
- type: custom
- type: clock
-icon_theme: Paper
-position: bottom
-start:
-- all_monitors: false
- name_map:
- '1':
- '2': icon:firefox
- '3':
- Code:
- Games: icon:steam
- type: workspaces
-- favorites:
- - firefox
- - discord
- - steam
- show_icons: true
- show_names: false
- type: launcher
-- label: 'random num: {{500:echo FIXME}}'
- type: label
diff --git a/src/clients/volume/mod.rs b/src/clients/volume/mod.rs
index 7abf28d2..3db503ff 100644
--- a/src/clients/volume/mod.rs
+++ b/src/clients/volume/mod.rs
@@ -1,7 +1,7 @@
mod sink;
mod sink_input;
-use crate::{arc_mut, lock, register_client, send, spawn_blocking};
+use crate::{arc_mut, lock, register_client, send, spawn_blocking, APP_ID};
use libpulse_binding::callbacks::ListResult;
use libpulse_binding::context::introspect::{Introspector, ServerInfo};
use libpulse_binding::context::subscribe::{Facility, InterestMaskSet, Operation};
@@ -88,10 +88,7 @@ impl Client {
return;
};
- if proplist
- .set_str("APPLICATION_NAME", "dev.jstanger.ironbar")
- .is_err()
- {
+ if proplist.set_str("APPLICATION_NAME", APP_ID).is_err() {
error!("Failed to update PA proplist");
}
diff --git a/src/main.rs b/src/main.rs
index 7245242b..efa0b711 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -57,7 +57,7 @@ mod popup;
mod script;
mod style;
-const GTK_APP_ID: &str = "dev.jstanger.ironbar";
+pub const APP_ID: &str = "dev.jstanger.ironbar";
const VERSION: &str = env!("CARGO_PKG_VERSION");
fn main() {
@@ -111,7 +111,7 @@ impl Ironbar {
info!("Ironbar version {}", VERSION);
info!("Starting application");
- let app = Application::builder().application_id(GTK_APP_ID).build();
+ let app = Application::builder().application_id(APP_ID).build();
let running = AtomicBool::new(false);
diff --git a/src/modules/volume.rs b/src/modules/volume.rs
index a7dda8d7..bb33337a 100644
--- a/src/modules/volume.rs
+++ b/src/modules/volume.rs
@@ -1,5 +1,4 @@
-use crate::clients::volume;
-use crate::clients::volume::Event;
+use crate::clients::volume::{self, Event};
use crate::config::CommonConfig;
use crate::gtk_helpers::IronbarGtkExt;
use crate::modules::{