module

Carat::Apps

app: true у бинарника превращает его из CLI-утилиты в desktop-приложение. Вместо общего bin-каталога бинарник получает собственный app-каталог:

~/.carat/apps/<name>/ bin/<name> бинарник (портабельный корень приложения) icons/<name>.png иконка (или .svg / платформенный .ico / .icns) manifest сгенерированные снаружи пути (задел под uninstall)

Иконка берётся из assets:appicon: (любой путь в шарде), её формат проверяется по magic bytes (marcel.cr) — только PNG или SVG. Конвертация не требуется: .desktop принимает PNG/SVG напрямую, а .ico/.icns — контейнеры, принимающие PNG-payload без перекодирования (Ico/Icns).

На каждую платформу генерируется нативная точка входа: XDG .desktop на Linux (одинаково для всех дистрибутивов — спецификация вместо uname), ярлык в Start Menu на Windows, .app-бандл в ~/Applications на macOS. Приложение ничего не знает про carat: свои ассеты оно ищет относительно себя (portable-app конвенция), лаунчер ссылается абсолютными путями.

Constants

PNG_MIME = "image/png"
SVG_MIME = "image/svg+xml"

Class methods

install(meta : ShardMeta, store : String, bin_dir : String) : Nil

Все бинарники с desktop-интеграцией (launchers:) шарда: иконка, при необходимости переезд бинарника с PATH в app-каталог, нативные лаунчеры (menu/desktop). Вызывается после сборки (глобальная установка).

Source
png_dimensions(png : Bytes) : Tuple(Int32, Int32)

Размеры из IHDR (PNG-заголовок) — для Ico/Icns без декодирования.

Source