Как работает KNotify

Эта статья посвящена использованию KNotify, среды для отправки уведомлений в KDE. Мы рассмотрим базовое использование KNotify для изменения типов получаемых вами событий. Затем мы рассмотрим более сложную технику, с использованием DCOP, которая может быть полезна при написании скриптов.

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

Использование KNotify

Отдельные приложения позволяют настраивать свои уведомления через пункт меню "Settings" ("Настройка"). Уведомления от всех приложений можно настроить через центр управления KDE, в разделе "Notifications".

Уведомления KMail

В первую очередь вы можете использовать эти настройки, чтобы отключить раздражающие окна с сообщениями. Довольно много событый не являются такими уж важными (для вас, конечно) и, возможно, вы захотите, чтобы всплывающие окна были "пассивными", т.е. не прерывали вашей работы - соответствующие настройки вы можете увидеть, нажав "Advanced" ("Дополнительно"). Как видите, имеется несколько встроенных способов получения уведомления: можно проиграть звук, показать окно с сообщением (можно пассивное), внести запись в файл, или пометить кнопку панели задач - для каждого события можно задать любую комбинацию.

Но это только начало, вы можете выполнить любую команду через уведомление KNotify. Возможности здесь безграничны, особенно, если воспользоваться системой DCOP в KDE. Чтобы вопользоваться всем этим, вам нужно будет написать простые скрипты, или модифицировать скрипты других разработчиков, все зависит от того, что вы хотите.

Варианты использования зависят от того, какие уведомления и DCOP интерфейсы доступны. У KMail есть уведомление о приходе новой почты, вы можете использовать его, чтобы сделать что-нибудь полезное, когда приходит почта, - пример этого будет в конце статьи. Если бы DCOP интерфейс у KMail был посложнее и позволял, к примеру, делать запросы к содержимому писем, можно было бы совершить какое-то действие в зависимости от того, кто прислал письмо. Вот что стоит добавить разработчикам в KMail в будущем!

Пишем KNotify скрипты с использованием DCOP

Другой вариант использования KNotify - быстро показать пользователю информацию из скрипта. Это можно сделать с помощью команды "kdialog", но у варианта с использованием KNotify есть несколько преимуществ:

  • Скорость - по моему опыту, запуск kdialog занимает заметное время. А так как KNotify работает постоянно, время затрачивается только на передачу DCOP команды, что происходит почти мгновенно.
  • Действия - все действия KNotify доступны для вас, не только визуальные, но и проигрывание звука, запись в файл и т.д., и их все можно задействовать одновременно.

(С другой стороны, есть множество вещей, которые можно сделать с помощью kdialog, и невозможно с помощью метода, изложенного ниже.)

Чтобы увидеть, какие команды можно использовать, запустим dcop из командной строки:

$ dcop knotify
qt
KDebug
MainApplication-Interface
Notify (default)
knotify

Похоже, нам нужен интерфейс "default". Посмотрим, какие функции он предлагает:

$ dcop knotify default
QCStringList interfaces()
QCStringList functions()
void notify(QString event,QString fromApp,QString text,QString sound,QString file,int present,int level)
void notify(QString event,QString fromApp,QString text,QString sound,QString file,int present,int level,int winId)
void notify(QString event,QString fromApp,QString text,QString sound,QString file,int present,int level,int winId,int eventId)
void reconfigure()
void setVolume(int volume)

Первая функция "notify" - то что нам нужно, т.к. мы не будем устанавливать параметры "winId" и "eventId".

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

  • QString event: текстовое описание события - вы можете задать любое значение, какое вам больше нравится

  • QString fromApp: приложение, которое генерирует событие - вы можете задать любое значение, какое вам больше нравится

  • String text: сообщение, которое будет показано пользователю

  • QString sound: файл со звуком, который будет проигран

  • QString file: файл журнала, в который будет записано сообщение

  • int present: целое число, которое говорит KNotify какой вид уведомления использовать:

    1 - проиграть звук
    2 - показать окно с сообщением
    4 - записать в файл журнала
    8 - вывести сообщение на стандартный поток ошибок
    16 - показать "пассивное" окно с сообщением

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

  • int level: я не разобрался, что значит этот параметр - значение 0 вполне работает.

Теперь поместим все это вместе в вызов DCOP. Если вам не нужны звуки или текстовое сообщение, поместите '' на место пустого аргумента.

Напишите в командной строке:

$ dcop knotify default notify eventname appname 'Hello world!' '' '' 2 0

Если вы получили окно с сообщением "Hello world!", значит это работает!

Собираем все вместе

Разнообразие приложений, которые можно написать, зависит только от ваших нужд и того, что вы можете выдумать. Вот небольшой пример использования KNotify обоими способами, описанными выше. Мы напишем простой скрипт, который будет использовать DCOP чтобы найти число непрочитанных входящих сообщений в KMail. Мы будем использовать "dcop knotify..." чтобы показать сообщение. Затем мы настроим KMail уведомление о приходе новой почты, чтобы оно выполняло наш скрипт. В результате мы заменим стандартное сообщение KMail на более информативное.

Сначала мы должны добраться до папки, в которой находятся входящие письма:

$ dcop kmail default
...
QStringList folderList()
DCOPRef getFolder(QString vpath)
...

Эти функции выглядят подходящими. Попробуем:

$ dcop kmail default folderList
/drafts
/inbox
/outbox
/sent-mail
/trash
...
$ dcop kmail default getFolder /inbox
DCOPRef(kmail,FolderIface)

Функция возвращает DCOPRef, ссылку на объект DCOP. Чтобы использовать результат в командной строке, мы воспользуемся "подстановкой команды", конструкцией $(...). Эта конструкция просто заменяет $(command) выводом command. С помощью следующей команды мы получим список функций данного DCOP объекта:

$ dcop $(dcop kmail default getFolder /inbox)
QCStringList interfaces()
QCStringList functions()
QString path()
bool usesCustomIcons()
QString normalIconPath()
QString unreadIconPath()
int messages()
int unreadMessages()
int unreadRecursiveMessages()
$ dcop $(dcop kmail default getFolder /inbox) unreadMessages
3

Как видите, у нас 3 непрочитанных сообщения! Теперь нам нужно воспользоваться "dcop knotify ...", как было продемонстрировано выше, и еще одной подстановкой:

$ dcop knotify default notify newmail newmailscript "New mail: $(dcop $(dcop kmail default getFolder /inbox) unreadMessages) unread message(s)" '' '' 2 0

И еще два шага в качестве домашнего задания:

  • поместить это в скрипт
  • настроить уведомление о приходе новой почты, чтобы оно запускало ваш скрипт

Все!

Ссылки

Статьи на эту же тему:

Luke Plant,
Last modified: Mon Feb 19 19:37:47 GMT 2007.
Перевод:
Денис Нелюбин aka Gelin
декабрь 2007