[GTK, libnotify] отправить нотификейшн из демона

Vadim69

демон стартует с ситемой с правами рута. возникла необходимость отправить из него нотифай текущему залогиненному в X-ы пользователю. как бы это сделать правильно?
сначала в логи писалась ошибка: libnotify-Message: Unable to get session bus: /bin/dbus-launch terminated abnormally with the following error: Autolaunch error: X11 initialization failed. если в скрипте запуска демона дописать DISPLAY=:0.0, то все хорошо, ошибки не возникает(если вызывать notify_init заведомо после старта нотификейшн-демона, конечно но при этом стиль оформления нотифая - дефолтовый ГТК-шный.
есть вариант, но он мне не нравится: запускать при логине в гном еще один демон с правами юзера и читать им сообщения от основного демона и по получении нужного - рисовать нотифай. тогда все рисуется хорошо, как и должно, но мне это, повторюсь, не нравится.

conv3rsje

Вроде тебе надо просто найти "правильный" адрес клиентского демона.
Прописыванием DISPLAY ты лишь добиваешься того, что на сессионном (кстати откуда он?) бусе запускается твой демон, а не пользовательский.
Попробуй для эксперимента прописать демону правильный DBUS_SESSION_BUS_ADDRESS из своего env'а.
Можно еще посмотреть, как сделаны оповещения у авахи, когда он мрет при подключении/отключении интерфейса.

Vadim69

Вроде тебе надо просто найти "правильный" адрес клиентского демона.
Прописыванием DISPLAY ты лишь добиваешься того, что на сессионном (кстати откуда он?) бусе запускается твой демон, а не пользовательский.
Попробуй для эксперимента прописать демону правильный DBUS_SESSION_BUS_ADDRESS из своего env'а.
да, я примерно так и думал. так работает. надо придумать как это из демона подглядеть.

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

хм, там как-то больно дофига, но если не получится первым способом, попробую.
спасибо.

Barbie29

Выключит компьютер (без всяких root'овских прав):
dbus-send –system –dest=org.freedesktop.Hal –type=method_call –print-reply /org/freedesktop/Hal/devices/computer org.freedesktop.Hal.Device.SystemPowerManagement.Shutdown
Получить массив, содержащий список контактов запущенного kopete:
dbus-send –dest=org.kde.kopete –type=method_call –print-reply /Kopete org.kde.Kopete.contacts
а мне понравилось.

Vadim69

это не совсем подходит: нотификейшн вешается на юзерскую шину, а не на на системную. то есть все равно остается вопрос как получить юзерскую шину из демона. но я с этим разобрался:
1. узнаем PID gnome-session
2. смотрим в /proc/PID/environ и берем оттуда DBUS_SESSION_BUS_ADDRESS и заодно DISPLAY и устанавливаем себе.
3. посылаем нотифай
4. ?
5. PROFIT!

conv3rsje

заодно DISPLAY и устанавливаем себе
Это обязательно? Просто интересно :)

Vadim69

это я на всякий случай, без него работает. просто пока не пробовал, будет ли работать для дисплея не на :0.0 (на втором логине или вообще при логине через MCP)

serega1604

dbus-send –system –dest=org.freedesktop.Hal –type=method_call –print-reply /org/freedesktop/Hal/devices/computer
void 20:00:39 ~ % dbus-send –system –dest=org.freedesktop.Hal –type=method_call –print-reply /org/freedesktop/Hal/devices/computer                             0
process 21907: arguments to dbus_message_new_signal were incorrect, assertion "_dbus_check_is_valid_path (path)" failed in file dbus-message.c line 1165.
This is normally a bug in some application using the D-Bus library.
Couldn't allocate D-Bus message
Оставить комментарий
Имя или ник:
Комментарий: