Telegram Desktop: пропадают аватарки уведомлений при включённом GNotification [Решение]
У Telegram Desktop на Linux при включённом GNotification в системных уведомлениях пропадают аватарки контактов/чатов.
При этом если отключить GNotification и использовать родной backend уведомлений Telegram, аватарки появляются. Также проблема не зависит от notification daemon: проверено как с dunst, так и с xfce4-notifyd.
Система:
- Arch Linux
- X11
- Telegram Desktop 7.0.9
- GLib 2.88.3
- dunst 1.13.2
Похоже, проблема находится в связке GNotification → GLib → freedesktop notifications.
Telegram передаёт аватарку в GNotification как GBytesIcon. Но GLib при преобразовании GNotification в org.freedesktop.Notifications.Notify не преобразует GBytesIcon в image-data/image-path.
В результате в D-Bus вызове Notify есть desktop-entry, urgency, category и т. п., но нет ни image-data, ни image-path:
string "Telegram Desktop"
uint32 0
string ""
string "..."
string "..."
...
array [
dict entry(
string "desktop-entry"
variant string "telegram-desktop"
)
dict entry(
string "urgency"
variant byte 1
)
dict entry(
string "category"
variant string "im.received"
)
]
То есть notification daemon просто не получает изображение.
Интересно, что это как оказалось можно исправить.
Я сделал небольшой LD_PRELOAD shim, который перехватывает:
g_notification_set_icon(GNotification *, GIcon *)
Если передан GBytesIcon, shim извлекает из него PNG, сохраняет его в /run/user/$UID/gnotification-icons/, создаёт GFileIcon и передаёт уже его настоящей функции GLib.
После этого GLib нормально отправляет:
image-path = /run/user/$UID/gnotification-icons/<hash>.png
и аватарка появляется.
Таким образом, получается:
Telegram
→ GNotification
→ GBytesIcon
→ [shim: GBytesIcon → PNG → GFileIcon]
→ GLib
→ org.freedesktop.Notifications
→ dunst/xfce4-notifyd
Возможно, это можно исправить непосредственно в Telegram Desktop или в GLib. Если кто-нибудь знает более правильный способ — буду рад.
Для тех, кому нужен рабочий workaround, ниже полный вариант.
Исходник shim.c:
( читать дальше... )
Сборка:
gcc -shared -fPIC \
-o ~/.local/lib/libtelegram-gicon-shim.so \
shim.c \
$(pkg-config --cflags --libs gio-2.0) \
-ldl
Запуск Telegram:
LD_PRELOAD="$HOME/.local/lib/libtelegram-gicon-shim.so" \
telegram-desktop
Если Telegram запускается через собственный wrapper, то:
#!/usr/bin/env bash
export LD_PRELOAD="$HOME/.local/lib/libtelegram-gicon-shim.so"
exec /usr/bin/Telegram "$@"
После первого уведомления изображения появляются здесь:
/run/user/$UID/gnotification-icons/
Они находятся в пользовательском runtime-каталоге, поэтому после завершения пользовательской сессии исчезают сами.
Файлы именуются по SHA-256 содержимого PNG, поэтому одинаковые аватарки не дублируются.
Если кому-нибудь интересно, можно попробовать сделать из этого небольшой пакет для Arch или нормальный патч для Telegram/GLib.
Разбирался почему не работает и делал с помощью ChatGPT
А так я не програмист, я обычный сварщик, так что сильно не бейте)