herbstluft: switch from dzen2 to polybar

This commit is contained in:
2023-07-08 15:20:42 +03:00
parent 7058831a02
commit 8482589033
3 changed files with 12 additions and 239 deletions

View File

@ -212,15 +212,18 @@ hc set focus_follows_mouse 1
# panel
hc detect_monitors
ps aux | grep panel.sh | grep -v grep | awk '{print $2}' | xargs kill
panel=~/.config/herbstluftwm/panel/panel.sh
for monitor in $(hc list_monitors | cut -d: -f1); do
"$panel" "$monitor" &
done
# ps aux | grep panel.sh | grep -v grep | awk '{print $2}' | xargs kill
# panel=~/.config/herbstluftwm/panel/panel.sh
# for monitor in $(hc list_monitors | cut -d: -f1); do
# "$panel" "$monitor" &
# done
pidof dunst || dunst &
pidof mpd || mpd &
pidof flameshot || flameshot &
pidof lxpolkit || lxpolkit &
pidof picom || picom --experimental-backends &
wal -R
~/.fehbg
${HOME}/.config/herbstluftwm/panel.sh

4
.config/herbstluftwm/panel.sh Executable file
View File

@ -0,0 +1,4 @@
#!/usr/bin/env bash
polybar-msg cmd quit
polybar main 2>&1 & disown

View File

@ -1,234 +0,0 @@
#!/usr/bin/env bash
. "${HOME}/.cache/wal/colors.sh"
quote() {
local q="$(printf '%q ' "$@")"
printf '%s' "${q% }"
}
hc_quoted="$(quote "${herbstclient_command[@]:-herbstclient}")"
hc() { "${herbstclient_command[@]:-herbstclient}" "$@"; }
monitor=${1:-0}
geometry=($(hc monitor_rect "$monitor"))
if [ -z "$geometry" ]; then
echo "Invalid monitor $monitor"
exit 1
fi
# geometry has the format W H X Y
x=$((${geometry[0]} + 12))
y=$((${geometry[1]} + 12))
panel_width=$((${geometry[2]} - 24))
panel_height=29
font="*mono*"
####
# Try to find textwidth binary.
# In e.g. Ubuntu, this is named dzen2-textwidth.
if which textwidth &>/dev/null; then
textwidth="textwidth"
elif which dzen2-textwidth &>/dev/null; then
textwidth="dzen2-textwidth"
elif which xftwidth &>/dev/null; then # For guix
textwidth="xtfwidth"
else
echo "This script requires the textwidth tool of the dzen2 project."
exit 1
fi
####
# true if we are using the svn version of dzen2
# depending on version/distribution, this seems to have version strings like
# "dzen-" or "dzen-x.x.x-svn"
if dzen2 -v 2>&1 | head -n 1 | grep -q '^dzen-\([^,]*-svn\|\),'; then
dzen2_svn="true"
else
dzen2_svn=""
fi
if awk -Wv 2>/dev/null | head -1 | grep -q '^mawk'; then
mawk needs "-W interactive" to line-buffer stdout correctly
# http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=593504
uniq_linebuffered() {
awk -W interactive '$0 != l { print ; l=$0 ; fflush(); }' "$@"
}
else
# other awk versions (e.g. gawk) issue a warning with "-W interactive", so
# we don't want to use it there.
uniq_linebuffered() {
awk '$0 != l { print ; l=$0 ; fflush(); }' "$@"
}
fi
# get the current pulseaudio volume, or state incase muted
pulsegetvol() {
if [ $(pamixer --get-mute) == 1 ]; then
echo -ne "^fg($foreground)muted\n"
else
volume=$(pamixer --get-volume-human)
echo -n "^fg($foreground)$volume"
fi
}
# using pactl we can subscribe to pulseaudio and check for changes
pulsesub() {
pactl subscribe | grep --line-buffered "change.*sink" | while read -r line; do
echo -ne "pulseaudio\t$(pulsegetvol)\n"
done
}
# used when reloading / quitting, kills all event generators as they no longer have a use
list_descendants() {
local children=$(ps -o pid= --ppid "$1")
for pid in $children; do
list_descendants "$pid"
done
echo "$children"
}
hc pad $monitor $(($panel_height + 12))
{
### Event generator ###
# based on different input data (mpc, date, hlwm hooks, ...) this generates events, formed like this:
# <eventname>\t<data> [...]
# e.g.
# date ^fg(#efefef)18:33^fg(#909090), 2013-10-^fg(#efefef)29
#mpc idleloop player &
pulsesub &
while true; do
# "date" output is checked once a second, but an event is only
# generated if the output changed compared to the previous run.
date +$"date ^fg($foreground)%a %b %d %H:%M"
sleep 1 || break
done > >(uniq_linebuffered) &
hc --idle
} 2>/dev/null | {
IFS=$'\t' read -ra tags <<<"$(hc tag_status $monitor)"
visible=true
date=""
windowtitle=""
volume="$(pulsegetvol)"
while true; do
### Output ###
# This part prints dzen data based on the _previous_ data handling run,
# and then waits for the next event to happen.
separator="^bg()^fg($color8)|"
# draw tags
for i in "${tags[@]}"; do
case ${i:0:1} in
'.')
# the tag is empty
# TODO Add your formatting tags
echo -n "^bg()^fg($color8)"
;;
':')
# the tag is not empty
echo -n "^bg()^fg($foreground)"
;;
'+')
# the tag is viewed on the specified MONITOR, but this monitor is not focused.
echo -n "^bg($color1)^fg()"
;;
'#')
# the tag is viewed on the specified MONITOR and it is focused.
echo -n "^bg($color2)^fg()"
;;
'-')
# the tag is viewed on a different MONITOR, but this monitor is not focused.
echo -n "^bg($color1)^fg()"
;;
'%')
# the tag is viewed on a different MONITOR and it is focused.
echo -n "^bg($color2)^fg()"
;;
'!')
# the tag contains an urgent window
# TODO Add your formatting tags
echo -n "^bg($color6)^fg()"
;;
esac
if [ ! -z "$dzen2_svn" ]; then
# clickable tags if using SVN dzen
echo -n "^ca(1,$hc_quoted focus_monitor \"$monitor\" && "
echo -n "$hc_quoted use \"${i:1}\") ${i:1} ^ca()"
else
# non-clickable tags if using older dzen
echo -n " ${i:1} "
fi
done
echo -n "$separator"
echo -n "^bg()^fg() ${windowtitle//^/^^}"
# small adjustments
right="$volume $separator $date"
right_text_only=$(echo -n "$right" | sed 's.\^[^(]*([^)]*)..g')
# get width of right aligned text.. and add some space..
width=$($textwidth "$font" "$right_text_only ")
echo -n "^pa($(($panel_width - $width)))$right"
echo
### 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
# find out event origin
case "${cmd[0]}" in
tag*)
#echo "resetting tags" >&2
IFS=$'\t' read -ra tags <<<"$(hc tag_status $monitor)"
;;
date)
#echo "resetting date" >&2
date="${cmd[@]:1}"
;;
quit_panel)
kill $(list_descendants $$)
exit
;;
togglehidepanel)
currentmonidx=$(hc list_monitors | sed -n '/\[FOCUS\]$/s/:.*//p')
if [ "${cmd[1]}" -ne "$monitor" ]; then
continue
fi
if [ "${cmd[1]}" = "current" ] && [ "$currentmonidx" -ne "$monitor" ]; then
continue
fi
echo "^togglehide()"
if $visible; then
visible=false
hc pad $monitor 0
else
visible=true
hc pad $monitor $(($panel_height + 12))
fi
;;
reload)
kill $(list_descendants $$)
exit
;;
focus_changed | window_title_changed)
windowtitle="${cmd[@]:2}"
;;
pulseaudio)
volume="${cmd[@]:1}"
;;
esac
done
### dzen2 ###
# After the data is gathered and processed, the output of the previous block
# gets piped to dzen2.
} 2>/dev/null | dzen2 -w $panel_width -x $x -y $y -fn mononoki-15 -h $panel_height \
-e "button3=;button4=exec:$hc_quoted use_index -1;button5=exec:$hc_quoted use_index +1" \
-ta l -bg "$background" -fg "$foreground"