Апгрейд 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/


 

Система Orphus

 


 

Comments: 13

  1. WTakET January 9th, 2011 at 12:59 am

    Зря вы указываете key=${RANDOM}, во-первых, RANDOM функция возвращающая числа в диапазоне 0 – 32767, и поэтому для задания псевдослучайного числа из шести цифр, надо делать, например, так: key=$((RANDOM%999))$((RANDOM%999))
    а во-вторых, как сказано в API, без указания “key”, ключ генерируется случайно.

  2. Konstantin Khomoutov January 9th, 2011 at 3:09 am

    `xhost +` это великолепно! Теперь посоветуйте убрать “-nolisten tcp” из /etc/X11/xinit/xserverrc и пятиминутку дурных советов можно считать завершённой.

  3. boombick January 9th, 2011 at 11:04 am

    Необязательно 6 символов. Там написано – максимальная длина – 6 цифр :)

  4. boombick January 9th, 2011 at 11:10 am

    2Konstantin Khomoutov
    Это просто примочка для десктопа, не более того. Очень хорошо, что вы понимаете нюансы безопасности системы, буду благодарен вам за правильное решение.

  5. Murz January 9th, 2011 at 2:09 pm

    А можно ли через этот патченный notify-send задать чтобы сообщение не складывалось в архив а удалялось после тайм-аута?
    У меня играет музыка через mpd и я настроил чтобы по notify-send выводилось название новой песни на экран, но получается что под конец дня эта куча сообщений остаётся висеть в трее, пока их вручную не подчистишь.

    Также туда же повесил уведомления на команды изменения громкости через ИК-пульт, которые тоже мусора добавляют…

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

  6. Murz January 9th, 2011 at 2:15 pm

    Вместо xhost я использую sudo -u username и тогда безо всяких доп. доступов из крона скрипт нормально выводит уведомление на экран юзера.
    Если юзеров несколько и несколько сессий одновременно (например на 7 экране моя, на 8 – жены), то я тоже накнопил решение уже, которое выводит сообщение именно на активный экран, правда оно немного костыльное но всё же лучше чем ничего:

    let curconsole=`fgconsole`
    let curdisplay=$curconsole-7
    curuser=`who -u -s -w | grep “+ pts/$curdisplay” | cut -d ‘ ‘ -f1`

    Если кто поделится более красивым решением – тому с полки пирожок! =)

  7. boombick January 9th, 2011 at 2:40 pm

    2Murz
    касательно удаления сообщений. У меня никаких архивов не наблюдается – сообщение появляется, висит какое-то количество времени (параметр -t) и спокойно скрывается :) Когда юзал mpd без сонаты – тоже делал через него нотификейшн

  8. Konstantin Khomoutov January 9th, 2011 at 3:23 pm

    @boombick, в Вашем случае это совершенно лишнее действие, *если* вы вставили это задание в Ваш личный crontab (а только так и надо было это делать), то есть если Вы выполнили что-то типа
    $ crontab -e
    из шелла, который работает в Вашими правами (а не от рута!) и дописали/написали туда нужное задание.
    Поскольку задания из пользовательского кронтаба выполняются с правами этого пользователя, никакие приседания с правами доступа к X-серверу не нужны, т.к. у запущенного процесса и так будет право читать ваш ~/.Xauthority, и остаётся только трюк с указанием DISPLAY.

    `xhost +` разрешает любому процессу в системе, работающему с любыми правами, работать с X-сервером. Это потенциальная дыра в системе.
    Чтобы вернуть систему в нормальное состояние, нужно выполнить `xhost -`.

  9. boombick January 9th, 2011 at 3:35 pm

    2Konstantin Khomoutov
    Спасибо за комментарий, поправил пост

  10. Murz January 9th, 2011 at 4:41 pm

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

  11. boombick January 9th, 2011 at 5:00 pm

    Тут я вам не помогу :) Опыта работы с KDE нет совсем нет

  12. WTakET January 10th, 2011 at 1:02 am

    2boombick, ну дык у вас никогда не будет этих 6 цифр, что, предположительно, лишит вас части цитат

  13. b108 January 10th, 2011 at 8:14 pm

    Адрес
    http://api.forismatic.com/api/1.0/?method=getQuote&key=${RANDOM}&format=text&lang=ru

    У вас идёт в одинарных кавычках, поэтому подстановка ${RANDOM} производится не будет. Вообще, параметр key можно убрать.

Add a Comment