Skip to content

События

Для обработки событий используется подписная модель. Контрол или пользовательский код подписывается в окне на нужные ему события и получает их. События могут быть сгенерированы системой или пользовательским кодом.

Все события проходят через окно. Для работы с ними используются следующие методы:

class window
{
public:
    ...
    std::string subscribe(std::function<void(const event&)> receive_callback, event_type event_types, std::shared_ptr<i_control> control = nullptr);
    void unsubscribe(const std::string &subscriber_id);

    void emit_event(int32_t x, int32_t y);
    ...
};

std::string subscribe(...)

Используется для получения событий от окна. Метод возвращает уникальный идентификатор подписчика который нужно передать в unsubscribe() для отписки.

  • receive_callback - функция, получающая события
  • event_types - битовая маска, указывающая какие события нужно получать
  • control - при установке данного поля будут приходить только события мыши происходящие над этим контролом и клавиатурные события если у него имеется фокус ввода. В противном случае, будут приходить все события от окна.

unsubscribe(const std::string &subscriber_id)

Предназначен для прекращения подписки на события окна

  • subscriber_id - уникальный идентификатор подписчика, выданный методом subscribe

emit_event(int32_t x, int32_t y)

Метод, генерирующий internal event. Используется пользовательским кодом для генерации собственных событий.

Типы событий

enum class event_type : uint32_t
{
    system = (1 << 0),
    mouse = (1 << 1),
    keyboard = (1 << 2),
    internal = (1 << 3),

    all = system | mouse | keyboard | internal
};

struct event
{
    event_type type;

    union
    {
        mouse_event mouse_event_;
        keyboard_event keyboard_event_;
        internal_event internal_event_;
    };
};

В зависимости от типа события берется значение из объединения event.

События мыши

enum class mouse_event_type
{
    move,
    enter,
    leave,
    right_down,
    right_up,
    center_down,
    center_up,
    left_down,
    left_up,
    left_double,
    wheel
};

struct mouse_event
{
    mouse_event_type type;

    int32_t x, y;

    int32_t wheel_delta;
};

События клавиатуры

enum class keyboard_event_type
{
    down, 
    up,
    key
};

struct keyboard_event
{
    keyboard_event_type type;

    uint8_t modifier; /// vk_capital or vk_shift or vk_alt or vk_insert
    char key[4];
    uint8_t key_size;
};

Внутренние события

enum class internal_event_type
{
    set_focus,
    remove_focus,
    execute_focused,

    size_changed,
    position_changed,

    user_emitted
};

struct internal_event
{
    internal_event_type type;
    int32_t x, y;
};