Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,13 @@ dwmbar - A Modular Status Bar for dwm
=====================================
![Example image](res/example.png)

<p align="center">
<img src="res/bar2.png"/>
</p>

<p align="center">
<img src="res/bar.png"/>
</p>

dwmbar is a very simple status bar written for dwm.

Expand Down
51 changes: 41 additions & 10 deletions bar.sh
Original file line number Diff line number Diff line change
Expand Up @@ -23,20 +23,52 @@ fi
export LC_ALL=C
export LANG=C

# shellcheck source=/dev/null
source "$CONFIG_FILE"
if [[ "$CONFIG_FILE" == *.json ]]; then
MODULES=$(jq -r '.modules | join(" ")' "$CONFIG_FILE")
ONLINE_MODULES=$(jq -r '.online_modules | join(" ")' "$CONFIG_FILE")
DELAY=$(jq -r '.delay // 0.05' "$CONFIG_FILE")
SEPARATOR=$(jq -r '.separator // " | "' "$CONFIG_FILE")
LEFT_PADDING=$(jq -r '.left_padding // " "' "$CONFIG_FILE")
RIGHT_PADDING=$(jq -r '.right_padding // " "' "$CONFIG_FILE")
CUSTOM_DIR=$(jq -r '.custom_dir' "$CONFIG_FILE")
CUSTOM_DIR="${CUSTOM_DIR/#\~/$HOME}"
CUSTOM_DIR="${CUSTOM_DIR/\$USER/$USER}"
CUSTOM_DIR="${CUSTOM_DIR/\$HOME/$HOME}"
[[ -z "$CUSTOM_DIR" ]] && CUSTOM_DIR="$HOME/.config/dwmbar/modules/custom/"
else
# shellcheck source=/dev/null
source "$CONFIG_FILE"
fi

export SEPARATOR
export MODULES
export ONLINE_MODULES
export DELAY
export LEFT_PADDING
export RIGHT_PADDING
export CUSTOM_DIR

get_bar()
{
local bar=""
local first=true

for module in $MODULES; do
if [[ $INTERNET -eq 0 ]] || [[ $ONLINE_MODULES != *"$module"* ]];then
module_out="$(sed 's/\.$//g' "$OUTPUT_CACHE$module")"
bar="$bar$module_out"
if [[ $INTERNET -eq 0 ]] || [[ $ONLINE_MODULES != *"$module"* ]]; then
module_out="$(cat "$OUTPUT_CACHE$module" 2>/dev/null)"

if [[ -n "$module_out" ]]; then
if [[ "$first" == true ]]; then
bar="$module_out"
first=false
else
bar="$bar$SEPARATOR$module_out"
fi
fi
fi
done
# Uncomment to remove last separator
# bar="$(echo "$bar" | sed 's/.$//g')"
echo "$LEFT_PADDING${bar::-2}$RIGHT_PADDING"

echo "$LEFT_PADDING$bar$RIGHT_PADDING"
}

run_module()
Expand All @@ -50,8 +82,7 @@ run_module()

if [[ "$out" = " " ]]; then
echo "" > "$OUTPUT_CACHE$module"
elif [[ ! "$out" = "" ]]; then
out="$out$SEPARATOR."
else
echo "$out" > "$OUTPUT_CACHE$module"
fi
}
Expand Down
46 changes: 42 additions & 4 deletions dwmbar
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,19 @@ export SYNC_SCRIPT
CONFIG_DIR="/home/$USER/.config/dwmbar/"
export CONFIG_DIR

CUSTOM_DIR="$CONFIG_DIR/custom/"
CUSTOM_DIR="$CONFIG_DIR/modules/custom/"
export CUSTOM_DIR

CONFIG_FILE="$CONFIG_DIR/config"
if [[ ! -f "$CONFIG_FILE" ]]; then
CONFIG_FILE=$DEFAULT_CONFIG_LOCATION
# Prefer JSON config if jq is available and file exists
JSON_CONFIG="$CONFIG_DIR/config.json"
BASH_CONFIG="$CONFIG_DIR/config"

if command -v jq >/dev/null 2>&1 && [[ -f "$JSON_CONFIG" ]]; then
CONFIG_FILE="$JSON_CONFIG"
elif [[ -f "$BASH_CONFIG" ]]; then
CONFIG_FILE="$BASH_CONFIG"
else
CONFIG_FILE="$DEFAULT_CONFIG_LOCATION"
fi
export CONFIG_FILE

Expand Down Expand Up @@ -90,6 +97,33 @@ check_files(){
fi
}

load_config() {
if [[ "$CONFIG_FILE" == *.json ]]; then
MODULES=$(jq -r '.modules | join(" ")' "$CONFIG_FILE")
ONLINE_MODULES=$(jq -r '.online_modules | join(" ")' "$CONFIG_FILE")
DELAY=$(jq -r '.delay // 0.05' "$CONFIG_FILE")
SEPARATOR=$(jq -r '.separator // " | "' "$CONFIG_FILE")
LEFT_PADDING=$(jq -r '.left_padding // " "' "$CONFIG_FILE")
RIGHT_PADDING=$(jq -r '.right_padding // " "' "$CONFIG_FILE")
CUSTOM_DIR=$(jq -r '.custom_dir' "$CONFIG_FILE")
CUSTOM_DIR="${CUSTOM_DIR/#\~/$HOME}"
CUSTOM_DIR="${CUSTOM_DIR/\$USER/$USER}"
CUSTOM_DIR="${CUSTOM_DIR/\$HOME/$HOME}"
[[ -z "$CUSTOM_DIR" ]] && CUSTOM_DIR="$HOME/.config/dwmbar/modules/custom/"
else
# shellcheck source=/dev/null
source "$CONFIG_FILE"
fi

export SEPARATOR
export MODULES
export ONLINE_MODULES
export DELAY
export LEFT_PADDING
export RIGHT_PADDING
export CUSTOM_DIR
}

while getopts 'vc' flag; do
case "${flag}" in
v) print_help
Expand Down Expand Up @@ -118,14 +152,18 @@ if [[ -x "$SYNC_SCRIPT" ]]; then
"$SYNC_SCRIPT" 2>/dev/null || true
fi

load_config

while :; do
date=$(date +'%S')
if [ $(( 10#$date % 5 )) -eq 0 ]; then
INTERNET=$(check_internet)
export INTERNET
# Sync again periodically in case user edits config
if [[ -x "$SYNC_SCRIPT" ]]; then
"$SYNC_SCRIPT" 2>/dev/null || true
fi
load_config
sleep 1
fi
xsetroot -name "$(exec $DEFAULT_BAR_LOCATION)"
Expand Down
21 changes: 6 additions & 15 deletions modules/archupdates
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,19 @@ set -euo pipefail
# shellcheck source=../lib/cache.sh
. "$(dirname "$0")/../lib/cache.sh"

PREFIX=' Updates: '
CACHE_KEY="arch_updates"
PREFIX=' Updates: '
CACHE_KEY="arch_updates_official"
CACHE_DURATION=${ARCH_UPDATES_CACHE_SECONDS:-300}

get_updates() {
local updates_arch=0 updates_aur=0 total=0
local updates=0

if command -v checkupdates >/dev/null 2>&1; then
updates_arch=$(checkupdates 2>/dev/null | wc -l)
updates=$(checkupdates 2>/dev/null | wc -l)
fi

if command -v yay >/dev/null 2>&1; then
updates_aur=$(yay -Qum 2>/dev/null | wc -l)
elif command -v paru >/dev/null 2>&1; then
updates_aur=$(paru -Qum 2>/dev/null | wc -l)
elif command -v trizen >/dev/null 2>&1; then
updates_aur=$(trizen -Qum 2>/dev/null | wc -l)
fi

total=$((updates_arch + updates_aur))
cache_write "$CACHE_KEY" "$total"
echo "$PREFIX$total"
cache_write "$CACHE_KEY" "$updates"
echo "$PREFIX$updates"
}

if cached=$(cache_read "$CACHE_KEY" "$CACHE_DURATION" 2>/dev/null); then
Expand Down
31 changes: 31 additions & 0 deletions modules/archupdates-aur
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#!/bin/bash
set -euo pipefail
# shellcheck source=../lib/common.sh
. "$(dirname "$0")/../lib/common.sh"
# shellcheck source=../lib/cache.sh
. "$(dirname "$0")/../lib/cache.sh"

PREFIX=' AUR Updates: '
CACHE_KEY="arch_updates_aur"
CACHE_DURATION=${ARCH_UPDATES_AUR_CACHE_SECONDS:-300}

get_aur_updates() {
local updates=0

if command -v yay >/dev/null 2>&1; then
updates=$(yay -Qum 2>/dev/null | wc -l)
elif command -v paru >/dev/null 2>&1; then
updates=$(paru -Qum 2>/dev/null | wc -l)
elif command -v trizen >/dev/null 2>&1; then
updates=$(trizen -Qum 2>/dev/null | wc -l)
fi

cache_write "$CACHE_KEY" "$updates"
echo "$PREFIX$updates"
}

if cached=$(cache_read "$CACHE_KEY" "$CACHE_DURATION" 2>/dev/null); then
echo "$PREFIX$cached"
else
get_aur_updates
fi
Binary file added res/bar2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion tests/expected/archupdates.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
Updates: 4
Updates: 1
2 changes: 0 additions & 2 deletions todo.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
# TODO

- Separator optional between modules
- Call all modules once on startup, then deal with delays
- Different archupdates and arch AUR updates that write to the same file so you can use only 1 of them