@startuml title Структура классов проекта Wayland class wayland_runtime { + init_wayland() : int32_t + run_window() : int32_t + wait_for_windows() : void + destroy_wayland() : void + get_window_by_surface(surf) : wayland_window* -- - g_display : wl_display* - g_slots[MAX_WINDOW_THREADS] : window_thread_slot - g_thread_lock : pthread_mutex_t - g_active_threads : atomic_int - g_shutdown : atomic_bool } class window_thread_slot { + thread : pthread_t + aux_thread : pthread_t + active : int + queue : wl_event_queue* + window : wayland_window } class wayland_window { + id : int + wl_surface : wl_surface* + xdg_surface : xdg_surface* + xdg_toplevel : xdg_toplevel* + buffer : wl_buffer* + frame_callback : wl_callback* + queue : wl_event_queue* + need_close : int + draw_info : window_draw_info -- + window_init(display, queue) : int + window_destroy() : void + window_should_close() : int } class window_draw_info { + width : uint32_t + height : uint32_t + data : void* + figure : figure_animation_info + figure_mutex : pthread_mutex_t } class figure_animation_info { + type : figure_type + position : vec2 + velocity : vec2 + angle : float + angular_velocity : float + speed : float + radius : float } enum figure_type { FIGURE_CIRCLE = 0 FIGURE_TRIANGLE = 1 FIGURE_SQUARE = 2 } class registry { + registry_global_bind(display) : int + registry_global_unbind() : void + registry_get_compositor() : wl_compositor* + registry_get_shm() : wl_shm* + registry_get_xdg_wm_base() : xdg_wm_base* -- - global_compositor : wl_compositor* - global_shm : wl_shm* - global_wm_base : xdg_wm_base* - global_registry : wl_registry* - global_thread : pthread_t - global_thread_running : atomic_int } class input { + input_register_seat(seat) : void + input_cleanup() : void -- - seat : wl_seat* - keyboard : wl_keyboard* - xkb_ctx : xkb_context* - xkb_keymap : xkb_keymap* - xkb_state : xkb_state* - focused_window : wayland_window* } class input_handle { + keyboard_key_handle(kc, ks, state, window) : void } class figure_animate <> { + figure_animation_step(draw_info) : void + place_points_on_circle(...) : void -- - figure_handle_collision(draw_info) : void - check_collision_mask(...) : uint64_t - sincos_f32_rbp(angle) : (sin, cos) } class figure_draw { + figure_draw(draw_info, thickness, border_color, fill_color) : void } wayland_runtime "1" *-- "0..128" window_thread_slot window_thread_slot "1" *-- "1" wayland_window wayland_window "1" *-- "1" window_draw_info window_draw_info "1" *-- "1" figure_animation_info figure_animation_info --> figure_type wayland_runtime ..> registry : uses wayland_runtime ..> input : uses wayland_window ..> registry : uses wayland_window ..> figure_draw : uses input ..> input_handle : uses input --> wayland_window : focuses window_thread_slot ..> figure_animate : uses (aux_thread) figure_draw ..> figure_animate : uses @enduml