import std/os import strutils import std/osproc import std/math import i3bar_base import std/threadpool proc getDesign(vol: string): string = 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: 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()