197 lines
4.9 KiB
Plaintext
197 lines
4.9 KiB
Plaintext
|
#!/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={,}
|