Source

dotfiles / config / herbstluftwm / panel.sh

#!/bin/bash

# disable path name expansion or * will be expanded in the line
# cmd=( $line )
set -f

monitor=${1:-0}
geometry=( $(herbstclient monitor_rect "$monitor") )
if [ -z "$geometry" ] ;then
    echo "Invalid monitor $monitor"
    exit 1
fi
# geometry has the format: WxH+X+Y
x=${geometry[0]}
y=${geometry[1]}
panel_width=${geometry[2]}
panel_height=14
font="-*-fixed-medium-*-*-*-10-*-*-*-*-*-*-*"
#font="DejaVu Sans Mono:size=8"
bgcolor=$(herbstclient get frame_border_normal_color)
selbg=$(herbstclient get window_border_active_color)
selfg='#101010'

####
# Try to find textwidth binary.
# In e.g. Ubuntu, this is named dzen2-textwidth.
if [ -e "$(which textwidth 2> /dev/null)" ] ; then
    textwidth="textwidth";
elif [ -e "$(which dzen2-textwidth 2> /dev/null)" ] ; then
    textwidth="dzen2-textwidth";
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
dzen2_version=$(dzen2 -v 2>&1 | head -n 1 | cut -d , -f 1|cut -d - -f 2)
if [ -z "$dzen2_version" ] ; then
    dzen2_svn="true"
else
    dzen2_svn=""
fi

function uniq_linebuffered() {
    awk '$0 != l { print ; l=$0 ; fflush(); }' "$@"
}

herbstclient pad $monitor $panel_height
{
    # events:
  # (mpc idleloop player | sed 's/^/mpd_/') &
    (mpc idleloop player | cat) &
  # mpc idleloop player &

    while true; do echo 'tick'; sleep 5; done &

    while true ; do
        date +'date ^fg()%H^fg(#909090):^fg()%M^fg(#909090), %Y-%m-^fg()%d'
        sleep 1 || break
    done > >(uniq_linebuffered)  &

    childpid=$!
    herbstclient --idle
    kill $childpid

} 2> /dev/null | {
    TAGS=( $(herbstclient tag_status $monitor) )
    visible=true

    date="^fg()--"
    windowtitle=""

    brightstatus="^fg()--"
    batstatus="^fg()--"
    thermstatus="^fg()--"
    nowplaying="^fg()--"

    while true ; do
        bordercolor="#26221C"
        separator="^bg()^fg($selbg)|"
        # draw tags
        for i in "${TAGS[@]}" ; do
            case ${i:0:1} in
                '#')
                    echo -n "^bg($selbg)^fg($selfg)"
                    ;;
                '+')
                    echo -n "^bg(#9CA668)^fg(#141414)"
                    ;;
                ':')
                    echo -n "^bg()^fg(#ffffff)"
                    ;;
                '!')
                    echo -n "^bg(#FF0675)^fg(#141414)"
                    ;;
                *)
                    echo -n "^bg()^fg(#ababab)"
                    ;;
            esac
            if [ ! -z "$dzen2_svn" ] ; then
                echo -n "^ca(1,herbstclient focus_monitor $monitor && "'herbstclient use "'${i:1}'") '"${i:1} ^ca()"
            else
                echo -n " ${i:1} "
            fi
        done

        echo -n "$separator"
        echo -n "^bg()^fg() ${windowtitle//^/^^}"

        S="$separator"

        # small adjustments
        right="$separator^bg() $brightstatus $S $thermstatus $S $batstatus $S $nowplaying $S $date $S"
        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 ")
      # width=300

        echo -n "^pa($(($panel_width - $width)))$right"
        echo

        # wait for next event
        read line || break
        cmd=( $line )
        # find out event origin
        case "${cmd[0]}" in
            tag*)
                #echo "reseting tags" >&2
                TAGS=( $(herbstclient tag_status $monitor) )
                ;;
            date)
                #echo "reseting date" >&2
                date="${cmd[@]:1}"
                ;;
            quit_panel)
                exit
                ;;
            togglehidepanel)
                echo "^togglehide()"
                if $visible ; then
                    visible=false
                    herbstclient pad $monitor 0
                else
                    visible=true
                    herbstclient pad $monitor $panel_height
                fi
                ;;
            reload)
                exit
                ;;
            focus_changed|window_title_changed)
                windowtitle="${cmd[@]:2}"
                ;;

            brightness)
                brightstatus="$(printf '^fg()%d^fg(#909090)%%' $(brightness-alter.sh '?'))"
                ;;

            tick)
                batstatus="$( t='/sys/class/power_supply/BAT1/'
                              curr=$(cat $t/charge_now)
                              full=$(cat $t/charge_full)
                              status=$(cat $t/status)
                              percent=$(printf '100 * %d / %d\n' $curr $full | bc)

                              if [ $status == Full ]; then
                                printf '^fg(#909090)%s' $status
                              else
                                printf '^fg(#909090)%s: ^fg()%d%%' $status $percent
                              fi )"

                thermstatus="$( t='/sys/class/thermal/thermal_zone0'
                                curr=$(cat $t/temp)
                                degrees=$(printf '%d / 1000\n' $curr | bc)
                                printf '^fg()%d^fg(#909090)C' $degrees )"
                ;;

            mpd_player|player)
              # nowplaying="$(mpc current -f '^fg()[%artist% - ][%title%|%file%][ [%time%]]')"
                nowplaying="$(mpc current -f '^fg()%artist% - %title%')"
                ;;
        esac
        done
} 2> /dev/null | dzen2 -w $panel_width -x $x -y $y -fn "$font" -h $panel_height \
    -ta l -bg "$bgcolor" -fg '#efefef'