Делаем функциональные уведомления на рабочем столе Linux: кнопки, иконки, ссылки

Делаем функциональные уведомления на рабочем столе Linux: кнопки, иконки, ссылки

Приветствую!

Сегодня покажу, как создавать кастомные функциональные уведомления на рабочем столе с помощью консольной утилиты notify-send. Такие уведомления поддерживают активные кнопки, умеют отображать иконки и кликабельные веб ссылки. В качестве примера настроим напоминалку с помощью скриптика на Bash и планировщика Cron для запуска уведомлений по расписанию. Будет интересно)

Присоединяйтесь к нашему каналу: t.me/r4ven_me и чату: t.me/r4ven_me_chat в Telegram .

Предварительные требования

Для реализации нашей задачи необходима утилита notify-send версии 0.8+, т.к. начиная с этой версии она поддерживает активные кнопки. Проверить версию можно такой командой:

notify-send --version
Версия nptify-send

Данная утилита является частью пакета libnotify-bin, который зависит от библиотеки уведомлений – libnotify4. Соответственно версия у этих пакетов также должна быть 0.8 или выше.

Проверить версию этих пакетов можно такой командой:

apt show libnotify4 libnotify-bin | grep Version

Команда apt show показывает подробную информацию о пакете.

Версия библиотек

Если версия пакетов libnotify-bin и libnotify4 в вашей системе меньше 0.8 (а в Linux Mint 21.3 и Ubuntu 22.04.03 как раз версия 0.7.9):

то их необходимо обновить вручную. Инструкция, как это сделать на примере Linux Mint под спойлером.

Примечательно, что в Linux Mint, основанной на Debian 12 (LMDE), версия libnotify4 в стандартных репозиториях находится версия 0.8.1.

Кликните, для просмотра инструкции по обновлению пакетов libnotify4 и libnotify-bin до версии 0.8.2 в Linux Mint 21.

В репозиториях промежуточного дистрибутива Ubuntu версии 23.10 есть совместимые пакеты нужной версии. Идём на страницу загрузки, скачиваем и устанавливаем.

Качаем пакет libnotify4: https://packages.ubuntu.com/ru/mantic/amd64/libnotify4/download

При попытке установки, система уведомит нас, что из репозиториев уже установлена более старая версия:

Установка libnotify4

Нажимаем закрыть и далее “Установить пакет”:

Установка libnotify4

Теперь качаем libnotify-bin на странице: https://packages.ubuntu.com/ru/mantic/amd64/libnotify-bin/download

Установка аналогичная:

Установка libnotify-bin

Если всё встало корректно, проверяем версию:

apt show libnotify4 libnotify-bin | grep Version

notify-send --version
Проверка версий пакетов

Отлично. Теперь можем приступать к настройке кастомных уведомлений.

Пример вывода сообщений с помощью команды notify-send

Синтаксис команды notify-send имеет следующий вид:

notify-send [параметры] <заголовок_уведомлений> [тело_сообщения]

Помните, что в квадратных скобках указаны необязательные параметры)

Пробуем отправить простое текстовое уведомление:

notify-send 'Тестовое сообщение' 'Hello R4ven'
Тестовое уведомление

С помощью параметра --action можно создать кнопку, одну или несколько, при нажатии которой процессу возвращается ответ в стандартный вывод stdout. Такой подход позволяет гибко обрабатывать действия на нажатие кнопок уведомлений в скриптах и командах. Пример реализации будет ниже.

Про стандартные потоки данных в Linux я рассказывал в отдельной статье: Командная строка Linux, вывод и чтение содержимого: команды echo, cat, less.

Давайте попробуем вывести уведомление с активной кнопкой:

notify-send 'Тестовое сообщение' 'Hello R4ven' --action 'pressed=Тык на кнопку'
Уведомление с активной кнопкой

В команде выше мы для параметра --action указали ключ pressed, который необходимо возвратить оболочке при нажатии на кнопку. Т.е. при нажатии на кнопку, в консоли будет выведено слово pressed. Если такой ключ не задать, то по умолчанию возвращается нулевой код завершения.

Теперь попробуем вывести уведомление с несколькими кнопками:

notify-send 'Тестовое сообщение' 'Hello R4ven' --action 'pressed=Тык на кнопку' --action 'pressed=Не нажимай на меня'
Уведомление с несколькими кнопками

Ключи для кнопок можно задавать произвольные.

Выведем уведомление с системными иконками, добавив параметр -i и название иконки:

notify-send  -i 'face-devilish' 'Тестовое сообщение' 'Hello R4ven' --action 'pressed=Тык на кнопку'

Где face-devilish – название иконки.

Уведомление с иконкой

Чтобы узнать названия иконок в системе, можно воспользоваться графической утилитой gtk3-icon-browser. Она идёт в составе пакета gtk-3-examples из стандартных репозиториев. Для его установки выполните:

sudo apt install gtk-3-examples

После установки выполните в консоли:

gtk3-icon-browser
Просмотр иконок в gtk3-icon-browser

Ну и пример уведомление с кликабельной веб ссылкой:

notify-send  -i 'face-devilish' 'Тестовое сообщение' 'https://r4ven.me - вороний блог' --action 'pressed=Тык на кнопку'
Уведомление с веб ссылкой

Теперь давайте настроим напоминалку в виде уведомления, в котором будет сообщение, что нужно отлипнуть от экрана монитора и выполнить гимнастику для глаз по видео на YouTube.

Пишем bash скрипт для удобства

Открываем новый файл на редактирование:

nvim ~/.local/bin/notify.sh

И наполняем его таким кодом:

#!/usr/bin/env bash

# задаём переменные
notify_title="Выполни гимнастику для глаз"
notify_messasges="Смотри видео 1 или 2"
notify_icon="face-devilish"
notify_button1="Видео на 1 мин."
notify_button2="Видео на 5 мин."
pressed_button="$(notify-send "$notify_title" "$notify_messasges" -i "$notify_icon" --action "video1=$notify_button1" --action "video2=$notify_button2")"

# составляем условное выражение для обработки нажатий на кнопки
if [[ "$pressed_button" == "video1" ]]; then
    firefox --new-window https://youtu.be/4ZHVYQX7tx0
elif [[ "$pressed_button" == "video2" ]]; then
    firefox --new-window https://youtu.be/SAU-Smg3tfg
fi
Скрипт на bash

Скрипт также доступен в репе на GitHub.

В данном скриптике мы сначала определяем переменные, содержимое которых мы будем выводить в уведомлении. Затем задаём отдельную переменную, которая, с помощью механизма подстановки будет содержать результат выполнения команды с notify-send. После чего, с помощью условных выражений обрабатываем полученный вывод. В данном примере – открывается новое окно firefox с выбранной, в зависимости от нажатой кнопки, ссылкой на видео с упражнениями для глаз. Видео я взял из тырнета.

Если вы настраивали Neovim по моим инструкциям, то помните, что при нажатии F5 происходит сохранение файла и, если он является скриптом, то его выполнение во всплывающем окне редактора:

Проверка работы скрипта

Для выхода либо нажмите на уведомление, либо Ctrl+c в окне редактора. Как видно, скрипт исполняется)

Если Neovim вы не настраивали, то просто сохраняем файл и выходим. Затем делаем наш скрипт исполняемым такой командой:

chmod +x ~/.local/bin/notify.sh

chmod – это команда управления правами на файлы в Linux, а +x это параметр добавления флага исполнения для указанного файла. В скором будущем будет отдельный пост по командной строке Linux, как раз поговорим про права.

Проверим результат команды выше:

ls -l ~/.local/bin/notify.sh
Просмотр инфо о скрипте

Отлично. Теперь, чтобы выполнить скрипт, просто указываем путь до него в терминале. При наличии флага исполнения (x), командная оболочка сама поймёт, чтобы вы запускаете исполняемый файл. Вводим в терминале:

~/.local/bin/notify.sh
Запуск скрипта

Все работает. Теперь давайте создадим задание, которое будет запускать данный скрипт каждые 3 часа.

Добавляем задание в планировщик Cron

В системах на базе Linux из коробки поставляется стандартный планировщик заданий – Cron. Он довольно прост в использовании, стоит только разобраться в синтаксисе расписаний выполнения.

Чтобы задать расписание в Cron для текущего пользователя вводим в терминале такую команду:

crontab -e

Если вы выполняете эту команду впервые, вам предложат выбрать консольный текстовый редактор, для редактирования заданий cron. Разумеется мы выбираем Neovim)

В моём случае выбираю 2-й пункт и нажимаю Enter:

Выбор редактора

По умолчанию, файл crontab уже хорошо прокомментирован: объясняется синтаксис и приведен пример задачи.

Окно планировщика cron

Первые 5 параметров, разделенные пробелом, являются значениями расписания:

  • 1 – минуты;
  • 2 – часы;
  • 3 – день месяца;
  • 4 – месяц;
  • 5 – день недели.

Значения по умолчанию – это символы * * * * *, которые обозначают “каждый раз”, т.е. каждую минуту, каждый час ну и т.д.

Более подробное описание + возможность протестировать синтаксис можно на полезном ресурсе: https://crontab.guru (EN).

После открытия crontab, добавляем в конец файла такую строку:

*/2 * * * * DISPLAY=":0.0" XDG_RUNTIME_DIR="/run/user/$(id -u)" ~/.local/bin/notify.sh

Состав строки:

  • */2 – раз в 2 минуты (установим для проверки);
  • * – каждый час;
  • * – каждый день;
  • * – каждый месяц;
  • * – каждого дня недели;
  • DISPLAY=":0.0" – переменная окружения, задающая номер дисплея графического сеанса;
  • XDG_RUNTIME_DIR="/run/user/$(id -u)" – переменная окружения, определяющая директорию исполнения;
  • ~/.local/bin/notify.sh – путь до скрипта, тут может быть любая другая команда.

Переменные DISPLAY и XDG_RUNTIME_DIR необходимы, чтобы cron понимал, в какой среде необходимо выводить уведомления. Если их не указать, то скрипт будет выполниться, но в фоновом режиме и уведомлений мы не увидим.

Сохраняем и закрываем редактор.

Теперь, каждые 2 минуты на рабочем столе должно появляться наше настроенное уведомление:

Проверка cron

Чтобы посмотреть список установленных задач в crontab выполните команду:

crontab -l
Вывод задач планировщика

После того как убедимся, что запланированное задание работает, отредактируем время его появления – установим на каждые 3 часа. Для этого скорректируйте строку задачи (в 0 минут каждого 3-го часа):

0 */3 * * * DISPLAY=":0.0" XDG_RUNTIME_DIR="/run/user/$(id -u)" ~/.local/bin/notify.sh

Заключение

Вот мы с вами немного узнали про уведомления на рабочем столе Linux: научились отправлять их в ручную из терминала с помощью команды notify-send, написали небольшой Bash скрипт для удобства и добавили его запуск в системный планировщик заданий – Cron.

В будущем обязательно сделаю отдельную статью про детальную настройку планировщика Cron и его возможности. А пока, спасибо, что читаете) Подписывайтесь на наш телеграм канал @r4ven_me и добавляйтесь в чат @r4ven_me_chat, если у вас появились вопросы или просто желание обсудить интересные темы из мира IT.

Успехов!

Полезные источники

Подписаться
Уведомить о
0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии