@startuml
title Обработка клавиатурного ввода

actor User
participant "Wayland Server" as Server
participant "input" as Input
participant "input-handle" as Handler
participant "wayland-runtime" as Runtime
participant "window" as Window

User -> Server: Нажатие клавиши
Server -> Input: keyboard_key(key, state)
activate Input

Input -> Input: xkb_state_key_get_one_sym()
note right: Преобразование keycode в keysym

Input -> Handler: keyboard_key_handle(kc, ks, state, window)
activate Handler

alt Клавиша Enter
  Handler -> Runtime: run_window()
  note right: Создание нового окна
else Клавиша '1'
  Handler -> Window: figure.type = CIRCLE
else Клавиша '2'
  Handler -> Window: figure.type = TRIANGLE
else Клавиша '3'
  Handler -> Window: figure.type = SQUARE
else Клавиша '-'
  Handler -> Handler: pthread_mutex_lock()
  Handler -> Window: figure.speed -= 0.5
  Handler -> Handler: Ограничить [1, 30]
  Handler -> Handler: pthread_mutex_unlock()
else Клавиша '+' или '='
  Handler -> Handler: pthread_mutex_lock()
  Handler -> Window: figure.speed += 0.5
  Handler -> Handler: Ограничить [1, 30]
  Handler -> Handler: pthread_mutex_unlock()
else Клавиша Up
  Handler -> Handler: pthread_mutex_lock()
  Handler -> Window: figure.radius += 2.0
  Handler -> Handler: Ограничить [1, max]
  Handler -> Handler: pthread_mutex_unlock()
else Клавиша Down
  Handler -> Handler: pthread_mutex_lock()
  Handler -> Window: figure.radius -= 2.0
  Handler -> Handler: Ограничить [1, max]
  Handler -> Handler: pthread_mutex_unlock()
end

deactivate Handler
deactivate Input

note over Window
  Изменения параметров фигуры
  влияют на следующий frame
  анимации и отрисовки
end note

@enduml
