From b8b52da9c9d828489eb2ed64bf6ed1551c4a4a69 Mon Sep 17 00:00:00 2001
From: Robin Hirst <147210082+robinhirst11@users.noreply.github.com>
Date: Sat, 22 Nov 2025 18:44:13 +0000
Subject: [PATCH 1/4] fix: make separator and custom_dir config options
actually work by exporting variables and handling JSON config parsing in
bar.sh
---
bar.sh | 51 +++++++++++++++++++++++++++++++++++++++++----------
dwmbar | 44 +++++++++++++++++++++++++++++++++++++++++---
2 files changed, 82 insertions(+), 13 deletions(-)
diff --git a/bar.sh b/bar.sh
index 2e096bc..bd012d1 100755
--- a/bar.sh
+++ b/bar.sh
@@ -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()
@@ -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
}
diff --git a/dwmbar b/dwmbar
index a038c93..4354a71 100755
--- a/dwmbar
+++ b/dwmbar
@@ -32,9 +32,16 @@ export CONFIG_DIR
CUSTOM_DIR="$CONFIG_DIR/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
@@ -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
@@ -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)"
From b3a3862a8ed4212d4c4c0e3066badd0d3c244632 Mon Sep 17 00:00:00 2001
From: Robin Hirst <147210082+robinhirst11@users.noreply.github.com>
Date: Sat, 22 Nov 2025 22:29:55 +0000
Subject: [PATCH 2/4] feature: seperated archupdates into archupdates and
archupdates-aur, fixed the config dir with a slight discrepance, and added a
new image showcasing the different seperators you can make
---
README.md | 5 +++++
dwmbar | 2 +-
modules/archupdates | 21 ++++++---------------
modules/archupdates-aur | 31 +++++++++++++++++++++++++++++++
res/bar2.png | Bin 0 -> 3521 bytes
5 files changed, 43 insertions(+), 16 deletions(-)
create mode 100755 modules/archupdates-aur
create mode 100644 res/bar2.png
diff --git a/README.md b/README.md
index 926fbd5..94337bb 100644
--- a/README.md
+++ b/README.md
@@ -2,8 +2,13 @@ dwmbar - A Modular Status Bar for dwm
=====================================

+
+
+
+
+
dwmbar is a very simple status bar written for dwm.
diff --git a/dwmbar b/dwmbar
index 4354a71..f7483bc 100755
--- a/dwmbar
+++ b/dwmbar
@@ -29,7 +29,7 @@ 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
# Prefer JSON config if jq is available and file exists
diff --git a/modules/archupdates b/modules/archupdates
index 22144d8..d38e41f 100755
--- a/modules/archupdates
+++ b/modules/archupdates
@@ -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
diff --git a/modules/archupdates-aur b/modules/archupdates-aur
new file mode 100755
index 0000000..e129ae0
--- /dev/null
+++ b/modules/archupdates-aur
@@ -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
diff --git a/res/bar2.png b/res/bar2.png
new file mode 100644
index 0000000000000000000000000000000000000000..f6d4c1749745e5f6cde4127dcab1c129ee36e907
GIT binary patch
literal 3521
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
literal 0
HcmV?d00001
From aa70d50155dc38a8ad8db96445b7075b00f029b8 Mon Sep 17 00:00:00 2001
From: Robin Hirst <147210082+robinhirst11@users.noreply.github.com>
Date: Sat, 22 Nov 2025 22:31:02 +0000
Subject: [PATCH 3/4] fix: update todo file
---
todo.md | 2 --
1 file changed, 2 deletions(-)
diff --git a/todo.md b/todo.md
index 9c04c43..36aaab8 100644
--- a/todo.md
+++ b/todo.md
@@ -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
From 00d8bf7ea35007c0d855e0acb4e3d89611eaf4fb Mon Sep 17 00:00:00 2001
From: Robin Hirst <147210082+robinhirst11@users.noreply.github.com>
Date: Sat, 22 Nov 2025 22:40:26 +0000
Subject: [PATCH 4/4] fix: fix CI tests with aur seperated from pacman
---
tests/expected/archupdates.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tests/expected/archupdates.txt b/tests/expected/archupdates.txt
index 2cdebd2..d646874 100644
--- a/tests/expected/archupdates.txt
+++ b/tests/expected/archupdates.txt
@@ -1 +1 @@
- Updates: 4
+ Updates: 1