О статье

В операционной системе, как и в жизни, обширны способы передачи информации: иногда можно деликатно сказать что-то в стиле «не будет ли любезен многоуважаемый джинн», или сделать жест рукой, чтобы твой собеседник понял без лишних слов, или в некоторых ситуациях достаточно лишь встретиться глазами, чтобы понять, как у тебя дела. Так и в арсенале ОС имеются сообщения из системного трея, обычные десктоп-уведомления из центра уведомлений, лампочки-индикаторы на клавиатуре, собственные уведомления у приложений и проч.

В этом материале мы расскажем о системе десктоп-уведомлений, которая используется в большинстве Linux-дистрибутивов и является самой базовой системой информирования пользователя. Статья прежде всего предназначена для разработчиков десктоп-приложений, которые хотят организовать взаимодействие с пользователем, использовав базовый функционал ОС. Впрочем, и обычным юзерам данный текст, как минимум, не помешает и даже поможет сформировать корректные представления о том, как и зачем их уведомляет операционная система.

Что такое desktop-уведомления?

Десктоп-уведомления – сообщения пользователю, отображаемые на рабочем столе. Вроде, всё просто, да..?

Для взаимодействия с пользователем существует много других механизмов в разных ОС, но десктоп-уведомления – базис для быстрого информирования пользователя с последующим хранением содержимого этого уведомления, чтобы можно было не отвлекать пользователя, когда он занят или отошёл от компьютера. В таких уведомлениях не должно быть паролей или другой защищённой информации, так как некоторые реализации уведомлений в Linux могут надолго сохранять содержимое уведомления в файл в файловой системе пользователя, чем легко может воспользоваться злоумышленник. Чтобы обеспечить безопасную работу с десктоп-уведомлениями, защищённую информацию предпочтительнее хранить в самом приложении, которое будет отправлять лишь короткое сообщение о каком-либо событии с возможностью перехода на это приложение. Будет лучше, если всю информацию, в том числе и защищённую, пользователь увидит в самом приложении.

Обычно в операционной системе есть специальная служба, отвечающая за получение и отображение уведомлений, далее будем называть её сервером уведомлений. Приложения отправляют сообщения серверу уведомлений, ориентируясь на то, что сервер уведомлений покажет эти сообщения пользователям. Сообщения могут приходить как напрямую от приложений, так и через посредников, например, через другие системные службы. Иногда сервер уведомлений называют центром уведомлений, поскольку все уведомления хранятся в одном месте, и сервер уведомлений позволяет не хранить приложениям контент отправленного уведомления.

В Linux есть разные готовые решения для взаимодействия с сервером уведомлений. Вообще-то, их очень много. Для решения задач, само собой, достаточно одного или двух, и в этой статье мы не будем пытаться описать все варианты, а лишь в первом приближении познакомим читателя с тем, как происходит взаимодействие и какие инструменты можно использовать.

Сервер уведомлений позволяет централизованно регистрировать уведомления на своём API, сохраняя отправленное уведомление и направляя его идентификатор приложению, чтобы в последующем приложение могло быстро «понимать», с каким уведомлением будет взаимодействовать пользователь, когда сервер уведомлений будет отправлять сигналы о взаимодействиях пользователя с этим уведомлением. Пользователь может закрыть его или кликнуть на уведомление, вызвав действие по умолчанию, или нажать на действие в виде кнопки на уведомлении. Также приложение само может послать сигнал серверу уведомлений о закрытии уведомления, передав идентификатор уведомления, которое необходимо закрыть.

Для всех десктоп-уведомлений в дистрибутивах Linux существует базовая спецификация Desktop Notifications Specification. У любой версии Linux, ориентированной на десктоп, есть подсистема, основанная на данной спецификации.

Приложения, написанные на разных языках программирования, работают согласно описанным в спецификации функциям. Некоторые варианты API могут включать и свои собственные функции, дополняя спецификацию. Но во всём этом разнообразии API всегда есть основа — спецификация, которую нужно понимать, чтобы сделать качественную подсистему уведомления пользователя для разрабатываемого приложения.

Визуально сервер уведомлений не должен быть сложным, чтобы с ним мог взаимодействовать любой пользователь, в том числе не очень продвинутый. Реализуя сервер уведомлений, необходимо учесть, как программа будет взаимодействовать с пользователем, и предоставить простой и лёгкий API для приложений. Надо помнить, что сама спецификация не содержит множества технических механизмов уведомлений, поэтому реализовывать всякие интересные фичи придётся на стороне сервера уведомлений. Но в то же время спецификация позволяет расширять серверную часть — так, если приложение было рассчитано на специфичную возможность, то сервер и конкретное приложения вполне могут корректно работать вместе, даже если другие приложения не поддерживают эту специфичную возможность.

Что есть интересного в Desktop Notifications Specification?

Body HTML

Возможность отображения примитивного HTML-контента: сделать шрифт жирным, курсивом, подчёркнутым, вставить в уведомления гиперссылки или локальные изображения. Заметим, что полная поддержка HTML-контента, как и с современными браузерами, не рекомендуется по спецификации.

Actions

Действия: в уведомлениях могут присутствовать кнопки, при нажатии на которые приложение получит сигнал о том, какая именно кнопка была нажата. Когда пользователь нажимает на уведомление, то вызывается действие по умолчанию, если оно было передано с уведомлением.

Sound

Воспроизведение звука при получении уведомлений. Некоторые клиенты при отправке уведомления сами воспроизводят звук, если были на это настроены. Но в Linux есть возможность передать, какой звук должен быть воспроизведён на стороне сервера уведомлений, и не воспроизводить на стороне приложения.

Capabilities

В первую очередь нужно понять, что может сервер уведомлений. Узнать все возможности можно запросом «GetCapabilities». Если сервер уведомлений не способен, например, отображать HTML, то отправлять сообщение с HTML-содержимым не нужно, а стоит отправлять простой (plain) текст.

Как это использовать для моих приложений?

Этот раздел написан как раз для разработчиков. Здесь можно найти библиотеки и утилиты, которые помогут с выбором основы для взаимодействия с сервером уведомлений. Все приведённые ниже API могут работать на любых серверах уведомлений в разных дистрибутивах Linux, которые поддерживают данную спецификацию. Также стоит отметить, что все приведённые библиотеки и утилиты есть в ОС Astra Linux, их можно использовать в базовой системе, а если они не были установлены в системе изначально, то можно установить из наших репозиториев.

Проект

Тип

Описание

Debian пакет

Достоинства

Недостатки

libnotify

Библиотека

Библиотека на языке C. Простая и доступная, основа из основ. Используется повсеместно в других решениях, является базовой для обёрток в других языках.

libnotify4

- Простое API на языке С.

- Низкоуровневый язык API — возможно, для кого-то это будет существенным недостатком.

KNotifications

Библиотека

Библиотека из графической оболочки KDE Plasma. Реализует много интересных возможностей помимо стандартной спецификации. Есть свои тонкости в работе при использовании в других графических оболочках.

libkf5notifications5

- Расширенный функционал работы с уведомлениями.
- Удобный API, на основе фреймворка Qt.

- Для полноценной настройки и пользования нужен KDE Plasma.

notify-send

Утилита

Утилита использует библиотеку libnotify. Простая утилита, которую можно запускать с разными аргументами. Хорошо использовать для быстрой отправки уведомлений из командной консоли.

libnotify-bin

- Простота: можно запускать обычную программу с аргументами на любом языке, который может запускать процессы.

- Нельзя отслеживать, что происходит с уведомлением после отправки.
- Не поддерживает работу с действиями.

dbus-send и dbus-monitor

Утилита

Утилиты для отправки и отслеживания сигналов по DBus. Утилита «dbus-monitor» — очень хороший инструмент для отладки уведомлений, но может быть не очень удобным для восприятия информации. Утилиты можно использовать для работы не только уведомлений, но и для других служб, которые работают по DBus.

dbus

- Прямое взаимодействие с сервером уведомлений без проблем в оболочках-посредниках.
- dbus-monitor - удобный инструмент для отладки трафика уведомлений через DBus. Можно с помощью него просматривать, что отправляют разные приложения в сервер уведомлений.

- Работа напрямую с сервером уведомлений, например, сигналы о закрытии уведомлений будут действовать как для ваших уведомлений, так и для всех остальных.
- Нельзя передавать сложные структуры, например, такие как hints, когда отправляете уведомление.
- Сложная одновременная работа утилит, когда нужно отправлять уведомления и получать разные сигналы от сервера уведомлений.

qDbus

Утилита

Утилита для взаимодействия по DBus, написанная на Qt, основана на базе класса QDBusConnection.

qdbus или qdbus-qt5

- Прямое взаимодействие с сервером уведомлений без проблем в оболочках-посредниках.

- Работа напрямую с сервером уведомлений, например, сигналы о закрытии уведомлений будут как для ваших уведомлений, так и для всех остальных.

Python модуль gi и библиотека libnotify

Python модуль

Возможность использовать библиотеку libnotify в Python как GObject. Можно написать какой-нибудь тест, для того чтобы посмотреть, как взаимодействует сервер уведомления с приложениями.

libnotify4 и python-gobject

- Использование библиотеки Python для уведомлений.

Нет.

Заключение

Напомним, что есть множество других способов взаимодействовать с сервером уведомлений, но в данном материале были рассмотрены самые базовые, которые могут понадобиться для разработки приложений. Применение каждого API имеет варианты: вы можете выбрать библиотеку libnotify как основу взаимодействия с сервером уведомлений для своего приложения, а отладку производить с помощью «dbus-monitor», и для тестирования сервера уведомления использовать python c модулем gi и библиотекой libnotify. Выбор за вами.

Если вы хотите освещения каких-то других тем, пожалуйста, напишите об этом в комментариях. Мы могли бы рассказать о спецификации более подробно, а точнее: как реализовывать взаимодействия с сервером уведомлений, что нужно делать на стороне приложения. Также мы хотели бы рассказать о библиотеке KNotifications, так как в KDE Plasma разработчики пересмотрели и расширили работу с десктоп-уведомлениями для своей графической оболочки, отказавшись от некоторых возможностей в спецификации. А может, кому-нибудь захочется обзорную статью о том, как с точки зрения пользовательского интерфейса операционная система может взаимодействовать с пользователем для уведомления его о событиях в системе или конкретных приложениях — написать об этом тоже вполне реально.

Комментарии (13)


  1. Writer
    11.01.2023 00:43

    Можно ещё вспомнить про Zenity и Qarma.


  1. alexsibtone
    11.01.2023 08:24
    -1

    Добрый день. В догонку к notify-send и Zenity — астровитянский: fly-dialog.


    1. Setig
      11.01.2023 11:13

      И правда, в fly-dialog есть опция "--passivepopup", с помощью которой можно отправлять desktop-уведомления.


  1. mSnus
    11.01.2023 09:58
    +3

    Если сервер уведомлений не способен, например, отображать HTML, то отправлять сообщение с HTML-содержимым не нужно, а стоит отправлять простой (plain) текст.

    Уже которая по счету статья на Хабре, которую писал ChatGPT, набирает кучу плюсов. Тенденция, однако!


  1. noonv
    11.01.2023 11:56

    А есть какое-нибудь кроссплатформенное (Linux и Windows) решение для уведомлений?


    1. shlyakpavel
      11.01.2023 18:04

      В Qt из коробки :)


  1. Urub
    11.01.2023 12:48

    странно, что не упомянут устаревший qtnotifydaemon, который вовсю используется в астре и никак не отключается


    1. Setig
      11.01.2023 13:21

      qtnotifydaemon - это сервер уведомлений в Astra Linux, статья была направлена на API, которое можно использовать для взаимодействия с сервером уведомлений. Сейчас ведутся разработки современного аналога, под названием fly-notifications. fly-notifications доступен в Astra Linux 1.7 и Astra Linux 2.12. Вы можете его попробовать, установив из репозитория, при этом заменится qtnotifydaemon, который вы можете вернуть обратно.


      1. Urub
        11.01.2023 13:53

        fly-notifications может настраиваться чтобы не отображать уведомления вообще ?

        раз уж астру упоминаем, то отмечу, что она очень плохо настраиваться в консоли - нет аналога gsettings, некоторые настройки невозможно сделать (отключить taskbar например) скриптами


        1. Setig
          11.01.2023 15:55
          +1

          На данный момент в fly-notifications можно включить режим "Не беспокоить", тогда вас не будут доставать уведомлениями, когда вам это не нужно.

          Desktop-уведомления работают в графической среде и настраивать службу из консоли, которая должна работать в графической среде - спорный момент. В fly-notifications есть графический диалог настройки, где можно настроить, то как себя будут вести уведомления.

          GSettings можно найти в Astra Linux 1.7 и Astra Linux 2.12. В Astra Linux есть несколько базовых служб, работающих на базе GSettings, но основной подход в настройке системы лежит на KCM модулях, из KDE Plasma. Даже с KCM модулями нельзя настроить через консоль, так что есть единственный способ - искать необходимый файл конфига и его редактировать. Как бы возможность есть, но она не такая "гладкая", как в GSettings...

          Для отключения taskbar в графической сессии Fly можно, использовав команду:

          fly-wmfunc FLYWM_DISABLE_TASKBAR

          Так же есть другие команды для taskbar:

          fly-wmfunc FLYWM_TOGGLE_TASKBAR
          fly-wmfunc FLYWM_ENABLE_TASKBAR

          Список всех команд можно получить, выполнив:

          fly-wmfunc FLYWM_FUNC_LIST

          После выполнения, будет создан текстовый файл по пути "~/fly-wmfunc.txt", в котором будут все команды для fly-wmfunc.


          1. Urub
            11.01.2023 16:24

            настраивать службу из консоли, которая должна работать в графической среде - спорный момент

            если это надо сделать настройку gui из скриптов (при установке например), то очень даже удобно

            за fly-wmfunc - спасибо !


  1. t3n3t
    11.01.2023 14:16

    Еще есть dunst, который явно несправедливо обошли стороной. В наличии кастомизация, история уведомлений, поддержка вяленого, отсутвие зависимости от конкретного DE.


  1. vtb_k
    12.01.2023 11:56

    Для Swaywm использую Mako, очень доволен