import std/os import strutils import std/osproc import std/math import i3bar_base import std/threadpool proc get_current_volume(): string {.gcsafe.} proc check_volume(volume: string): string = var vol = volume if strip(vol) == "Connection error": discard execCmdEx("pulseaudio -k; sleep 5; pulseaudio -D") vol = get_current_volume() vol = check_volume(vol) return vol proc getDesign(volume: string): string = let vol = check_volume(volume) var icon = " " if vol == "muted": return icon & "muted" let pcnt = parseInt(strip(vol)) case pcnt: of 85..100: icon = " " of 55..84: icon = " " of 35..54: icon = " " of 10..34: icon = " " else: icon = " " let text = "" & icon & "" & $pcnt & "%" return text proc get_current_volume(): string = let mute = execCmdEx("pamixer --get-mute") if strip(mute.output) == "true": return "muted" let vol = execCmdEx("pamixer --get-volume") return vol.output proc get_volume(run_once: bool = false) = var last_vol: string = "" while true: let vol = get_current_volume() if vol != last_vol or true: let text = getDesign(vol) let data = i3barData( full_text: text, color: foreground, border: green, background: black ) outputJSON(data) if run_once: break last_vol = vol sleep(1000) proc await_click_info() = while true: let input = parseInput() case input.button: of 4: discard execCmd("pamixer -i 5") get_volume(true) clearInput(2) of 5: discard execCmd("pamixer -d 5") get_volume(true) clearInput(2) of 1: discard execCmd("pamixer -t") get_volume(true) of 3: discard execCmd("alacritty -e ncpamixer") get_volume(true) else: let no = false proc main() = spawn get_volume() spawn await_click_info() sync() main()