130 lines
4.7 KiB
Markdown
130 lines
4.7 KiB
Markdown
---
|
||
title: "Calcurse Notifications"
|
||
description: "Configuring descriptive and attractive notifications for calcurse"
|
||
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.
|