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::{