Апгрейд notify-send
Есть у меня одна развлекуха – люблю я всяческие мудрости, афоризмы, цитаты etc. Нравится мне мудрость, ужатая в короткую фразу (это, в частности, можно заметить и по предыдущему посту). И недавно наткнулся я на ресурс с афоризмами – Forismatic.com на котором этих цитат видимо-невидимо. Но вся прелесть в том, что у этого сервиса есть API, позволяющее тянуть афоризмы с их сервиса в нескольких удобных форматах. И захотелось мне раз в 10 минут наблюдать эти афоризмы на своем десктопе
Решение, конечно же, очевидно – notify-send. Но. Оказалось, что “ванильная” сборка обладает рядом болезней: например нет никакой возможности повлиять на размер сообщения (и из-за этого длинные цитаты показывались обрезанными) и совершенно игнорирует свой параметр -t, из-за чего месседжи висят по 10 секунд и успевают надоесть :)
Несколько минут гугления помогли решить проблему. Итак:
Всё нижеописанное делалось на ubuntu 10.04, но, я думаю, не будет никаких проблем повторить все это для любого дистрибутива.
Для начала добавляем репозиторий с патченной notify-osd и заменяем ей родную
sudo add-apt-repository ppa:leolik/leolik
В этой версии вылечены болезни, о которых я писал выше. Параметр -t заработал, а управлять видом сообщения стало можно через конфиг.
Обновляем список пакетов и заменяем notify-osd
sudo aptitude update && sudo aptitude install notify-osd
Создаем в домашней директории файлик .notify-osd с примерно следующим содержанием:
slot-allocation = fixed bubble-expire-timeout = 10sec bubble-vertical-gap = 5px bubble-horizontal-gap = 5px bubble-corner-radius = 37,5% bubble-icon-size = 30px bubble-gauge-size = 6px bubble-width = 400px bubble-background-color = 222222 bubble-background-opacity = 90% text-margin-size = 10px text-title-size = 100% text-title-weight = bold text-title-color = ffffff text-title-opacity = 100% text-body-size = 90% text-body-weight = normal text-body-color = eaeaea text-body-opacity = 100% text-shadow-opacity = 100%
Полное описание параметров вы можете найти по ссылке в конце поста. Нас интересует параметр bubble-width, увеличив который, я смог таки впихнуть в сообщение большинство цитат :)
Затем осталось добавить все это в cron и наслаждаться жизнью :)
Добавляем в cron команду
*/10 * * * * env DISPLAY=:0 /usr/bin/notify-send -t 5000 -i /home/boombick/.config/webdev-info-icon.png -u normal "`/usr/bin/wget -qO - 'http://api.forismatic.com/api/1.0/?method=getQuote&key=${RANDOM}&format=text&lang=ru'`"
Время показа сообщения указывается в миллисекундах. В моем примере таймаут равен 5 секундам. Параметр -i добавляет иконку к сообщению. Вот иконка, которую использовал я:
![]()
Вы можете выбрать ту, которая вам больше понравится. В API Foristmatic используется странный параметр key, который каким-то образом влияет на показ цитаты. Никакой закономерности я не нашел и просто впихнул туда RANDOM =)
И вот что получилось:

Это самый примитивный способ, простор для фантазии есть :) Можно считать длину текста, править конфиг на лету, показывать сообщение и возвращать все на место. Потому как очень длинные афоризмы все-таки обрезаются. Можно вставить рандомное переключение языка ru|en, чтобы смотреть цитаты еще и на английском. Можно еще что-нибудь придумать и я обязательно этим займусь :) А если вы придумаете что-нибудь интересное – присылайте, патчи с удовольствием принимаются :)
Ссылки по теме:
Описание конфигурации notify-osd http://leolik.blogspot.com/2009/12/notify-osd.html
Дополнительный тюнинг notify-send http://leolik.blogspot.com/2010/07/notify-osd.html
Описание API Forismatic http://ru.forismatic.com/api/
Зря вы указываете key=${RANDOM}, во-первых, RANDOM функция возвращающая числа в диапазоне 0 – 32767, и поэтому для задания псевдослучайного числа из шести цифр, надо делать, например, так: key=$((RANDOM%999))$((RANDOM%999))
а во-вторых, как сказано в API, без указания “key”, ключ генерируется случайно.
`xhost +` это великолепно! Теперь посоветуйте убрать “-nolisten tcp” из /etc/X11/xinit/xserverrc и пятиминутку дурных советов можно считать завершённой.
Необязательно 6 символов. Там написано – максимальная длина – 6 цифр :)
2Konstantin Khomoutov
Это просто примочка для десктопа, не более того. Очень хорошо, что вы понимаете нюансы безопасности системы, буду благодарен вам за правильное решение.
А можно ли через этот патченный notify-send задать чтобы сообщение не складывалось в архив а удалялось после тайм-аута?
У меня играет музыка через mpd и я настроил чтобы по notify-send выводилось название новой песни на экран, но получается что под конец дня эта куча сообщений остаётся висеть в трее, пока их вручную не подчистишь.
Также туда же повесил уведомления на команды изменения громкости через ИК-пульт, которые тоже мусора добавляют…
Пока решил эту проблему перейдя на okindd для отображения уведомлений, но каждый раз компилить его после апгрейда как-то лениво, да и автор похоже подзабил на доработки… Поэтому хочется юзать базовый KDE-функционал, а не сторонние разработки.
Вместо xhost я использую sudo -u username и тогда безо всяких доп. доступов из крона скрипт нормально выводит уведомление на экран юзера.
Если юзеров несколько и несколько сессий одновременно (например на 7 экране моя, на 8 – жены), то я тоже накнопил решение уже, которое выводит сообщение именно на активный экран, правда оно немного костыльное но всё же лучше чем ничего:
let curconsole=`fgconsole`
let curdisplay=$curconsole-7
curuser=`who -u -s -w | grep “+ pts/$curdisplay” | cut -d ‘ ‘ -f1`
Если кто поделится более красивым решением – тому с полки пирожок! =)
2Murz
касательно удаления сообщений. У меня никаких архивов не наблюдается – сообщение появляется, висит какое-то количество времени (параметр -t) и спокойно скрывается :) Когда юзал mpd без сонаты – тоже делал через него нотификейшн
@boombick, в Вашем случае это совершенно лишнее действие, *если* вы вставили это задание в Ваш личный crontab (а только так и надо было это делать), то есть если Вы выполнили что-то типа
$ crontab -e
из шелла, который работает в Вашими правами (а не от рута!) и дописали/написали туда нужное задание.
Поскольку задания из пользовательского кронтаба выполняются с правами этого пользователя, никакие приседания с правами доступа к X-серверу не нужны, т.к. у запущенного процесса и так будет право читать ваш ~/.Xauthority, и остаётся только трюк с указанием DISPLAY.
`xhost +` разрешает любому процессу в системе, работающему с любыми правами, работать с X-сервером. Это потенциальная дыра в системе.
Чтобы вернуть систему в нормальное состояние, нужно выполнить `xhost -`.
2Konstantin Khomoutov
Спасибо за комментарий, поправил пост
Я не совсем сразу заметил что скриншот из гнома. Использую KDE и там после того как сообщение отобразилось, оно складывается в трей и висит там в списке, пока вручную не почистишь.
И вот никак не могу найти способ их автоматом по тайм-ауту оттуда вычищать.
Тут я вам не помогу :) Опыта работы с KDE нет совсем нет
2boombick, ну дык у вас никогда не будет этих 6 цифр, что, предположительно, лишит вас части цитат
Адрес
http://api.forismatic.com/api/1.0/?method=getQuote&key=${RANDOM}&format=text&lang=ru
У вас идёт в одинарных кавычках, поэтому подстановка ${RANDOM} производится не будет. Вообще, параметр key можно убрать.