Собственные уведомления (notify) в Gnome

    Речь пойдет об извещениях которые показываю практически все приложения от Rhythmbox до сетевых подключений. Хотелось иметь возможность показывать в таком виде собственные и поэтому я взял бубен и начал капать )



    для начала понадобится установить пакет libnotify-bin, я под ubuntu запустил команду

    sudo apt-get install libnotify-bin

    после этого небольшой тест. Проверяем в консоле

    notify-send test

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



    notify-send [OPTION...] [BODY] — create a notification

    -u, --urgency=LEVEL
    Вариантов здесь не так много, low, normal, critical. Разница лишь в полоске которая появляется с левой стороны.

    -t, --expire-time=TIME Specifies the timeout in milliseconds at which to expire the notification.
    Здесь все понятно, указываем время в миллисекундах которе извещение будет висеть на экране.

    -i, --icon=ICON[,ICON...] Specifies an icon filename or stock icon to display.
    С иконкой тоже все замечательно, Во первых можно прямо указать путь на любое изображение на диске. Другой вариант это открыть /usr/share/icons/hicolor/48x48/apps/ и выбрать там любую и указать ее название только без расширения notify-send -i pidgin test

    -c, --category=TYPE[,TYPE...] Specifies the notification category.
    по идеи задание категории должно было дать результат но я поверьте его так и не заметил, поэтому пойдем дальше

    -h, --hint=TYPE:NAME:VALUE Specifies basic extra data to pass. Valid types are int, double, string and byte.
    хинты дают возможность большу возможность по настройке, например местоположение на экране где должно появится извещение -h int:x:500 -h int:y:500

    теперь по тексту, принимаются 2 текста, первый идет в шапку, второй это тело с небольшими возможностями гипертекста



    notify-send «Шапка» "<b>жирный <i>италик <a href=«a.html»>ссылка</a>"

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

    #!/bin/sh

    export DISPLAY=:0.0
    PATH=/usr/bin/:/bin/
    notify-send --urgency normal --expire-time=10000 -i typing-monitor -h int:x:500 -h int:y:500 "Пора сделать перерыв" "Глазам нужен отдых"


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

    chmod a+x sh1.sh
    ./sh1.sh




    результат понравился? тогда дело за настройкой крона
    45 * * * * /home/rus/sh1.sh
    Ну вот
    за дополнительной информацией обращайтесь на http://www.galago-project.org/specs/notification/0.9/x211.html

    кроспостинг http://mymans.org/2008/12/26/500

    Дополнение от spiritedflow

    Насчет DISPLAY=:0.0. Жестковбитый DISPLAY — не хорошо. Он время от времени может меняться, даже, если всего один пользователь за компьютером. Кроме того, если ты закрыл сессию и ушел, крон будет все равно работать и ошибки будут сыпаться тебе в почту.

    Лучше определять его автоматом, например, с помощью вот такой вот функции:

    # get_display [USER] — Returns $DISPLAY of USER.
    # If first param is omitted, then $LOGNAME will be used.
    get_display () {
    who \
    | grep ${1:-$LOGNAME} \
    | perl -ne 'if ( m!\(\:(\d+)\)$! ) {print ":$1.0\n"; $ok = 1; last} END {exit !$ok}'
    }

    И в скрипте поправить вот так (в одной строчке нельзя, так как export сбивает $?):

    DISPLAY=$(get_display) || exit
    export DISPLAY
    Поделиться публикацией
    Похожие публикации
    Реклама помогает поддерживать и развивать наши сервисы

    Подробнее
    Реклама
    Комментарии 28
    • 0
      Отлично!
      Давно хотел прикрутить визуальное оповещение к своим скриптам, но незнал как.
      Спасибо! =)
      Плюсанул бы, еслиб мог…
      • +3
        Класс! Никогда не думал, что можно все так просто сделать… Ух..., ну просто спасибо!
        • 0
          Прикольная фича! Мерси…
          • 0
            Конечный вариант понравился. Взял на «вооружение». Спасибо за информативную статью.
            • +1
              открывается огромное поле для экспериментов, и притом так просто. вот за это и люблю линукс
              • 0
                О, спасибо! Теперь я могу прикрутить оповещения к программам, которые такого не поддерживают, но позволяют запускать какую-нибудь другую программу по событию. Ура!..
                • +1
                  А еще для всплывающих окон есть zenity, а для перерывов можно использовать встроенные средства Gnome:
                  • 0
                    Классная статья!
                    Использовал в своих проектах нотификации, но не так обширно, как рассказывает автор.
                    Спасибо!
                    • +1
                      спасиб полезно… прикручу к своим скриптам
                      • +10
                        Насчет DISPLAY=:0.0. Жестковбитый DISPLAY — не хорошо. Он время от времени может меняться, даже, если всего один пользователь за компьютером. Кроме того, если ты закрыл сессию и ушел, крон будет все равно работать и ошибки будут сыпаться тебе в почту.

                        Лучше определять его автоматом, например, с помощью вот такой вот функции:
                        # get_display [USER] -- Returns $DISPLAY of USER.
                        # If first param is omitted, then $LOGNAME will be used.
                        get_display () {
                            who \
                                | grep ${1:-$LOGNAME} \
                                | perl -ne 'if ( m!\(\:(\d+)\)$! ) {print ":$1.0\n"; $ok = 1; last} END {exit !$ok}'
                        }
                        


                        И в скрипте поправить вот так (в одной строчке нельзя, так как export сбивает $?):
                        DISPLAY=$(get_display) || exit
                        export DISPLAY
                        

                        • 0
                          А как дела обстоят с описанными здесь хинтами sound-file и suppress-sound?
                          Пробую использовать -h string:sound-file:/path/to/sound — никакого эффекта. А TYPE boolean, соответствующий supperss-sound вообще «Invalid hint type»
                          • 0
                            впрочем, тем же скриптом можно запускать какой-нибудь play, но всё равно непонятно.
                            • 0
                              у меня тоже не получилось это, так же как и запустить прилажение при клике на извещение, но подозреваы что проблема та же что и с монитором, надо экспортировать звуковую карту
                          • 0
                            Спасибо, заценил. Очень удобно. Буду использовать.
                            • 0
                              Если на Убунте, кликаете сюда чтобы поставить (использую как прокси — хабр ломает апт: линки… но программа с вашего репозитария скачивается), а иначе вот сайт: www.workrave.org/welcome/

                              Есть ещё апплет, прибавте к панели посли инсталляции.
                              • 0
                                Блин… начало забыл. «А можно поставить настоящую программу для перерывов :)»
                              • 0
                                Какая полезная фича… спасибо.
                                • 0
                                  А можно его как-то прикрутить к tail'у? Чтобы следить за изменениями файла
                                  • +2
                                    tail -n 0 -f /var/log/syslog | while read line ; do 
                                        notify-send --urgency normal --expire-time=2000  "New line in syslog:" "$line" ;
                                    done
                                    

                                  • 0
                                    А я сделал надстройку над другим скриптом и теперь информация о балансе на счету (Интернет) у меня каждый день есть, и не надо никуда идти. Большое спасибо автору! :]
                                    • 0
                                      А как-то можно изменить стиль отображения надписи, допустим фон или цвет текста? А то у меня такая вот проблема, что в теме Gtk цвет текста белый и на фоне бакграунда подсказки оно сливается [url=http://pic.co.ua/ru/view/730b8739cc805b8e78c2af9964303226/][img]http://pic.co.ua/thumbs/1231949779730b8739cc805b8e78c2af9964303226.png[/img][/url]
                                      • 0
                                        попробуйте облачить текст в тег font и далее как в html выставить там цвета
                                        • 0
                                          нет, не прокатило, пробывал так
                                          notify-send "Hello for Me" и notify-send "Hello for Me" и notify-send "Hello for Me". Думаю тут надо .gtkrc-2.0 копать
                                      • 0
                                        Супер!
                                        • 0
                                          true linux way
                                          • 0
                                            спасибо
                                            • 0
                                              Залогинился, чтобы добавить в избранное.
                                              Сердечно благодарю!
                                              • 0
                                                Отличная статья, но в современных системах экспорта DISPLAY уже недостаточно, чтобы показывать сообщения правильному пользователю. Необходимо находить и экспортировать также DBUS_SESSION_BUS_ADDRESS, как это описано в habrahabr.ru/post/126849/#comment_4183443, а именно:

                                                init_notify() {
                                                    user=`whoami`
                                                    pids=`pgrep -u $user nautilus`
                                                    for pid in $pids; do
                                                        # find DBUS session bus for this session
                                                        DBUS_SESSION_BUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/$pid/environ | sed -e 's/DBUS_SESSION_BUS_ADDRESS=//'`
                                                        # use it
                                                        export DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS
                                                    done
                                                }
                                                
                                                if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
                                                    init_notify
                                                fi
                                                


                                                user=`whoami` можно оставить, если мы запускаем скрипт для одного пользователя и из-под его учётной записи, если же нам нужно оповещать разных пользователей, то в статье уже описан способ работы через $LOGNAME.

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