#!/bin/bash # shellcheck disable=SC2059,SC2064,SC2086 # simple lightweight lemonbar script for use with dk set -eE -o pipefail bg="#111111" fg="#666666" highlight="#6699ee" underline=3 separator="┃" # xfonts (adjust size based on resolution) px=$(xrandr | grep ' connected' | tail -n1 | grep -o '[0-9]\+x[0-9]\+' | cut -d'x' -f2) mm=$(xrandr | grep ' connected' | tail -n1 | grep -o '[0-9]\+mm' | tail -n1 | sed 's/mm//') dpi=$(( (px / mm) * 25 )) if (( dpi >= 140 )); then font0="-xos4-terminus-medium-r-normal--24-240-72-72-c-120-iso10646-1" elif (( dpi >= 120 )); then font0="-xos4-terminus-medium-r-normal--18-240-72-72-c-120-iso10646-1" elif (( dpi >= 100 )); then font0="-xos4-terminus-medium-r-normal--14-240-72-72-c-120-iso10646-1" else font0="-xos4-terminus-medium-r-normal--12-240-72-72-c-120-iso10646-1" fi font1="" font2="" font3="" # xft fonts # font0="monospace:pixelsize=24" # font1="Font Awesome 5 Brands:pixelsize=20" # font2="icomoon:pixelsize=18" # font3="Anonymice Nerd Font Mono:pixelsize=18" fifo="/tmp/bar.fifo" # mimic dwm style layout symbols typeset -A layouts=( [tile]="[]=" [mono]="[M]" [none]="><>" [grid]="###" [spiral]="(@)" [dwindle]="[\\]" [tstack]="F^F" ) clock() { if [[ $1 ]]; then while :; do date +"T%%{A1:$1:} %a %H:%M %%{A}" sleep 60 done else while :; do date +"T %a %H:%M " sleep 60 done fi } battery() { if [[ $1 ]]; then while :; do lvl=$(acpi --battery 2>/dev/null | grep -v 'Unknown\| 0%' | cut -d, -f2 | tr -d '[:space:]') if [[ $lvl ]]; then printf 'B%s\n' "%{A1:$1:} Bat: $(acpi --battery 2>/dev/null | grep -v 'Unknown\| 0%' | cut -d, -f2 | tr -d '[:space:]') %{A}${separator}" sleep 60 else return # no battery so we don't need to continue fi done else while :; do lvl=$(acpi --battery 2>/dev/null | grep -v 'Unknown\| 0%' | cut -d, -f2 | tr -d '[:space:]') if [[ $lvl ]]; then printf 'B%s\n' " Bat: $(acpi --battery 2>/dev/null | grep -v 'Unknown\| 0%' | cut -d, -f2 | tr -d '[:space:]') ${separator}" sleep 60 else return # no battery so we don't need to continue fi done fi } volume() { if [[ $1 ]]; then while :; do printf 'V%s\n' "%{A1:$1:} Vol: $(pamixer --get-volume-human) %{A}${separator}" sleep 1 done else while :; do printf 'V%s\n' " Vol: $(pamixer --get-volume-human) ${separator}" sleep 1 done fi } network() { check() { if hash nm-online > /dev/null 2>&1 && [[ $(systemctl is-active NetworkManager.service) == "active" ]]; then nm-online > /dev/null 2>&1 else ping -qc1 'archlinux.org' > /dev/null 2>&1 fi } if [[ $1 ]]; then until check; do printf 'N%s\n' "%{A1:$1:} disconnected %{A}${separator}" sleep 30 done while :; do printf 'N%s\n' "%{A1:$1:} connected %{A}${separator}" sleep 240 done else until check; do printf 'N%s\n' " disconnected %{A}${separator}" sleep 30 done while :; do printf 'N%s\n' " connected %{A}${separator}" sleep 240 done fi } parsefifo() { typeset f='' b='' u='' wm='' time='' net='' bat='' vol='' title='' layout='' while read -r line; do case $line in T*) time="${line#?}" ;; V*) vol="${line#?}" ;; B*) bat="${line#?}" ;; N*) net="${line#?}" ;; A*) title="${line#?}"; title="${title:0:50}";; L*) l="${line#?}"; layout="${layouts[$l]}" ;; W*) wm='' IFS=':' # set the internal field separator to ':' set -- ${line#?} # split the line into arguments ($@) based on the field separator for item in "$@"; do name=${item#?} case $item in A*) f="$highlight" b="$bg" u="$highlight" ;; # occupied - focused a*) f="$fg" b="$bg" u="$highlight" ;; # occupied - unfocused I*) f="$highlight" b="$bg" u="$fg" ;; # unoccupied - focused i*) f="$fg" b="$bg" u="$fg" ;; # unoccupied - unfocused esac wm="$wm%{F$f}%{B$b}%{+u}%{U$u}%{A:dkcmd ws $name:} $name %{A}%{-u}%{B-}%{F-}" done ;; esac printf "%s\n" "%{l}$wm $separator $layout%{c}$title%{r}${net}${bat}${vol}${time}" done } # kill the process and cleanup if we exit or get killed trap "trap - TERM; kill 0; rm -f '$fifo'" 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 volume below) network 'al-terminal -e nmtui-connect' > "$fifo" & clock 'gsimplecal' > "$fifo" & battery '' > "$fifo" & volume 'pavucontrol' > "$fifo" & dkcmd status type=bar > "$fifo" & # run the pipeline if [[ $1 == '-b' ]]; then parsefifo < "$fifo" | lemonbar -b -a 32 -u $underline -B "$bg" -F "$fg" -f "$font0" -f "$font1" -f "$font2" -f "$font3" | sh else parsefifo < "$fifo" | lemonbar -a 32 -u $underline -B "$bg" -F "$fg" -f "$font0" -f "$font1" -f "$font2" -f "$font3" | sh fi # vim:ft=sh:fdm=marker:fmr={,}