Go Desktop

В феврале 2025 года я начал работать над своей системой виджетов для Wayland-композиторов. В качестве языка был выбран Go, а тулкитом для отображения виджетов — GTK 3.

За это время было разработано несколько библиотек, которые реализуют необходимый для подобного проекта функционал. Специфика Go в том, что на нём практически не разрабатываются десктопные приложения — дальше PoC дело не заходит. Поэтому часто приходилось изобретать велосипед, реализуя недостающий функционал по спецификациям.

В сентябре-октябре 2025 года я понял, что выбор языка был ошибкой. Когда речь заходит о разработке нативных графических приложений, всегда встает вопрос привязок — в подавляющем большинстве случаев, так или иначе, используется библиотеки языка C, предварительно обернутые для использования в другом языке. Мой проект не стал исключением, и использовал cgo повсеместно. Но cgo — это уже не Go, что и стало, на мой взгляд, камнем преткновения.

Особенностью привязок является управление памятью, что особенно важно для GTK, ведь весь тулкит построен вокруг подсчета ссылок — основной задачей при разработке привязок является правильное освобождение ресурсов.

В итоге вышло так, что все плюсы Go как языка были перевешены минусами, связанными со спецификой проекта. На данный момент я приостановил разработку.

Тем не менее, этот проект дал мне большой опыт:

  1. Прежде всего, он наглядно показывает очевидную вещь — следует выбирать подходящие под задачу инструменты.
  2. Что не менее важно, мне удалось реализовать несколько спецификаций. Некоторые из них реализовать было действительно непросто, например, у себя в блоге я рассказывал о реализации системного трея.
  3. Наконец, были разработаны 4 библиотеки, связанные с функциональностью рабочих столов.

Дополнительные библиотеки

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

В конечном итоге можно считать, что я разработал набор десктопных библиотек для Go. Хороший это результат, или плохой — пусть каждый решит для себя сам.

Демонстрация

Здесь представлены некоторые части окружения рабочего стола.

Панель

Панель (конфигурация и стили по умолчанию)

Меню запуска приложений

Меню запуска приложений (конфигурация и стили по умолчанию)

Меню питания

Меню питания (конфигурация и стили по умолчанию)