208 lines
4.7 KiB
Text
208 lines
4.7 KiB
Text
|
#!/usr/bin/env zsh
|
||
|
source $bspwm_config_dir/common
|
||
|
|
||
|
cleanup() {
|
||
|
jobs=${${jobstates##*:*:}%=*}
|
||
|
|
||
|
if [[ "$jobs" ]]; then
|
||
|
eval "kill $jobs"
|
||
|
fi
|
||
|
|
||
|
bspc config top_padding 0
|
||
|
}
|
||
|
|
||
|
get_line() {
|
||
|
declare counter=0 line=$1
|
||
|
|
||
|
while read; do
|
||
|
if (( counter == line )); then
|
||
|
printf '%s\n' "$REPLY"
|
||
|
return 0
|
||
|
fi
|
||
|
|
||
|
(( counter++ ))
|
||
|
done
|
||
|
}
|
||
|
|
||
|
parse_fifo_data() {
|
||
|
declare msg desktop_spec
|
||
|
declare -g win_name misc bspwm_status
|
||
|
|
||
|
while read; do
|
||
|
case "$REPLY" in
|
||
|
cmd::*)
|
||
|
read -r cmd args <<< "${REPLY#cmd::}"
|
||
|
|
||
|
case "$cmd" in
|
||
|
redraw)
|
||
|
printf 'Redraw triggered\n'
|
||
|
sleep 1
|
||
|
printf '%s\n' "$msg"
|
||
|
;;
|
||
|
respawn)
|
||
|
printf 'Dying...\n'
|
||
|
sleep 1
|
||
|
rexec
|
||
|
;;
|
||
|
run)
|
||
|
$args
|
||
|
rexec
|
||
|
;;
|
||
|
esac
|
||
|
;;
|
||
|
updates::*) updates="${REPLY#*updates::}";;
|
||
|
date::*) date="${REPLY#*date::}";;
|
||
|
T*)
|
||
|
if (( panel_taskbar_enable )); then
|
||
|
unset win_title
|
||
|
unset taskbar taskbar_windows taskbar_length
|
||
|
|
||
|
panel_taskbar_max_title_current=$panel_taskbar_max_title
|
||
|
|
||
|
while read -r _ _ _ wid _ _ _ _ focus; do
|
||
|
if [[ "$wid" =~ [0-9]x[0-9A-F] ]]; then
|
||
|
if [[ "$focus" == '*' ]]; then
|
||
|
taskbar_windows+=( "$wid::F" )
|
||
|
else
|
||
|
taskbar_windows+=( "$wid::u" )
|
||
|
fi
|
||
|
fi
|
||
|
done < <( bspc query -T -d focused )
|
||
|
|
||
|
taskbar_windows_n="${#taskbar_windows[@]}"
|
||
|
|
||
|
if (( taskbar_windows_n )); then
|
||
|
until (( taskbar_length )) && (( taskbar_length <= panel_taskbar_max_length )); do
|
||
|
unset taskbar
|
||
|
taskbar_length=$(( (taskbar_windows_n * 2) + 2 ))
|
||
|
|
||
|
for w in "${taskbar_windows[@]}"; do
|
||
|
IFS='::' read -r wid _ state <<< "$w"
|
||
|
win_title=$( xtitle -f '%s' -t "${panel_taskbar_max_title_current}" "$wid" )
|
||
|
win_title_length="${#win_title}"
|
||
|
|
||
|
taskbar_length=$(( taskbar_length + win_title_length ))
|
||
|
|
||
|
if [[ "$state" == 'F' ]]; then
|
||
|
taskbar+=" %{B${colors_bg_focused}}%{F${colors_bg_normal}}%{F-} ${win_title} %{B-}%{F${colors_bg_focused}}%{F-}"
|
||
|
else
|
||
|
taskbar+=" %{A:bspc window -f ${wid}:} ${win_title} %{A}"
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
(( panel_taskbar_max_title_current-- ))
|
||
|
done
|
||
|
fi
|
||
|
else
|
||
|
win_title="${REPLY#*T}"
|
||
|
if [[ "$win_title" ]]; then
|
||
|
taskbar=" %{B${colors_bg_focused}}%{F${colors_bg_normal}}%{F-} ${win_title} %{B-}%{F${colors_bg_focused}}%{F-}"
|
||
|
else
|
||
|
unset taskbar
|
||
|
fi
|
||
|
fi
|
||
|
;;
|
||
|
WM*)
|
||
|
unset desktop_spec
|
||
|
IFS=':' read -A bspwm_status <<< "$REPLY"
|
||
|
|
||
|
for i in "${bspwm_status[@]}"; do
|
||
|
if [[ "$i" =~ ^[oOfFuU].+ ]]; then
|
||
|
n="${i#*[oOfFuU]}"
|
||
|
|
||
|
case "$i" in
|
||
|
O*|F*|U*) desktop_spec+="%{B${colors_bg_focused}} $n %{B-}";;
|
||
|
u*) desktop_spec+="%{B${colour_urgent}}%{A:bspc desktop -f $n:} $n %{A}%{B-}";;
|
||
|
o*) desktop_spec+="%{B-}%{A:bspc desktop -f $n:} $n %{A}";;
|
||
|
f*)
|
||
|
(( panel_show_empty_tags )) && {
|
||
|
desktop_spec+="%{B-} $n "
|
||
|
}
|
||
|
;;
|
||
|
esac
|
||
|
fi
|
||
|
done
|
||
|
|
||
|
read _ _ _ _ layout float _ < <( bspc query -T -d focused | get_line 1 )
|
||
|
|
||
|
if [[ "$float" == 'f' ]]; then
|
||
|
float_flag='f'
|
||
|
else
|
||
|
float_flag=''
|
||
|
fi
|
||
|
|
||
|
case "$layout" in
|
||
|
T) layout_flag='t';;
|
||
|
M) layout_flag='m';;
|
||
|
esac
|
||
|
|
||
|
desktop_spec+=" %{A:bsptl:}[${layout_flag}${float_flag}]%{A}"
|
||
|
;;
|
||
|
esac
|
||
|
|
||
|
msg="$desktop_spec"
|
||
|
|
||
|
[[ "$taskbar" ]] && { msg+="$taskbar"; }
|
||
|
|
||
|
msg+="%{r}%{F${colors_bg_focused}}%{F-}%{B${colors_bg_focused}} $updates $date "
|
||
|
msg+='%{B-}%{F-}'
|
||
|
|
||
|
printf '%s\n' "$msg"
|
||
|
done < "$panel_fifo"
|
||
|
}
|
||
|
|
||
|
misc_status() {
|
||
|
declare ip msg date
|
||
|
|
||
|
while sleep 1; do
|
||
|
date=$( date +%A,\ %Y.%m.%d\ %H:%M:%S )
|
||
|
msg="[ $date ]"
|
||
|
printf 'S:%s\n' "$msg"
|
||
|
done
|
||
|
}
|
||
|
|
||
|
rexec() {
|
||
|
eval "kill ${${jobstates##*:*:}%=*[@]}"
|
||
|
exec "$0"
|
||
|
}
|
||
|
|
||
|
function panel_geometry
|
||
|
{
|
||
|
xrandr|grep -Eo '[[:digit:]]+x[[:digit:]]+\+[[:digit:]]+\+[[:digit:]]+'|awk -F'x|+' '{print $1,$2,$3,$4}'|read -A screen_geometry
|
||
|
((panel_h)) || panel_h=20
|
||
|
((panel_w)) || panel_w=$screen_geometry[2]
|
||
|
((panel_l)) || panel_l=$screen_geometry[3]
|
||
|
((panel_d)) || panel_d=$screen_geometry[4]
|
||
|
}
|
||
|
|
||
|
main() {
|
||
|
trap 'cleanup' EXIT TERM INT
|
||
|
trap 'rexec' HUP
|
||
|
|
||
|
[[ -e "$panel_fifo" ]] && {
|
||
|
rm "$panel_fifo" || { return 1; }
|
||
|
}
|
||
|
|
||
|
mkfifo "$panel_fifo"
|
||
|
|
||
|
if (( panel_taskbar_enable )); then
|
||
|
xtitle -s -t "$panel_taskbar_max_title" -f 'T%s' > "$panel_fifo" &
|
||
|
else
|
||
|
xtitle -s -f 'T%s' > "$panel_fifo" &
|
||
|
fi
|
||
|
|
||
|
bspc control --subscribe > "$panel_fifo" &
|
||
|
$bspwm_config_dir/panel_status &
|
||
|
|
||
|
bspc config top_padding "$(( panel_h + bspwm_window_gap ))"
|
||
|
|
||
|
parse_fifo_data | lemonbar -g "${panel_w}x${panel_h}+${panel_l}+${panel_d}" \
|
||
|
-f "$font_norm" \
|
||
|
-f "$font_bold" \
|
||
|
-F "$colors_fg_normal" \
|
||
|
-B "$colors_bg_normal" | zsh &
|
||
|
wait
|
||
|
}
|
||
|
|
||
|
main
|