secluded/content/posts/calcurse-notifications.md

131 lines
4.8 KiB
Markdown

---
title: "Calcurse Notifications"
description: "Configuring descriptive and attractive notifications for calcurse"
author: Amolith
cover: /assets/pngs/calendar.png
date: 2020-05-13T22:23:25-04:00
categories:
- Technology
tags:
- Calcurse
- CLI
- Notifications
- 100 Days To Offload
---
I recently started using [calcurse](https://github.com/lfos/calcurse)
for my calendar and one of its limitations is good notification support
in the generally accepted meaning of the word. The developer has [a
different
opinion](https://github.com/lfos/calcurse/issues/285#issuecomment-620841221)
and that's perfectly alright but traditional notifications are a feature
I heavily rely on and calcurse doesn't handle handle them very well; it
leaves the user to figure something out on their own. Inspired by [one
individual's
issue,](https://github.com/lfos/calcurse/issues/286#issue-608118188) I
did just that.
A quick glance at `man calcurse` reveals this section:
``` text
-n, --next
Print the first appointment within the next 24 hours. The
printed time is the number of hours and minutes left before
this appointment.
```
The output of running `calcurse -n`, for me and at the moment, looks
like this:
``` text
$ calcurse -n
next appointment:
[17:25] DnD on Mumble
```
It's all well and good but not really something you'd want in a
notification; it needs to be filtered down so it only shows the name of
the event, `DnD on Mumble`. To do this, I turned to the man pages of
standard CLI utilities `tail` and `cut`. `tail` allows us to filter the
output to only the last line[^1] with `tail -1`. `cut` is a little more
complicated but will allow us to remove the first few columns of text.
`cut -d ' ' -f 5-` is the next snippet in this one-liner. `-d ' '` tells
cut to use a single space as the delimiter, `-f` specifies the fields to
keep, and `-5` says to use all fields starting with the 5th because
there are a few spaces preceding the content we want. Chain all of this
mess together with pipes and we get:
``` bash
calcurse -n | tail -1 | cut -d ' ' -f 5-
```
Great. Now we need to actually get a notification containing the
resulting string. This can be achieved by storing it in a variable then
using it with `notify-send`. You likely already have `notify-send`
installed if you're using Linux but, if you don't, I would recommend
looking around to see what's default and using that instead.
``` bash
CONT="$(calcurse -n | tail -1 | cut -d ' ' -f 5- -)" && notify-send "Calcurse Event" "$CONT"
```
Now we're actually getting somewhere. With my setup, the notification
looks like this: ![It's a screenshot of my desktop with a notification
in the top right corner. The title is "Calcurse Event" and the text
below is "DnD on Mumble". Surrounding the text is a solid border. Its
position and the border are all that designate it as a notification: the
background and text colour match the rest of my desktop which is themed
with the base16-unikitty-dark scheme](/assets/jpgs/notification.jpg)
It's certainly passable and sufficient for some but I'd like an icon so
I can see what the notification is for out of the corner of my eye and
decide whether or not to glance over. Thankfully, `notify-send` has this
built in with the `-i` flag.
``` text
-i, --icon=ICON[,ICON...]
Specifies an icon filename or stock icon to display.
```
Now it's just a matter of figuring out what icon to use. You can
certainly pass the path of whatever image you want to it, such as
`~/Pictures/calendar-icon.png`, but I want something that fits in with
the rest of my icons. These are found in:
``` bash
/usr/share/icons/<theme>/it/depends/on/theme
```
I use [Suru++ Dark](https://github.com/gusbemacbe/suru-plus-dark) and
the icon I'm using can be found at:
``` bash
/usr/share/icons/Suru++-Dark/apps/32@2x/calendar.svg
```
It's different for Adwaita and all the rest though; you'll have to do
some digging. It's also worth noting that, if you don't have this theme
installed on another device, the icon won't show up.
After all that, here's my notification command and a screenshot.
``` bash
CONT="$(calcurse -n | tail -1 | cut -d ' ' -f 5-)" && notify-send -i /usr/share/icons/Suru++-Dark/apps/32@2x/calendar.svg "Calcurse Event" "$CONT"
```
![This is a screenshot like the last one but with an attractive icon to
the left of the text](/assets/jpgs/notification-icon.jpg)
---
This was posted as part of
[#100DaysToOffload,](https://100daystooffload.com/) an [awesome
idea](https://fosstodon.org/@kev/104053977554016690) from [Kev
Quirk.](https://kevq.uk/) If you want to participate, just write
something every day for 100 days and post a link on social media with
the hashtag!
[^1]: The opposite of `tail` is `head` and allows for exactly the same
thing in reverse: `head -1` will return the first line of whatever
input it's given.