#!/bin/bash # shellcheck disable=SC2059,SC2064,SC2086,SC2001,SC2016 # simple lightweight lemonbar script for use with dk set -eE -o pipefail bg="#3f3c6d" # background colour fg="#a39ef1" # foreground colour hi="#00aaaa" # highlight colour ul=2 # underline thickness sep="┃" # separator text fifo="/tmp/bar.fifo" font="Iosevka:size=11" clock() { date +"T %a %H:%M " # sync up the clock to the minute mark min=$(date +"%M") while [[ $(date +"%M") == "$min" ]]; do sleep 1 done while :; do date +"T %a %H:%M " sleep 60 done } battery() { while :; do perc="$(cat /sys/class/power_supply/BAT0/capacity)" echo "B bat: ${perc}%" sleep 60 done } volume() { vol="$(amixer sget Master | awk -F"[][]" '/(Mono|Left):/ { print $2 }')" echo "V vol: ${vol}" } workspaces() { # these will be filled out once we eval each line typeset name="" title="" layout="" focused=false active=false WS="" while read -r l; do eval "$l" if [[ $l =~ ^title=* ]]; then # default foreground, background, and underline colours # changing the foreground and underline based on # the active and focused state f="$fg" b="$bg" u="$fg"; $active && u="$hi" if $focused; then # clicking the layout symbol will cycle the layout lyt="%{A:dkcmd set layout cycle:}${layouts[$layout]}%{A}" f="$hi" fi # clicking on a workspace name will view it WS="$WS%{F$f}%{B$b}%{+u}%{U$u}%{A:dkcmd ws $name:} $name %{A}%{-u}%{B-}%{F-}" fi # turn the dk JSON output into lines that can be `eval`ed one by one, # filling out the following fields: name, focused, active, layout, title done < <(dkcmd -p <<< "$1" | sed '/.*\[\|]/d; /[{}],\?/d; s/^\s*\|,$//g; /"monitor":\|"number":\|"id":/d; s/"\(.*\)": /\1=/; s/\$(/\\\$(/g; s/`/\\`/g') WS="$WS $lyt" } parsefifo() { # globals to simplify the workspaces call declare -g WS local time vol bat net while read -r line; do case $line in T*) time="${line#?}" ;; V*) vol="${line#?}" ;; B*) bat="${line#?}" ;; N*) net="${line#?}" ;; '{'*) workspaces "$line" ;; esac echo "%{l} ${WS}%{c}${time}%{r}${bat}${vol} " done } # kill the process and cleanup if we exit or get killed trap "trap - TERM; rm -f '$fifo'; kill 0" INT TERM QUIT EXIT PIPE # make the fifo [ -e "$fifo" ] && rm "$fifo" mkfifo "$fifo" # here we dump info into the FIFO, order does not matter things are parsed # out using the first character of the line. Click commands for left button # can be added by passing an argument containing the command (like below) # # comment a line to remove the "module" clock > "$fifo" & battery > "$fifo" & volume > "$fifo" & dkcmd status type=bar > "$fifo" & # run the pipeline if [[ $1 == '-b' ]]; then parsefifo < "$fifo" | lemonbar -b -a 32 -u $ul -B "$bg" -F "$fg" -f "$font" | sh; else parsefifo < "$fifo" | lemonbar -a 32 -u $ul -B "$bg" -F "$fg" -f "$font" | sh fi # vim:ft=sh:fdm=marker:fmr={,}