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 ===================================== ![Example image](res/example.png) +

+ +

+

+

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 zcmV;y4LMmRA+E+#k}5;+|dX?}lLTv=|3iaH+_U~FqaFDG-8 zm5IN`VQy?cDk5lne2vD=W_Nc~R8Vu0l{+FCdZ46DMnH(W!h*54XnlQ-$c>oLE~}NIW%;$I2{v-zQk~gjeDY|UutNAu(euYUVyE#S6WtATUTgad2jNc|$WRJ}4h_l$LOej%9Uqa*&c@aBpF6ZACXQZ;6X> zj*x1AfKEt5gtfXg0QwfDj|lszd$V{Loq5+P)k)- zQgoG=R#;Su!N_-;o_3g5+n!$VZ2kP&>o>TTpLO

8679_)zFOWja2Y{A5g& zM(8#`A9R!5ZD`X<`g0>Tg7TNNFc95xK}GJU_P(Gy9)_U0&X+%|=Fvbl^|gcb5q6)i zbsRD1Y$D>WRg_8BMimc*bO5?onw-atu?yBlrx_{~Gggnvk5>njCuF4+Lp33+KPE11 zbLpY+4~WML9R~~7t4&`ZbX1c_lTf8Cg2tz1Z@D8>Bz3DpFVlzl0gN<5Sw!2{5M9<| zpF;lVkV2S_(0vEHmYdmn9*#!iKUA1 zwP#v=Q4GtI)t^RhWeW-<)Ro==a4+uI7>3Yam==yBlNJ6x@yP~Q-fb}@g!e()qS3~B zR&gj60Ji<|1YXgnuEolG3gN|-==m&)As$gMU!GOtX50bq!M)8AUq_mUlu{Msb~(sfUjrMIutVs3_m@3jFJgjspl#-c}kfIVLf9l z$7=kvFo2JSkCs`)CwDd)lg&yev7k&v0^6C zrlVkhOcaRE?x;QE-Y)}ZIXP~3iuijVyRwLB#Ym@vxrH$K96cIz3_{xz>9iwtIYM`~ zGSbN=G1q+a;GW4$PiYD9e`X5`^lBsiy8oQ9E3_R#6PdB)N`D5j6?lQ+6eSF7>NU;i zT_n3k77H-9x(s0b_Cafu*G`GQ63yeZl*A3b+*N`xRRc3k#syCR$O?X~RUD;XT)N6Q zeswgFZk_LEUrKlEu%IM{=bECd=ysT~N+3Ms#iDf?8TdKPn`A#HHfJ=gLos86^m8D4 zt~YVPw-V>7Zt`qpB7}8t`R{rW(F`jxoxb?^e67X4cR`0LkFe57^bVBm=sm))_4NW5 zZaT3SMR;}SW#U=!`N5X$riDZsab5N$*)glN(+pX+x!!&SFs|QP2uvb63&NY9uoi55-HfNWP4%Tr(`M^LT-`PV(&^68vZ~I+cfm!S&ri@~R zVy2VTz!jyTtXPV4%G;MtzB|!;?AjB5+uatJ6c0Da{l)#~qB*t4ZWpg%52|j2+2AN+ z@+njb0Hx0^B!^oG?m`@-$UXe=t6$Jy<+W2{IMJ*ROiA40!&TlFSM^VT&8c<6g0|j# zrd1rJUw~YHzF%ET1i)zMB6+CSA$F(2HG?wTh_>1&%eq0PT41qPljnyZfbxQB=>G8oaMkAdQzKZUwzv)HW2Vu&lhcy&3*q<7 zJDJuCEGHF7DXhAMciL74KU!c6iSeV-3EvbK*|Cf!IC}g6K0X=<9gWf{Y1EPp4Wu!Y5u{_mc(4=42sl90Qa2kzS`O2#CeTEgj|C#pMI*VFMY(` zaWGOJ$0>xP`pwfot2k=?>SiKCModjOal=l?HBA{#E=lkc3hzGJ9M>z|PxpbT3AO+W zTT*ESp<++zXRQ1*kmip_v zB4nRj*fm8NqSM-x-))Du{nWtFaeMnqFMxmi=8K%8qX4ED?xA%kLbR32kEi8(yi4!! zW?E^+Rb=wCvMNON(Rl!af)>#xz@p>hv%t`S|`#MP0t-r4zL%^y+Z=0l(N2 z=Lh)_sh&i;yf7c{*8#q;^vzaP7JNEXl}_b9uFbB3<|j~_cD|rJ`>5G?>P=D6m z+2+T+$9roMAlfvJx1|fi_H|GKDa83$TH!{!IHJ(iMAW%fQHEUd9IhZr{~x!J9}XxT zlYm>u2UHl<}p)4xFo1ZtXZ-7(M!p*;`0M=cI!rbq<4=`9OyjDYH@g$vawY+GtoWXkT6(n*2@VH|B3+*{rFS-TnBqEkvI v2@-S$DV-!p&>5t3k|056kkUzl1fAhuLigQb!osow00000NkvXXu0mjf0c(SG 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