Go Desktop
В феврале 2025 года я начал работать над своей системой виджетов для Wayland-композиторов. В качестве языка был выбран Go, а тулкитом для отображения виджетов — GTK 3.
За это время было разработано несколько библиотек, которые реализуют необходимый для подобного проекта функционал. Специфика Go в том, что на нём практически не разрабатываются десктопные приложения — дальше PoC дело не заходит. Поэтому часто приходилось изобретать велосипед, реализуя недостающий функционал по спецификациям.
В сентябре-октябре 2025 года я понял, что выбор языка был ошибкой. Когда речь заходит о разработке нативных графических приложений, всегда встает вопрос привязок — в подавляющем большинстве случаев, так или иначе, используется библиотеки языка C, предварительно обернутые для использования в другом языке. Мой проект не стал исключением, и использовал cgo повсеместно. Но cgo — это уже не Go, что и стало, на мой взгляд, камнем преткновения.
Особенностью привязок является управление памятью, что особенно важно для GTK, ведь весь тулкит построен вокруг подсчета ссылок — основной задачей при разработке привязок является правильное освобождение ресурсов.
В итоге вышло так, что все плюсы Go как языка были перевешены минусами, связанными со спецификой проекта. На данный момент я приостановил разработку.
Тем не менее, этот проект дал мне большой опыт:
- Прежде всего, он наглядно показывает очевидную вещь — следует выбирать подходящие под задачу инструменты.
- Что не менее важно, мне удалось реализовать несколько спецификаций. Некоторые из них реализовать было действительно непросто, например, у себя в блоге я рассказывал о реализации системного трея.
- Наконец, были разработаны 4 библиотеки, связанные с функциональностью рабочих столов.
Дополнительные библиотеки
В рамках работы над окружением я провел исследования механизмов взаимодействия компонентов рабочего стола, существующих протоколов и спецификаций, и разработал ряд библиотек. Они реализуют функционал, который может быть использован и за пределами проекта. Ниже перечислены некоторые из них:
-
gotk3-session-lock— привязки (bindings) Go для библиотекиgtk-session-lock, которая реализует протоколext-session-lock-v1в GTK. -
systray— реализация спецификации StatusNotifierItem , не зависящая от графических тулкитов. -
gotk3-vte— привязки Go для библиотеки VTE , которая позволяет отображать виртуальные терминалы как виджеты GTK. -
go-greetd— реализация IPC-протокола greetd , позволяющая реализовывать собственные менеджеры дисплеев.
В конечном итоге можно считать, что я разработал набор десктопных библиотек для Go. Хороший это результат, или плохой — пусть каждый решит для себя сам.
Демонстрация
Здесь представлены некоторые части окружения рабочего стола.
Панель (конфигурация и стили по умолчанию)
Меню запуска приложений (конфигурация и стили по умолчанию)
Меню питания (конфигурация и стили по умолчанию)