278 lines
9 KiB
Bash
278 lines
9 KiB
Bash
#!/bin/bash
|
|
|
|
hc() {
|
|
t="$EPOCHREALTIME"
|
|
herbstclient "$@"
|
|
t2="$EPOCHREALTIME"
|
|
echo "hc: $( bc<<<"$t2 - $t")" >&2
|
|
}
|
|
panel_height=18
|
|
# bgcolor=$(hc get frame_border_normal_color)
|
|
# selbg=$(hc get window_border_active_color)
|
|
# selfg='#282828'
|
|
# fg='#fbf1c7'
|
|
# bgcolor='#282828'
|
|
# selsecbg='#ebdbb2'
|
|
|
|
|
|
. "$(dirname "$0")/colors.sh"
|
|
|
|
col_bg_pri_sel=${colors[active]}
|
|
col_fg_pri_sel=${colors[dark0]}
|
|
|
|
col_bg_sec_sel=${colors[dark3]}
|
|
col_fg_sec_sel=${colors[light1]}
|
|
|
|
col_bg=${colors[dark0]}
|
|
col_fg=${colors[light0]}
|
|
|
|
col_fg_sec=${colors[light4]}
|
|
|
|
col_bg_urg=${colors[urgent]}
|
|
|
|
monitors=( )
|
|
|
|
i=0
|
|
while read -r _ resolution
|
|
do
|
|
monitors[$i]="$(herbstclient list_monitors | grep "$resolution" | cut -d":" -f1)"
|
|
i=$((i+1))
|
|
done < <(xrandr| awk '/ connected/ { FS=" " ; $0=$0 ; if ($3 == "primary") { res=$4 } else {res=$3} ; FS="+" ; $0=$0 ; print $2" "res }' | sort -n)
|
|
|
|
first_loop=1
|
|
|
|
notify() {
|
|
if [[ "$first_loop" != 1 ]]
|
|
then
|
|
#twmnc "$@"
|
|
notify-send "$@"
|
|
fi
|
|
}
|
|
|
|
# so it bootstraps...
|
|
( sleep 0.5; hc emit_hook volume ) &
|
|
|
|
hc --idle | {
|
|
for monitor in "${monitors[@]}" ; do
|
|
tags[$monitor]="$(hc tag_status "$monitor")"
|
|
done
|
|
date="%{T2}%{T-} $(date '+%{F#efefef}%H:%M%{F#909090}, %Y-%m-%{F#efefef}%d')"
|
|
windowtitle=""
|
|
#count-mails;
|
|
#charge=$(battery | awk '{print $2}')
|
|
while true ; do
|
|
|
|
### prepare by monitor tags displaying
|
|
for monitor in "${monitors[@]}" ; do
|
|
output_tags[$monitor]="%{A4:herbstclient use_index +1 --skip-visible:}%{A5:herbstclient use_index -1 --skip-visible:}"
|
|
for i in ${tags[$monitor]} ; do
|
|
case ${i:0:1} in
|
|
'#'|'+')
|
|
output_tags[$monitor]="${output_tags[$monitor]}%{F$col_fg_pri_sel}%{B$col_bg_pri_sel}"
|
|
;;
|
|
#'+')
|
|
#output_tags[$monitor]="${output_tags[$monitor]}%{B#3c7693}%{F#141414}"
|
|
#;;
|
|
':')
|
|
output_tags[$monitor]="${output_tags[$monitor]}%{B-}%{F-}"
|
|
;;
|
|
'!')
|
|
output_tags[$monitor]="${output_tags[$monitor]}%{B${col_bg_urg}}%{F-}"
|
|
;;
|
|
'-'|'%')
|
|
output_tags[$monitor]="${output_tags[$monitor]}%{B${col_bg_sec_sel}%{F${col_fg_sec_sel}}"
|
|
;;
|
|
*)
|
|
output_tags[$monitor]="${output_tags[$monitor]}%{B-}%{F${col_fg_sec}}"
|
|
;;
|
|
esac
|
|
|
|
# output_tags[$monitor]="${output_tags[$monitor]}%{A:herbstclient use_index $((${i:1} - 1 )):} ${i:1} %{A}"
|
|
output_tags[$monitor]="${output_tags[$monitor]}%{A1:herbstclient use ${i:1}:} ${i:1} %{A}%{B-}%{F-}"
|
|
done
|
|
output_tags[$monitor]="${output_tags[$monitor]}%{A}%{A}"
|
|
done
|
|
|
|
#bordercolor="#26221C"
|
|
separator="%{B-}%{F-}|"
|
|
#separator="%{B$selbg} %{B-}%{F-}"
|
|
#right=
|
|
#for st in playing volume wifi temperature load date
|
|
#do
|
|
#data="$(eval $st)"
|
|
#[[ -n "$data" ]] && right="$right $separator $data"
|
|
#done
|
|
|
|
### All drawing happens here
|
|
# echo -n "%{T5}" # set font
|
|
res=
|
|
for m in "${!monitors[@]}" ; do
|
|
monitor=${monitors[$m]}
|
|
|
|
### set monitor
|
|
res+="%{S$m}"
|
|
#echo -en "%{S$((${#monitors[@]} - monitor))}"
|
|
### print the left
|
|
res+="%{l}${output_tags[$monitor]}$separator ${windowtitle:0:150}"
|
|
### center
|
|
#echo -n "%{c}%{U${colors[bright_orange]}}${windowtitle:0:150}%{U-}"
|
|
### print the right
|
|
res+="%{r}$playing $separator $volume $separator $wifi $separator $network $separator $temperature $separator $load $separator $date $separator %{U#f2f229}$charge%{U-} $separator"
|
|
#echo -en "%{r}$right $separator %{U#f2f229}$charge%{U-} $separator"
|
|
done
|
|
|
|
### end the output
|
|
echo -e "$res"
|
|
|
|
### Data handling ###
|
|
# This part handles the events generated in the event loop, and sets
|
|
# internal variables based on them. The event and its arguments are
|
|
# read into the array cmd, then action is taken depending on the event
|
|
# name.
|
|
# "Special" events (quit_panel/togglehidepanel/reload) are also handled
|
|
# here.
|
|
|
|
# wait for next event
|
|
IFS=$'\t' read -ra cmd || break
|
|
#for z in ${cmd[@]}
|
|
#do
|
|
#echo -n "'$z' " >&2
|
|
#done
|
|
#echo >&2
|
|
# find out event origin
|
|
case "${cmd[0]}" in
|
|
tag*)
|
|
#echo "resetting tags" >&2
|
|
for monitor in "${monitors[@]}" ; do
|
|
tags[$monitor]="$(hc tag_status "$monitor")"
|
|
done
|
|
;;
|
|
date)
|
|
#echo "resetting date" >&2
|
|
date="${cmd[*]:1}"
|
|
;;
|
|
quit_panel)
|
|
exit
|
|
;;
|
|
reload)
|
|
exit
|
|
;;
|
|
load)
|
|
load=" ${cmd[*]:1}"
|
|
;;
|
|
focus_changed|window_title_changed)
|
|
windowtitle="${cmd[*]:2}"
|
|
;;
|
|
player)
|
|
# declare -A player_status
|
|
if [[ "${cmd[1]}" = cmus ]] || [[ "${cmd[1]}" = mpd ]]
|
|
then
|
|
play_line=" ${cmd[3]:0:20}/${cmd[4]:0:20}"
|
|
[[ -n ${cmd[5]} ]] && play_line="$play_line: ${cmd[5]:0:20}"
|
|
play_sym=
|
|
case "${cmd[2]}" in
|
|
off|Stopped)
|
|
play_line=
|
|
;;
|
|
Paused)
|
|
play_sym=
|
|
;;
|
|
*)
|
|
play_sym="%{T2}%{T-}"
|
|
;;
|
|
esac
|
|
playing="$play_sym$play_line"
|
|
fi
|
|
|
|
# [[ "${player_status[${cmd[1]}]}" != "${cmd[2]}" ]] &&
|
|
# notify "Player: ${cmd[1]}" "${cmd[2]}"
|
|
# player_status[${cmd[1]}]="${cmd[2]}"
|
|
;;
|
|
ac)
|
|
case ${cmd[1]} in
|
|
charging)
|
|
batt_sym="%{F#00aa00}$batt_sym%{F-}"
|
|
ac="+"
|
|
notify "Power" "Battery charging"
|
|
;;
|
|
discharging)
|
|
ac="-"
|
|
batt_sym="%{F#ffdb00}$batt_sym%{F-}"
|
|
notify "Power" "Battery discharging"
|
|
;;
|
|
idle)
|
|
ac="="
|
|
notify "Power" "Fully charged"
|
|
;;
|
|
esac
|
|
;;
|
|
|
|
battery)
|
|
#echo "battery" >&2
|
|
batt_perc="${cmd[1]}"
|
|
{ [ "$batt_perc" -ge 95 ] && batt_sym= ; } ||
|
|
{ [ "$batt_perc" -ge 75 ] && batt_sym= ; } ||
|
|
{ [ "$batt_perc" -ge 50 ] && batt_sym= ; } ||
|
|
{ [ "$batt_perc" -ge 25 ] && batt_sym= ; } || batt_sym=
|
|
|
|
case "$ac" in
|
|
+)
|
|
batt_sym="%{F#00aa00}$batt_sym%{F-}"
|
|
ac="+"
|
|
;;
|
|
-)
|
|
batt_sym="%{F#ffdb00}$batt_sym%{F-}"
|
|
;;
|
|
*)
|
|
;;
|
|
esac
|
|
|
|
charge="$batt_sym ${batt_perc}%%"
|
|
|
|
[ "$batt_perc" -le 15 ] && [ "$ac" != '+' ] && notify -u critical "Power" "Battery has only ${batt_perc}%"
|
|
;;
|
|
temperature)
|
|
temperature=" ${cmd[1]}°C"
|
|
;;
|
|
wifi)
|
|
_wifi_net="${cmd[1]}"
|
|
if [[ -n "$_wifi_net" ]]
|
|
then
|
|
_wifi_sym=直
|
|
else
|
|
_wifi_sym=睊
|
|
fi
|
|
wifi="$(xargs <<<"$_wifi_sym $_wifi_net")"
|
|
;;
|
|
|
|
network)
|
|
_net_status="${cmd[1]}"
|
|
if [[ "$_net_status" == 'UP' ]]
|
|
then
|
|
network="$(xargs <<<"ﯱ ${cmd[2]}")"
|
|
else
|
|
network=
|
|
fi
|
|
;;
|
|
|
|
volume)
|
|
sleep 0.1
|
|
|
|
mute="$(pactl get-sink-mute "$(pactl get-default-sink)" | awk '{print $2}')"
|
|
|
|
if [[ "$mute" == yes ]]
|
|
then
|
|
volume=""
|
|
else
|
|
volume=" ${cmd[1]}"
|
|
fi
|
|
;;
|
|
esac
|
|
first_loop=0
|
|
done
|
|
|
|
} | lemonbar -f "Noto Sans Mono-10" -f "Symbols Nerd Font-10" -a30 -B "$col_bg" -F "$col_fg" -u 1 | sh
|
|
#} | lemonbar -f "DejaVu Sans-9" -f "Font Awesome-9" -f "Symbols Nerd Font-9"
|
|
#} | tee >(lemonbar -f "DejaViu Sans-9" -f "Font Awesome-9" )
|
|
|
|
systemctl stop --user "hlwm.target"
|