Пользователь
0,0
рейтинг
26 декабря 2008 в 22:18

Администрирование → Собственные уведомления (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
brain2xml @brain2xml
карма
36,0
рейтинг 0,0

Похожие публикации

Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Спецпроект

Самое читаемое Администрирование

Комментарии (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.

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