core: 定义核心事件数据模型并更新其文档

This commit is contained in:
2026-03-21 02:51:43 +08:00
parent 4c96f2a1db
commit 931dc3d8d5
22 changed files with 1204 additions and 220 deletions

View File

@@ -1,6 +1,6 @@
#pragma once
#include "wm_types.h"
#include "wm_desc.h"
/*
* wm_event_t 表示“runtime 真正关心的输入事实”:
@@ -10,17 +10,19 @@
* 的返回结果表达,而不是伪装成一个事件类型
*/
typedef enum wm_event_type_t {
// 最小核心里的快捷键只由 key press 触发,不单独暴露 key release 事件
WM_EVENT_KEY_PRESS,
// 鼠标绑定只匹配 button pressbutton release 主要供交互态结束拖拽使用
WM_EVENT_POINTER_BUTTON_PRESS,
WM_EVENT_POINTER_BUTTON_RELEASE,
WM_EVENT_POINTER_MOTION,
WM_EVENT_WINDOW_MAP_REQUEST,
WM_EVENT_WINDOW_UNMAP,
WM_EVENT_WINDOW_DESTROY,
WM_EVENT_WINDOW_REMOVE,
WM_EVENT_WINDOW_METADATA_CHANGED,
WM_EVENT_WINDOW_HINTS_CHANGED,
WM_EVENT_WINDOW_ACTIVATE_REQUEST,
WM_EVENT_WINDOW_STATE_REQUEST,
WM_EVENT_CONFIGURE_REQUEST,
WM_EVENT_TIMER_TICK,
WM_EVENT_STATUS_TICK,
} wm_event_type_t;
typedef struct wm_key_press_event_t {
@@ -63,16 +65,27 @@ typedef struct wm_pointer_motion_event_t {
} wm_pointer_motion_event_t;
typedef struct wm_window_map_request_event_t {
wm_window_id_t window;
wm_window_info_t info;
// 仅用于 manage 路由判断,不进入持久 state
wm_window_id_t transient_for;
// 仅用于 manage 路由判断,不进入持久 state
bool is_dialog;
} wm_window_map_request_event_t;
typedef struct wm_window_unmap_event_t {
wm_window_id_t window;
} wm_window_unmap_event_t;
/*
* 归一化后的窗口移除事件。
* backend 把 withdraw / destroy 这类平台差异折叠成单一 remove 事件,
* core 只按 reason 区分“为何离开 managed 集合”。
*/
typedef enum wm_window_remove_reason_t {
WM_WINDOW_REMOVE_WITHDRAWN,
WM_WINDOW_REMOVE_DESTROY,
} wm_window_remove_reason_t;
typedef struct wm_window_destroy_event_t {
typedef struct wm_window_remove_event_t {
wm_window_id_t window;
} wm_window_destroy_event_t;
wm_window_remove_reason_t reason;
} wm_window_remove_event_t;
typedef enum wm_window_meta_changed_flags_t {
WM_WINDOW_META_CHANGED_NONE = 0,
@@ -97,19 +110,91 @@ typedef struct wm_window_metadata_changed_event_t {
const char *instance_name;
} wm_window_metadata_changed_event_t;
typedef enum wm_window_hint_changed_flags_t {
WM_WINDOW_HINT_CHANGED_NONE = 0,
WM_WINDOW_HINT_CHANGED_URGENT = 1u << 0,
WM_WINDOW_HINT_CHANGED_FIXED_SIZE = 1u << 1,
WM_WINDOW_HINT_CHANGED_SKIP_TASKBAR = 1u << 2,
} wm_window_hint_changed_flags_t;
/*
* 客户端属性 / hint 变化的归一化结果。
* 这类事件不是控制请求,不经过 command 路由;
* runtime 直接把结果同步到 wm_window_t 中的 hint/capability 字段。
*/
typedef struct wm_window_hints_changed_event_t {
wm_window_id_t window;
uint32_t changed_fields;
bool urgent;
bool fixed_size;
bool skip_taskbar;
} wm_window_hints_changed_event_t;
/*
* 归一化后的窗口激活请求来源。
* 取值对齐 EWMH _NET_ACTIVE_WINDOW 的 source indication
* - 0: 旧客户端 / 未指明来源
* - 1: 应用自身发起
* - 2: pager / taskbar / window switcher 发起
*/
typedef enum wm_window_activation_source_t {
WM_WINDOW_ACTIVATION_SOURCE_LEGACY = 0,
WM_WINDOW_ACTIVATION_SOURCE_APPLICATION = 1,
WM_WINDOW_ACTIVATION_SOURCE_PAGER = 2,
} wm_window_activation_source_t;
typedef struct wm_window_activate_request_event_t {
wm_window_id_t window;
wm_window_activation_source_t source;
} wm_window_activate_request_event_t;
/*
* 归一化后的窗口模式切换请求。
* backend 保留 add/remove/toggle 这类原始协议语义;
* route_event() 再结合当前 wm_state_t 翻译成最终的 SET_* 命令。
*/
typedef enum wm_window_state_request_kind_t {
WM_WINDOW_STATE_REQUEST_FULLSCREEN,
WM_WINDOW_STATE_REQUEST_MAXIMIZED,
WM_WINDOW_STATE_REQUEST_MINIMIZED,
} wm_window_state_request_kind_t;
typedef enum wm_window_state_request_action_t {
WM_WINDOW_STATE_REQUEST_ACTION_ADD,
WM_WINDOW_STATE_REQUEST_ACTION_REMOVE,
WM_WINDOW_STATE_REQUEST_ACTION_TOGGLE,
} wm_window_state_request_action_t;
typedef struct wm_window_state_request_event_t {
wm_window_id_t window;
wm_window_state_request_kind_t kind;
wm_window_state_request_action_t action;
} wm_window_state_request_event_t;
typedef enum wm_configure_request_field_t {
WM_CONFIGURE_REQUEST_FIELD_NONE = 0,
WM_CONFIGURE_REQUEST_FIELD_X = 1u << 0,
WM_CONFIGURE_REQUEST_FIELD_Y = 1u << 1,
WM_CONFIGURE_REQUEST_FIELD_WIDTH = 1u << 2,
WM_CONFIGURE_REQUEST_FIELD_HEIGHT = 1u << 3,
} wm_configure_request_field_t;
/*
* 归一化后的窗口配置请求。
* 这类事件只表达稀疏几何请求,不承载 fullscreen/maximize/minimize
* 之类窗口模式切换;后者应进入独立的 state request event。
*
* x / y / width / height 中只有 changed_fields 指示的成员才有意义。
*/
typedef struct wm_configure_request_event_t {
wm_window_id_t window;
wm_rect_t requested_rect;
uint32_t changed_fields;
int32_t x;
int32_t y;
int32_t width;
int32_t height;
} wm_configure_request_event_t;
typedef struct wm_timer_tick_event_t {
wm_time_ms_t now_ms;
} wm_timer_tick_event_t;
typedef struct wm_status_tick_event_t {
wm_time_ms_t now_ms;
} wm_status_tick_event_t;
typedef struct wm_event_t {
wm_event_type_t type;
// backend 归一化后的事件时间值(毫秒),不是 wall-clock 时间戳
@@ -120,11 +205,11 @@ typedef struct wm_event_t {
wm_pointer_button_event_t pointer_button_release;
wm_pointer_motion_event_t pointer_motion;
wm_window_map_request_event_t window_map_request;
wm_window_unmap_event_t window_unmap;
wm_window_destroy_event_t window_destroy;
wm_window_remove_event_t window_remove;
wm_window_metadata_changed_event_t window_metadata_changed;
wm_window_hints_changed_event_t window_hints_changed;
wm_window_activate_request_event_t window_activate_request;
wm_window_state_request_event_t window_state_request;
wm_configure_request_event_t configure_request;
wm_timer_tick_event_t timer_tick;
wm_status_tick_event_t status_tick;
} data;
} wm_event_t;