LINUX.ORG.RU

[DWM] Нотификации о новых сообщениях

 


0

1

Не хочу юзать трей. Хочу просто в текстовом виде показывать на статусбаре уведомления о новых письмах, сообщениях в im, etc. С письмами легко: прямо в .xinitrc в цикле будет вызываться `ls ~/mail/general/new | wc -l`. А вот как поступить с IM; у меня это pidgin, поэтому я *могу* при новом сообщении выполнять внешнюю программу, но как этой внешней программой изменить статусбар dwm'а?

xsetroot, как я понимаю, может только устанавливать текст в статусбаре, а мне, видимо, нужно его прочитать, изменить и уже потом вывести. Причём надо учитывать, что следующая итерация цикла в xinitrc снова поставит старый статус.

Думаю, я не единственный человек, кто хочет уведомление о сообщениях в статусбаре и при этом не хочет трея. Как это делают нормальные люди?



Последнее исправление: toady2 (всего исправлений: 1)

> А вот как поступить с IM; у меня это pidgin, поэтому я *могу* при новом сообщении выполнять внешнюю программу, но как этой внешней программой изменить статусбар dwm'а?

Пиши оттуда данные во временный файл, а потом из него в коде, который «прямо в .xinitrc в цикле будет вызываться», подставляй данные.

geekless ★★
()
Ответ на: комментарий от geekless

Хорошо. При новом сообщении будет выполняться `echo x >/tmp/pidgin-notice`. Сообщение я прочитал. А файл остался старый. Вроде бы в пиджине нельзя выполнять внешнюю команду *после* прочтения сообщения.

toady2
() автор топика

>но как этой внешней программой изменить статусбар dwm'а?

Я костылял для этого отдельный статус-демон, который xsetroot'ит содержимым отдельного каталога. Всё, что потенциально может менять статус, само пишет в свой файл в этом каталоге + само чистит/удаляет этот файл. Плюс делал cli-софтину из одной строки баша, которая отображает уведомление с заданным текстом заданное время.

x3al ★★★★★
()

А вообще нельзя ли как-нибудь отлавливать тот момент, когда пиджин (или любая другая программа) пытается мигать в трее (или по крайней мере менять иконку)?

toady2
() автор топика
Ответ на: комментарий от toady2

Когда мне было лень разбираться с таким софтом, /me сделал ещё один костыль, чистящий сразу все уведомления и навесил его на хоткей.

Кстати, прямо в xinitrc делать такие циклы неудобно: перезапуск сложен. Я выносил его в отдельный файл.

x3al ★★★★★
()
Ответ на: комментарий от toady2

> Вроде бы в пиджине нельзя выполнять внешнюю команду *после* прочтения сообщения.

Пиджинопроблемы же.

Можно настрогать вооот такенный костыль: написать демон, который будет выполнять указанную команду при активации окна, если окно соответствует заданной маске. Таким образом, каждый раз при переходе в окно пиджина можно чистить указанный файл.

// Первое, что пришло в голову.

geekless ★★
()

Можно использовать fifo файлы, т.е в .xinitrc:
#DWM statusbar (read fifo-file)
while true; do
   xsetroot -name «`cat /var/log/state_system`»
done&

А в каком-то другом скриптике:
echo «notification» > /var/log/state_system

sol_linux ★★
()
Ответ на: комментарий от x3al

Когда мне было лень разбираться с таким софтом, /me сделал ещё один костыль, чистящий сразу все уведомления и навесил его на хоткей.

Придётся так. Хотя хотелось всё-таки некоторого автоматизма и без костылей. Неужели эта проблема столь редкая, что её ещё никто не занялся?

Кстати, прямо в xinitrc делать такие циклы неудобно: перезапуск сложен.

Что за перезапуск?

toady2
() автор топика
Ответ на: комментарий от sol_linux

Проблема у меня не в нотификации, а в том, как её снять, когда она уже не нужна.

toady2
() автор топика
Ответ на: комментарий от toady2

> Неужели эта проблема столь редкая, что её ещё никто не занялся?

Думаю, самым верным решением будет доработать код пиджина, чтобы можно было отслеживать и событие «новые сообщения прочитаны» и предложить патч в офф.багтрекер.

geekless ★★
()
Ответ на: комментарий от toady2

>Что за перезапуск?

Как перезапустить главный цикл нотификации, если он в xinitrc? Перезапускать иксы? После вынесения в отдельный процесс его удобнее менять.

После всего этого /me экспериментировал вообще без подобного цикла (cron — вполне неплохая вещь, fcron умеет нужную точность и справляется с такими задачами).

x3al ★★★★★
()
Ответ на: комментарий от x3al

Как перезапустить главный цикл нотификации, если он в xinitrc?

Всё равно не понял. В цикле стоит sleep, скажем, на 20 сек. Каждые 20 сек статусбар обновляется. Что вы имеете в виду под перезапуском и зачем он нужен?

toady2
() автор топика
Ответ на: комментарий от toady2

Допустим, хочется добавить отображение чего-нибудь ещё.

x3al ★★★★★
()
Ответ на: комментарий от toady2

Это когда окно хочет привлечь внимание (новое приватное сообщение в чятиках, например). В традиционных WM оно мигает на панели задач, в dwm — меняется цвет рамки + емнип меняется фон тегов с этим окном.

x3al ★★★★★
()
Ответ на: комментарий от x3al

После вынесения в отдельный процесс его удобнее менять.

Не покажите пример, как это делать? У меня тоже всплыла проблема: о новых письмах и сообщениях я получаю уведомление (мигает светодиод на клаве) сразу, т.е. при очередном считывании почты с сервера (это делается кроном раз в 20 минут) и поставлена внешняя программа на событие «новое сообщение» в пиджине. Цикл статусбара работает независимо (делает ls ... | wc -l на каталоге с почтой и читает спец. файл, генерируемый пиджином). Проблема в том, что они срабатывают не одновременно. Цикл в xinitrc стоит на 20 сек, т.е. в худшем случае при получения уведомления на светодиоде я только через 20 секунд узнаю, от какой программы это пришло. Поэтому необходимо насильно итерировать цикл при проверке почты и получении нового сообщения. Как это сделать? Вынесу я цикл в отдельный скрипт, а что дальше?

toady2
() автор топика
Ответ на: комментарий от toady2

>Не покажите пример, как это делать?

Это немного к другому, например, для добавления/убирания температуры и прочих модификаций в главном лупе. Как минимум на время настройки.

Проблема в том, что они срабатывают не одновременно.

Вручную сделать xsetroot точно той же строкой, которая должна появиться при итерации цикла в xinitrc. incrond, если это делается файлами, к примеру. При вынесении в отдельный скрипт, конечно, можно его перезапустить (что форсирует обновление статуса) тем же incrond, но это не слишком нужно.

x3al ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.