Нашел кстати интересный вариант.
Оказывается сейчас все "современные/правильные" приложения уже выводят свои индикаторы через специальный сервис D-Bus
StatusNotifierItem. Что позволяет вообще отвязаться от DE. Там вся суть D-Bus (если кто не в курсе что это такое) в общей шине, которую приложения могут использовать и как сервис, и как среду для предоставления сервисов. Так вот StatusNotifierItem - обеспечивается всякого рода плагинами панели DE, которые отвечают за отображение статусов разных служб и приложений (туда обычно микшер звука и network-manager свои иконки с меню вешают, а еще туда всякие telegram и zoom свои иконки вешают).
Под go есть (довольно еще кривой) fyne.io/systray - это форк уже используемого в yd-go github.com/getlantern/systray (проект уже почти заброшен), в котором для linux вывод индикатора сделан через D-Bus.
Кривость fyne.io/systray в том что они его там преимущественно под KDE гоняют и, к примеру у меня в XFCE меню не показывается и иконка смазывается (они зачем-то ее перекодируют там). Еще пока не очень понял в чем там проблема с меню, но вроде есть мысли как поправить. Буду пробовать в форке подкорежить, что бы он у меня заработал, и потом надо будет в других DE попробовать.
Пилю пока в отдельной feture-branch
switch-to-fyne-io. Если получится довести до ума то yd-do будет независим от GTK.
PS
За одно еще раскопал тему как через D-Bus уведомления выводить (раньше они просто вызовом внешней утилиты notify-send делались). Уже сделал вариант с отправкой уведомлений через D-Bus в
dev бранче. Если кто-то готов потестировать (
собранный 64-биный) в разных дистрибутивах - буду очень благодарен любым фидбекам.
Пользователь добавил сообщение 09 Мая 2022, 16:52:57:
Нашел вроде еще один форк github.com/skycoin/systray (форк от fyne.io/systray, который форк от github.com/getlantern/systray).
Там в мастер ветке вроде заработало меню.
Т.е. теперь получилось в ветке switch-to-fyne-io сделать сборку без зависимостей от GTK!!!
И более того - там теперь CGO (баиндинг С в Go) не нужен стал.
Если собирать динамически линкуемый вариант то получается так:
$ go build -ldflags "-X main.version=$(git describe --tag)"
$ ll yd-go
-rwxrwxr-x 1 stc stc 6131647 мая 9 15:48 yd-go*
$ ldd yd-go
linux-vdso.so.1 (0x00007ffd30bde000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f5a810b5000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f5a80ec3000)
/lib64/ld-linux-x86-64.so.2 (0x00007f5a810f0000)
А если собирать статически собранный бинарь то:
$ CGO_ENABLED=0 go build -ldflags "-X main.version=$(git describe --tag)"
$ ldd yd-go
not a dynamic executable
$ ll yd-go
-rwxrwxr-x 1 stc stc 6088581 мая 9 15:52 yd-go*
$ ldd yd-go
linux-vdso.so.1 (0x00007fff3d9ad000)
libappindicator3.so.1 => /lib/x86_64-linux-gnu/libappindicator3.so.1 (0x00007f6d2d06d000)
libgtk-3.so.0 => /lib/x86_64-linux-gnu/libgtk-3.so.0 (0x00007f6d2c8bc000)
libgobject-2.0.so.0 => /lib/x86_64-linux-gnu/libgobject-2.0.so.0 (0x00007f6d2c85c000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f6d2c733000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6d2c710000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6d2c51e000)
libdbusmenu-gtk3.so.4 => /lib/x86_64-linux-gnu/libdbusmenu-gtk3.so.4 (0x00007f6d2c505000)
libdbusmenu-glib.so.4 => /lib/x86_64-linux-gnu/libdbusmenu-glib.so.4 (0x00007f6d2c4e5000)
libgdk-3.so.0 => /lib/x86_64-linux-gnu/libgdk-3.so.0 (0x00007f6d2c3e0000)
libgio-2.0.so.0 => /lib/x86_64-linux-gnu/libgio-2.0.so.0 (0x00007f6d2c1ff000)
libgmodule-2.0.so.0 => /lib/x86_64-linux-gnu/libgmodule-2.0.so.0 (0x00007f6d2c1f9000)
libpangocairo-1.0.so.0 => /lib/x86_64-linux-gnu/libpangocairo-1.0.so.0 (0x00007f6d2c1e7000)
libX11.so.6 => /lib/x86_64-linux-gnu/libX11.so.6 (0x00007f6d2c0a8000)
libXi.so.6 => /lib/x86_64-linux-gnu/libXi.so.6 (0x00007f6d2c096000)
libXfixes.so.3 => /lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f6d2c08e000)
libcairo-gobject.so.2 => /lib/x86_64-linux-gnu/libcairo-gobject.so.2 (0x00007f6d2c082000)
libcairo.so.2 => /lib/x86_64-linux-gnu/libcairo.so.2 (0x00007f6d2bf5f000)
libgdk_pixbuf-2.0.so.0 => /lib/x86_64-linux-gnu/libgdk_pixbuf-2.0.so.0 (0x00007f6d2bf37000)
libatk-1.0.so.0 => /lib/x86_64-linux-gnu/libatk-1.0.so.0 (0x00007f6d2bf0b000)
libatk-bridge-2.0.so.0 => /lib/x86_64-linux-gnu/libatk-bridge-2.0.so.0 (0x00007f6d2bed4000)
libepoxy.so.0 => /lib/x86_64-linux-gnu/libepoxy.so.0 (0x00007f6d2bda1000)
libfribidi.so.0 => /lib/x86_64-linux-gnu/libfribidi.so.0 (0x00007f6d2bd84000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6d2bc35000)
libpangoft2-1.0.so.0 => /lib/x86_64-linux-gnu/libpangoft2-1.0.so.0 (0x00007f6d2bc1c000)
libpango-1.0.so.0 => /lib/x86_64-linux-gnu/libpango-1.0.so.0 (0x00007f6d2bbcb000)
libharfbuzz.so.0 => /lib/x86_64-linux-gnu/libharfbuzz.so.0 (0x00007f6d2bac6000)
libfontconfig.so.1 => /lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f6d2ba7f000)
libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f6d2b9c0000)
libffi.so.7 => /lib/x86_64-linux-gnu/libffi.so.7 (0x00007f6d2b9b4000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f6d2b93f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6d2d097000)
libXinerama.so.1 => /lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007f6d2b93a000)
libXrandr.so.2 => /lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007f6d2b92d000)
libXcursor.so.1 => /lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007f6d2b920000)
libXcomposite.so.1 => /lib/x86_64-linux-gnu/libXcomposite.so.1 (0x00007f6d2b91b000)
libXdamage.so.1 => /lib/x86_64-linux-gnu/libXdamage.so.1 (0x00007f6d2b914000)
libxkbcommon.so.0 => /lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007f6d2b8d2000)
libwayland-cursor.so.0 => /lib/x86_64-linux-gnu/libwayland-cursor.so.0 (0x00007f6d2b8c7000)
libwayland-egl.so.1 => /lib/x86_64-linux-gnu/libwayland-egl.so.1 (0x00007f6d2b8c2000)
libwayland-client.so.0 => /lib/x86_64-linux-gnu/libwayland-client.so.0 (0x00007f6d2b8b1000)
libXext.so.6 => /lib/x86_64-linux-gnu/libXext.so.6 (0x00007f6d2b89c000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f6d2b890000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f6d2b874000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6d2b86e000)
libmount.so.1 => /lib/x86_64-linux-gnu/libmount.so.1 (0x00007f6d2b80e000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f6d2b7e3000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f6d2b7c7000)
libxcb.so.1 => /lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f6d2b79b000)
libpixman-1.so.0 => /lib/x86_64-linux-gnu/libpixman-1.so.0 (0x00007f6d2b6f4000)
libpng16.so.16 => /lib/x86_64-linux-gnu/libpng16.so.16 (0x00007f6d2b6bc000)
libxcb-shm.so.0 => /lib/x86_64-linux-gnu/libxcb-shm.so.0 (0x00007f6d2b6b7000)
libxcb-render.so.0 => /lib/x86_64-linux-gnu/libxcb-render.so.0 (0x00007f6d2b6a8000)
libXrender.so.1 => /lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f6d2b49c000)
libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f6d2b44b000)
libatspi.so.0 => /lib/x86_64-linux-gnu/libatspi.so.0 (0x00007f6d2b414000)
libthai.so.0 => /lib/x86_64-linux-gnu/libthai.so.0 (0x00007f6d2b409000)
libgraphite2.so.3 => /lib/x86_64-linux-gnu/libgraphite2.so.3 (0x00007f6d2b3dc000)
libexpat.so.1 => /lib/x86_64-linux-gnu/libexpat.so.1 (0x00007f6d2b3ac000)
libuuid.so.1 => /lib/x86_64-linux-gnu/libuuid.so.1 (0x00007f6d2b3a3000)
libblkid.so.1 => /lib/x86_64-linux-gnu/libblkid.so.1 (0x00007f6d2b34c000)
libpcre2-8.so.0 => /lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f6d2b2bc000)
libXau.so.6 => /lib/x86_64-linux-gnu/libXau.so.6 (0x00007f6d2b2b6000)
libXdmcp.so.6 => /lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f6d2b2ac000)
libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007f6d2b1fd000)
libdatrie.so.1 => /lib/x86_64-linux-gnu/libdatrie.so.1 (0x00007f6d2b1f3000)
libbsd.so.0 => /lib/x86_64-linux-gnu/libbsd.so.0 (0x00007f6d2b1d9000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f6d2b1b0000)
liblz4.so.1 => /lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f6d2b18d000)
libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f6d2b06f000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f6d2b04c000)
Т.е., кроме исключения зависимостей от GTK и внешних утилит (notify-send), можно еще и размер бинарика немного уменьшить.
Собранный
статический 64-битный бинарь приложил в последий релиз из мастера. Или можно поставить себе go (v1.18) и собрать самостоятельно из ветки
switch-to-fyne-io.
Если есть желающие его погонять в разных дистрибутивах - буду очень признателен т.к. сам планирую проверить только в паре дистрибутивов на виртуалке: LTS- версии ubuntu и kubuntu. После чего наверно буду мержить эту ветку в мастер.