core: 定义按键和鼠标事件

This commit is contained in:
2026-03-16 00:03:22 +08:00
parent 58d1b09203
commit 4c96f2a1db
15 changed files with 623 additions and 362 deletions

View File

@@ -26,6 +26,9 @@ typedef struct wm_window_t {
char *app_id;
char *class_name;
char *instance_name;
// 任务栏可见性提示
bool skip_taskbar;
} wm_window_t;
typedef struct wm_workspace_t {
@@ -34,8 +37,8 @@ typedef struct wm_workspace_t {
wm_layout_id_t layout_id; // 当前活动布局(可用布局列表中的一个)
wm_window_id_t focused_window_id;
// 可用布局列表(启动时根据配置分配,运行时固定
wm_layout_id_t *available_layouts;
// 可用布局列表(启动时根据配置分配,之后固定不变
const wm_layout_id_t *available_layouts;
size_t layout_count;
// 名称(核心算法不依赖,仅用于状态栏显示)
@@ -44,23 +47,20 @@ typedef struct wm_workspace_t {
typedef struct wm_output_t {
wm_output_id_t id;
bool enabled;
wm_rect_t geometry; // 输出完整几何
wm_rect_t workarea; // 可用区域(排除面板等)
wm_rect_t geometry; // 输出完整几何bootstrap 后固定)
wm_rect_t workarea; // 可用区域排除面板等bootstrap 后固定)
wm_workspace_id_t current_workspace_id;
} wm_output_t;
// ========== 全局状态容器 ==========
typedef struct wm_state_t {
// 内部实现(不透明结构体,实现文件中定义)
// 头文件级草案当前直接公开字段,便于讨论;实现阶段可再封装
wm_workspace_t *workspaces;
size_t workspace_count;
size_t workspace_capacity;
wm_output_t *outputs;
size_t output_count;
size_t output_capacity;
wm_window_t *windows;
size_t window_count;
@@ -78,6 +78,7 @@ typedef struct wm_state_t {
// ========== API 函数 ==========
// 初始化/清理
// workspace/output 集合大小在 init 时一次性确定,之后不再变化。
void wm_state_init(wm_state_t *state,
size_t workspace_count,
size_t output_count);
@@ -89,8 +90,11 @@ wm_workspace_t *wm_state_workspace(wm_state_t *state, wm_workspace_id_t id);
wm_workspace_t *wm_state_workspace_at(wm_state_t *state, size_t index);
size_t wm_state_workspace_count(const wm_state_t *state);
bool wm_state_workspace_valid(wm_state_t *state, wm_workspace_id_t id);
void wm_state_workspace_set_focused_window(wm_state_t *state,
wm_workspace_id_t workspace_id,
wm_window_id_t window_id);
// 查询某个 output 的所有 workspace
// 查询某个 output 的所有 workspace(只读视图)
size_t wm_state_workspace_get_by_output(const wm_state_t *state,
wm_output_id_t output_id,
wm_workspace_t **out_workspaces);
@@ -98,15 +102,16 @@ size_t wm_state_workspace_get_by_output(const wm_state_t *state,
// ========== Workspace 布局操作 ==========
/*
* 设置 workspace 的可用布局列表
* 注意:应在 workspace 初始化调用运行时不应修改
* 设置 workspace 的可用布局列表
* 仅允许在 bootstrap / 初始化阶段调用运行时不应修改
*/
void wm_workspace_set_layouts(wm_workspace_t *workspace,
const wm_layout_id_t *layouts,
size_t count);
/*
* 获取 workspace 的可用布局列表
* 获取 workspace 的可用布局列表
* 该列表在 bootstrap 完成后保持不变。
*/
const wm_layout_id_t *wm_workspace_get_layouts(const wm_workspace_t *workspace,
size_t *out_count);
@@ -132,6 +137,14 @@ wm_output_t *wm_state_output(wm_state_t *state, wm_output_id_t id);
wm_output_t *wm_state_output_at(wm_state_t *state, size_t index);
size_t wm_state_output_count(const wm_state_t *state);
bool wm_state_output_valid(wm_state_t *state, wm_output_id_t id);
/*
* 切换某个 output 当前显示的 workspace。
* 这不会修改 output 集合本身,也不会改变 workspace->output_id 绑定。
* 调用方必须保证目标 workspace 固定归属于该 output。
*/
void wm_state_output_set_current_workspace(wm_state_t *state,
wm_output_id_t output_id,
wm_workspace_id_t workspace_id);
// ========== Window 操作 ==========
@@ -140,6 +153,32 @@ wm_window_t *wm_state_window_get(wm_state_t *state, wm_window_id_t id);
wm_window_t *wm_state_window_at(wm_state_t *state, size_t index);
void wm_state_window_remove(wm_state_t *state, wm_window_id_t id);
size_t wm_state_window_count(const wm_state_t *state);
void wm_state_window_set_workspace(wm_state_t *state, wm_window_id_t window_id,
wm_workspace_id_t workspace_id);
void wm_state_window_set_geometry_mode(wm_state_t *state,
wm_window_id_t window_id,
wm_window_geometry_mode_t geometry_mode);
void wm_state_window_set_floating(wm_state_t *state, wm_window_id_t window_id,
bool floating);
void wm_state_window_set_sticky(wm_state_t *state, wm_window_id_t window_id,
bool sticky);
void wm_state_window_set_urgent(wm_state_t *state, wm_window_id_t window_id,
bool urgent);
void wm_state_window_set_skip_taskbar(wm_state_t *state,
wm_window_id_t window_id,
bool skip_taskbar);
void wm_state_window_set_float_rect(wm_state_t *state, wm_window_id_t window_id,
wm_rect_t float_rect);
void wm_state_window_set_frame_rect(wm_state_t *state, wm_window_id_t window_id,
wm_rect_t frame_rect);
bool wm_state_window_set_title(wm_state_t *state, wm_window_id_t window_id,
const char *title);
bool wm_state_window_set_app_id(wm_state_t *state, wm_window_id_t window_id,
const char *app_id);
bool wm_state_window_set_class(wm_state_t *state, wm_window_id_t window_id,
const char *class_name);
bool wm_state_window_set_instance(wm_state_t *state, wm_window_id_t window_id,
const char *instance_name);
// ========== 查询辅助函数 ==========
@@ -152,9 +191,9 @@ bool wm_state_workspace_is_visible(const wm_state_t *state,
/*
* 判断窗口是否可见
* 窗口可见 iff
* 1. 窗口的 workspace 固定归属某个 output
* 2. 该 output 当前正显示这个 workspace
* 3. 窗口未最小化
* 1. 窗口是 sticky则只要求窗口未最小化
* 2. 否则,窗口的 workspace 固定归属某个 output
* 3. 且该 output 当前正显示这个 workspace
*/
bool wm_state_window_should_be_visible(const wm_state_t *state,
const wm_window_t *window);