From 657c1c306818a9e22cde24db76e859e50d9f7495 Mon Sep 17 00:00:00 2001 From: Daniel Flanagan Date: Tue, 12 Jan 2016 15:02:12 -0600 Subject: [PATCH] basic bar and module system ready --- .gitignore | 1 + wm/extras/bar/colors.bash | 6 +++ wm/extras/bar/formatter.bash | 38 ++++++++++++---- wm/extras/bar/modules/bspwm-bm.bash | 70 +++++++++++++++++++++++++++++ wm/extras/bar/modules/clock-bm.bash | 25 +++++++++++ wm/extras/bar/modules/example.bash | 45 +++++++++++++++++++ wm/extras/bar/start.bash | 6 ++- 7 files changed, 181 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index b209927..0d0508b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ colors/gen/vendor colors/gen/tmp *.lock +*.log diff --git a/wm/extras/bar/colors.bash b/wm/extras/bar/colors.bash index af81f1a..09db517 100644 --- a/wm/extras/bar/colors.bash +++ b/wm/extras/bar/colors.bash @@ -4,3 +4,9 @@ export COLOR_BACKGROUND="#ff$(get_color 00)" export COLOR_HIGHLIGHT="#ff$(get_color 0D)" export COLOR_URGENT="#ff$(get_color 08)" +export COLOR_S1="#ff$(get_color 0E)" +export COLOR_S2="#ff$(get_color 0F)" +export COLOR_S3="#ff$(get_color 0D)" +export COLOR_S4="#ff$(get_color 0A)" +export COLOR_S5="#ff$(get_color 09)" + diff --git a/wm/extras/bar/formatter.bash b/wm/extras/bar/formatter.bash index 3bbe06e..da90512 100755 --- a/wm/extras/bar/formatter.bash +++ b/wm/extras/bar/formatter.bash @@ -3,6 +3,9 @@ source "$DOTFILES_PATH/variables.bash" source "$DOTFILES_PATH/wm/extras/bar/colors.bash" +export BAR_LOG="$PWD/bar.log" +echo -e "BEGIN BAR LOG\n" > "$BAR_LOG" + ul="u" if [ $BAR_UNDERLINE -eq 1 ]; then : @@ -10,23 +13,42 @@ else ul="o" fi -export $MODULE_MATCH= -export $MODULE_CALLBACK= -export $MODULE_DATA= +export MODULE_MATCH=() +export MODULE_CALLBACK=() +export MODULE_DATA=() +export MODULE_CONTENT=() register_bar_module() { - : + MODULE_MATCH[$1]=$2 + MODULE_CALLBACK[$1]=$3 + MODULE_DATA[$1]= + MODULE_CONTENT[$1]= + echo -e "Registered Bar Module: $1 $2 $3" >> "$BAR_LOG" } export -f register_bar_module -source "$DOTFILES_PATH/wm/extras/bar/modules/*-bm.bash" +for f in "$DOTFILES_PATH/wm/extras/bar/modules/"*-bm.bash; do + source "$f" +done while read -r line; do - content= - for i in $MODULE_MATCH; do - content=$content$i + echo -e "Bar Line: $line" >> "$BAR_LOG" + for i in ${!MODULE_MATCH[@]}; do + if [[ $line == ${MODULE_MATCH[$i]} ]]; then + echo -e "Bar Module Update: [$i] Matched ${MODULE_MATCH[$i]} with $line" >> "$BAR_LOG" + MODULE_CONTENT[$i]=$("${MODULE_CALLBACK[$i]}" $line) + echo -e "New Module Content: "${MODULE_CONTENT[$i]} >> "$BAR_LOG" + fi + done + + content="" + for i in ${!MODULE_CONTENT[@]}; do + echo -e "Processing Module $i Content..." >> "$BAR_LOG" + content="$content ${MODULE_CONTENT[$i]}" done printf " %s \n" "$content" done +echo -e "\nEND BAR LOG" >> "$BAR_LOG" + diff --git a/wm/extras/bar/modules/bspwm-bm.bash b/wm/extras/bar/modules/bspwm-bm.bash index e69de29..834ef99 100644 --- a/wm/extras/bar/modules/bspwm-bm.bash +++ b/wm/extras/bar/modules/bspwm-bm.bash @@ -0,0 +1,70 @@ +#!/usr/bin/env bash + +source "$DOTFILES_PATH/variables.bash" +source "$DOTFILES_PATH/wm/extras/bar/colors.bash" + +PRIORITY=2500 + +MATCH_PREFIX="W" +MATCH="$MATCH_PREFIX*" + +ul="u" +if [ $BAR_UNDERLINE -eq 1 ]; then + : +else + ul="o" +fi + +bar_module_bspwm() { + content="%{F$COLOR_FOREGROUND}%{c}" + line=$1 + IFS=':' + set -- ${line#?} + while [ $# -gt 0 ] ; do + item=$1 + name=${item#?} + cname="$name" + case $item in + M*) + : + ;; + m*) + : + ;; + O*) + # focused occupied desktop + content="${content} %{F$COLOR_HIGHLIGHT}%{U$COLOR_HIGHLIGHT}%{+${ul}}${cname}%{-${ul}}%{U-}%{F-}" + ;; + F*) + # focused free desktop + content="${content} %{F$COLOR_DARK}%{U$COLOR_DARK}%{+${ul}}${cname}%{-${ul}}%{U-}%{F-}" + ;; + U*) + # focused occupied desktop + content="${content} %{F$COLOR_URGENT}%{U$COLOR_URGENT}%{+${ul}}${cname}%{-${ul}}%{U-}%{F-}" + ;; + o*) + # occupied desktop + content="${content} %{F$COLOR_FOREGROUND}${cname}%{F-}" + ;; + f*) + # free desktop + content="${content} %{F$COLOR_DARK}${cname}%{F-}" + ;; + u*) + # urgent desktop + content="${content} %{F$COLOR_URGENT}${cname}%{F-}" + ;; + L*) + # layout + ;; + esac + shift + done + echo -e "$content%{F-}" +} +export -f bar_module_bspwm +register_bar_module "$PRIORITY" "$MATCH" "bar_module_bspwm" + +bspc subscribe all > "$BAR_FIFO" & + diff --git a/wm/extras/bar/modules/clock-bm.bash b/wm/extras/bar/modules/clock-bm.bash index e69de29..b61b8c1 100644 --- a/wm/extras/bar/modules/clock-bm.bash +++ b/wm/extras/bar/modules/clock-bm.bash @@ -0,0 +1,25 @@ +#!/usr/bin/env bash + +source "$DOTFILES_PATH/variables.bash" +source "$DOTFILES_PATH/wm/extras/bar/colors.bash" + +PRIORITY=3800 + +MATCH_PREFIX="BM_CLOCK" +MATCH="$MATCH_PREFIX*" + +bar_module_clock() { + echo -e "%{T-}%{r}%{F$COLOR_S1}${1:8}%{F-}" +} + +export -f bar_module_clock +register_bar_module "$PRIORITY" "$MATCH" "bar_module_clock" + +bar_module_clock_updater() { + while true; do + echo -e "$MATCH_PREFIX""$(date +%H.%M.%S)" > $BAR_FIFO + sleep 1 + done +} +bar_module_clock_updater & + diff --git a/wm/extras/bar/modules/example.bash b/wm/extras/bar/modules/example.bash index e69de29..0c067c5 100644 --- a/wm/extras/bar/modules/example.bash +++ b/wm/extras/bar/modules/example.bash @@ -0,0 +1,45 @@ +#!/usr/bin/env bash + +source "$DOTFILES_PATH/variables.bash" + +# This defines this module's priority, determining where it will be rendered on +# the bar relative to other modules. +PRIORITY=2500 + +# This is the trigger that the incoming line from the FIFO must match in order +# to be processed by this module. +MATCH_PREFIX="BM_EXAMPLE" +MATCH="$MATCH_PREFIX*" + +# Define the function that will be called upon the match being triggered. This +# should process the first argument (the line from the FIFO) and echo the +# desired bar output. +bar_module_example() { + # Write the line from the 10th character (cutting off the MATCH_PREFIX) with + # lemonbar's left-align delimiter. + echo -e "%{l}${1:10}" +} + +# Export our function so that the formatter script can call it. +export -f bar_module_bspwm + +# Call this handy function for adding the various thing we declared to the +# MODULE_ variables that the formatter script uses. +register_bar_module "$PRIORITY" "$MATCH" "bar_module_example" + +# Create a function that will periodically write to the FIFO with the correct +# prefix, thereby updating the module. +bar_module_example_updater() { + while [ $BAR_RUNNING -eq 1 ]; do + echo -e "$MATCH_PREFIX""$(date +%H.%M)" > "$BAR_FIFO" + sleep 30 + done +} + +# Fork that function to a background process. +bar_module_clock_updater & + +# Optional: Initialize that module by immediately writing to the FIFO using your +# prefix to show some default information on the bar when it loads. +echo -e "$MATCH_PREFIX"Loading... > "$BAR_FIFO" + diff --git a/wm/extras/bar/start.bash b/wm/extras/bar/start.bash index 65a5538..1b30cdb 100755 --- a/wm/extras/bar/start.bash +++ b/wm/extras/bar/start.bash @@ -2,7 +2,9 @@ source "$DOTFILES_PATH/variables.bash" +export BAR_RUNNING=1 function killbar() { + export BAR_RUNNING=0 if [ $BAR_TOP -eq 1 ]; then bspc config -m $(bspc query -M | head -n 1) top_padding "0" else @@ -21,8 +23,6 @@ else bspc config -m $(bspc query -M | head -n 1) bottom_padding "$BAR_HEIGHT" fi -bspc subscribe all > "$BAR_FIFO" & - # get width of our main monitor WIDTH=`xrandr -q | egrep '(^| )connected( |$)' | tr 'x' '\n' | head -n 1 | awk '{print $NF}'` WIDTH=$((WIDTH-BAR_MARGIN-BAR_MARGIN)) @@ -37,3 +37,5 @@ fi source "$DOTFILES_PATH/wm/extras/bar/colors.bash" cat "$BAR_FIFO" | "$DOTFILES_PATH/wm/extras/bar/formatter.bash" | lemonbar $BAR_B -d -g "$WIDTH"x"$BAR_HEIGHT"+"$BAR_MARGIN"+"$POS_Y" -u "$BAR_BORDER_WIDTH" -f "$BAR_FONT_FAMILY" -F "$COLOR_FOREGROUND" -B "$COLOR_BACKGROUND" + +killbar