LIVE
Новость

Эволюция WUI: как C++ библиотека обрела поддержку macOS и WebAssembly

Автор небольшой C++ UI-библиотеки WUI, впервые представленной на Хабре в октябре 2023 года, сообщил о появлении платформенных бэкендов для macOS и WebAssembly.

Земфира Асланова·обновлено 12 сентября 2026 г.

Эволюция WUI: как C++ библиотека обрела поддержку macOS и WebAssembly

Если прежде библиотека собирала интерфейс только под Windows и Linux, то теперь тот же программный код кнопок, многострочного ввода, списков, меню и диалогов компилируется в нативное приложение для macOS и работает в браузере через WebAssembly — фактически речь идёт о завершении перехода кросс-платформенной модели с двух опорных систем на полноценный треугольник «десктоп — десктоп — веб».

Архитектурное разделение как основа портируемости

Ключевое решение, определившее устройство WUI с самого начала, — жёсткое разделение между платформенной реализацией и логикой контролов. Окно принимает события платформы, управляет фокусом и инициирует отрисовку; контрол хранит собственное состояние, обрабатывает события и рисует себя через единый графический интерфейс. Платформенный код отвечает лишь за то, как именно открыть окно, получить ввод и вывести изображение.

Такая декомпозиция — классический архитектурный паттерн, при котором добавление новой платформы сводится к написанию адаптера без затрагивания кода самих контролов. Кнопка остаётся одной реализацией на C++17: общий код состояний, обработки нажатия, выбора цветов из темы. То же относится к полям ввода, спискам, разделителям — единая C++-логика во всех сборках. Исправление, например, общего механизма выделения текста автоматически попадает во все целевые платформы.

WUI распространяется под Boost Software License 1.0, при этом полный Boost для её использования не требуется. Это самостоятельная компилируемая библиотека, содержащая окна, контролы, рисование, события, темы, локализацию и вспомогательные средства для работы с настройками. Прикладные задачи — взаимодействие с сервером, базой данных, медиапотоком — остаются в приложении. Ниша, на которую ориентирована библиотека, — небольшие десктоп-инструменты: клиентские приложения, панели управления, редакторы, инженерные утилиты, где основная логика уже написана на C++, а интерфейс хочется собирать рядом с ней на том же языке.

Портирование на macOS: что оказалось важнее первого окна

После появления первого окна, по признанию автора, начинается менее эффектная часть переноса — согласование фокуса, модальных окон и завершения цикла событий. На Mac применяются AppKit для окон и событий, Core Graphics для рисования, Core Text для работы с текстом и ImageIO для изображений; X11 и Cairo при этом не задействованы. Objective-C++ заключён внутри платформенной реализации и не попадает в пользовательские C++-заголовки, что сохраняет чистоту публичного API.

Существенным ограничением архитектуры AppKit стало требование обслуживать интерфейс в главном потоке. Из рабочего потока приложение может отправить window::emit_event, а обновление контролов выполнить уже при обработке события. Таймеры macOS-бэкенда также вызывают коллбэки в главном потоке. Порт проверялся на Apple Silicon, что особенно существенно в контексте перехода macOS на ARM-архитектуру.

Ресурсы помещаются в пакет приложения, в Contents/Resources/res: полагаться на рабочий каталог, из которого программу случайно запускали при разработке, нельзя — это требование корректной работы через Finder.

Что отслеживать на практике

WUI рисует собственные контролы, поэтому метрики шрифтов и ряд деталей отображения остаются платформенно-зависимыми. Общими остаются структура интерфейса, темы и код взаимодействия, однако попиксельное совпадение между Windows, Linux и macOS не гарантируется — это сознательный компромисс в пользу единой кодовой базы. Демонстрационная версия доступна через сайт: можно открыть интерфейс в браузере и убедиться, что тот же набор контролов используется в десктоп-сборке.

Для разработчиков, уже имеющих C++-логику и желающих собрать рядом интерфейс без перехода на Electron, Qt с QML или веб-стек, WUI представляет собой компактную альтернативу с лицензией Boost. Дальнейшее развитие, по словам автора, связано с расширением покрытия платформ и углублением набора контролов — этот трек стоит наблюдать, если библиотека рассматривается как основа нового десктоп-инструмента.