xmobar: show the next calcurse appointment

Time of today's next appointment, or an icon for a whole-day event today or an appointment tomorrow; click lists both days, right-click opens the calcurse scratchpad. Uptime dropped and the date shortened to make room.
This commit is contained in:
Daniele Fucini committed 2026-11-12 16:03:00 +01:00
1 parent 3053b35f26
commit c103510786
3 files changed
+48 -10

No files matched your search

+42
View File
@@ -0,0 +1,42 @@
#!/bin/bash
# Next calcurse item for xmobar: pink " 10:15 | " for an appointment later today, a cyan icon for a whole-day
# event today, a pink icon alone when the next appointment is tomorrow; empty otherwise.
# With "list": show today's and tomorrow's items in a notification (for a click on the bar)
set -uo pipefail
icon=$'\xf3\xb0\x83\xad' # nf-md-calendar, as UTF-8 bytes so the locale doesn't matter
today=$(date +%F)
query() {
calcurse -Q --filter-type cal --days 2 --output-datefmt %F "$@"
}
if [[ ${1:-} == list ]]; then
tomorrow=$(date -d tomorrow +%F)
body=$(query --format-apt '%S–%E %m\n' --format-recur-apt '%S–%E %m\n' \
--format-event 'all day %m\n' --format-recur-event 'all day %m\n' |
sed -e 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g' -e "s/^$today:$/Today:/; s/^$tomorrow:$/Tomorrow:/")
notify-send -a calcurse -i x-office-calendar "Calendar" "${body:-Nothing today or tomorrow}"
exit
fi
now=$(date +%s)
day="" next="" event=false
while read -r kind start; do
case $kind in
*:) day=${kind%:} ;;
A) [[ -z $next ]] && ((start > now)) && next=$start ;;
E) [[ $day == "$today" ]] && event=true ;;
esac
done < <(query --format-apt 'A %s\n' --format-recur-apt 'A %s\n' --format-event 'E\n' --format-recur-event 'E\n')
if [[ -n $next && $(date -d "@$next" +%F) == "$today" ]]; then
text="<fc=#ff79c6>$icon $(date -d "@$next" +%H:%M)</fc>"
elif $event; then
text="<fc=#8be9fd>$icon</fc>"
elif [[ -n $next ]]; then
text="<fc=#ff79c6>$icon</fc>"
else
exit 0
fi
echo "$text | "