@startuml
title Цикл отрисовки окна (window_thread)

start

:window_thread запущен;

:Создать event queue;
:window_init();
:Запустить aux_thread для анимации;

while (окно не закрыто?) is (да)
  
  :wl_display_dispatch_queue();
  note right: Ожидание событий Wayland
  
  if (событие произошло?) then (да)
    
    if (xdg_surface_configure?) then (да)
      :xdg_surface_ack_configure();
      if (буфер не создан?) then (да)
        :resize_canvas();
      endif
      :draw();
    endif
    
    if (xdg_toplevel_configure?) then (да)
      if (размер изменился?) then (да)
        :resize_new(w, h);
        note right
          - Освободить старый буфер
          - Создать новый буфер
          - Обновить размеры draw_info
        end note
      endif
    endif
    
    if (xdg_toplevel_close?) then (да)
      :Установить need_close = 1;
    endif
    
    if (frame_callback?) then (да)
      :Уничтожить старый callback;
      :Создать новый callback;
      
      partition "draw()" {
        :Залочить figure_mutex;
        
        :Очистить фон (черный);
        
        :figure_draw();
        note right
          - Получить текущую фигуру
          - Нарисовать границу и заливку
          - Цвет зависит от типа фигуры
        end note
        
        :Разлочить figure_mutex;
        
        :wl_surface_attach(buffer);
        :wl_surface_damage_buffer();
        :wl_surface_commit();
      }
    endif
    
  endif
  
endwhile (нет)

:window_destroy();
:Уничтожить event queue;
:signal_thread_exit();

stop

@enduml
