Спасибо! Работает стабильно, квадрат летит!
🎉 Первый этап пройден!

Отлично, поздравляю — теперь у нас есть настоящий Wayland-клиент с двойной буферизацией, корректной обработкой wl_buffer.release, и главное — никаких зависимостей от MSE. Это фундамент, на котором можно строить всё остальное.
Что мы имеем сейчас
text

wlgui_types.pas     — TWLColor, TRectI, TPointI, TWLNotifyEvent
wlgui_context.pas   — TWLContext (display, compositor, shm, wm_base, seat)
wlgui_app.pas       — TWLApplication (инициализация, event loop)
wlgui_window.pas    — TWLWindow (окно + двойная буферизация + release)
demo_window.pas     — тестовое приложение (летающий квадрат)

Что важно зафиксировать на будущее

    Никаких forward-типов между модулями — циклы разорваны через wlgui_context.

    Версии протоколов ограничиваем через Min(композитор, наш_дескриптор). Иначе композитор шлёт события, которых нет в нашем дескрипторе.

    wl_buffer.release обязателен для двойной буферизации.

    Event loop через wl_display_prepare_read + poll + read_events + dispatch_pending — правильный паттерн, без блокирующих roundtrip'ов в горячем цикле.

Что впереди — ближайшие шаги
Этап 2: wlgui_canvas.pas — рисование

Сейчас рисование в TWLWindow — это FillRect + SetPixel. Нужно:

    HLine, VLine, Line (алгоритм Брезенхэма)

    Rect (контур, не заливка)

    RoundRect, Ellipse, FillEllipse

    CopyRect (для будущего скролла)

    Clip-регион (хотя бы прямоугольный)

И вынести всё это в отдельный класс TWLCanvas, который привязывается к буферу:
pascal

Canvas := TWLCanvas.Create(Win);
Canvas.Line(0, 0, 100, 100, clRed);
Canvas.Rect(TRectI.New(10, 10, 50, 50), clWhite);
Canvas.Free;

Или проще — методы прямо в TWLWindow, чтобы OnPaint был коротким.
Этап 3: wlgui_font.pas — текст

    FreeType напрямую (у нас уже есть msefreetype_wayland из прошлых чатов, но без MSE)

    Кэш глифов: TWLFont.LoadGlyph(Code) → TGlyph с Left, Top, Width, Height, Advance, Bitmap: array of Byte

    TextOut(X, Y, U4String, Color, Font) — рисуем в буфер окна

    TextWidth(U4String, Font) — для выравнивания

    Используем u4str, u4utf8, u4norm — то, что ты подгрузил

Здесь важно: свой минимальный рендер, без MSE bitmap/graphics. Только FreeType + прямая запись пикселей.
Этап 4: wlgui_events.pas — ввод

    wl_seat.listener → capabilities → get_pointer + get_keyboard

    wl_pointer.motion/button/axis/frame → очереди событий

    wl_keyboard.key/modifiers → keymap через xkbcommon или через u4str + ручной маппинг (для начала — ASCII из Linux keycodes)

    Курсор: wl_pointer.set_cursor с собственной поверхностью

    API: OnMouseMove, OnMouseDown, OnMouseUp, OnKeyDown, OnKeyUp

Этап 5: wlgui_panel.pas — layer-shell

Протокол zwlr_layer_shell_v1 — панели, доки, обои. Именно для «летающих часов».

    Нужен сгенерированный протокол (могу написать вручную, как для xdg_shell)

    Интерфейс: wlr_layer_surface_v1 + get_layer_surface(surface, output, layer, namespace)

    set_anchor(edges), set_size(w, h), set_margin(...), set_keyboard_interactivity(...)

    Слои: background, bottom, top, overlay

С overlay панель будет поверх всего. Позицию задаём через anchor + margin. Двигать — меняем margin + commit.
Этап 6: Органайзер

    organ_model.pas — события (время, сообщение, звук, скрипт)

    organ_storage.pas — сохранение/загрузка (сначала — простой текстовый формат)

    organ_clock.pas — панель с часами

    organ_event_edit.pas — редактор события

    organ_event_list.pas — список событий

Пара практических вопросов к тебе

    Куда идём дальше? Мои варианты:

        A: Сначала canvas + font (полный графический фундамент), потом events, потом органайзер. Более гладко, но дольше до первой «рабочей» картинки.

        B: Сначала events (чтобы таскать окно самому, ловить кнопки), потом canvas+font, потом органайзер. Раньше получим интерактивность.

        C: Сразу органайзер с тем что есть (только FillRect + SetPixel), чтобы быстрее увидеть результат. Потом улучшать.

    Layer-shell — планируешь использовать sway/hyprland/kwin, или что-то конкретное? От этого зависит, стоит ли закладываться на wlr-layer-shell или искать альтернативы.

    FreeType-биндинги — у нас в msefreetype_wayland.pas был вариант с dynlibs (без MSE). Готов его переиспользовать, или предпочитаешь переписать заново в wlgui_font.pas?

    XKB для клавиатуры — подключать libxkbcommon (правильный путь, но новая зависимость), или для начала ограничиться ASCII-маппингом Linux keycodes (быстро, но без раскладок)?

    Структура директорий — оставляем всё в корне, или сделаем wlgui/ для библиотеки и apps/organizer/ для приложения?

Я бы предложил порядок A → B → C: canvas+font сначала, потому что они дадут возможность рисовать «настоящий» UI, а интерактивность и потом прикрутим. Но если хочется быстрее увидеть «работающее приложение» — пойдём C → A → B.

Скажи, куда двигаемся.