From 633501317235e230486051bc1f1571afb0f50b13 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Fri, 13 Mar 2026 04:26:30 +0800 Subject: [PATCH] =?UTF-8?q?core:=20=E6=8A=BD=E7=A6=BB=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0=E7=BB=93=E6=9E=84=E5=B9=B6=E8=A1=A5=E5=85=A8?= =?UTF-8?q?=20state=20=E5=AE=B9=E5=99=A8=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/state.h | 153 ++++++++++++++++++++++++++++++++++++++++++----- src/wm_desc.h | 38 ++++++++++++ 2 files changed, 175 insertions(+), 16 deletions(-) create mode 100644 src/wm_desc.h diff --git a/src/core/state.h b/src/core/state.h index f4cac41..2c3a216 100644 --- a/src/core/state.h +++ b/src/core/state.h @@ -3,7 +3,9 @@ #include #include "core/types.h" +#include "wm_desc.h" +/* 核心实体定义 */ typedef struct wm_window_t { wm_window_id_t id; wm_workspace_id_t workspace_id; @@ -19,10 +21,10 @@ typedef struct wm_window_t { wm_rect_t frame_rect; /* 当前外框矩形(由 layout 或 float_rect 解析) */ /* 元数据(核心算法不依赖,仅用于规则匹配和信息展示) */ - char *title; - char *app_id; - char *class_name; - char *instance_name; + const char *title; + const char *app_id; + const char *class_name; + const char *instance_name; bool skip_taskbar; } wm_window_t; @@ -33,39 +35,158 @@ typedef struct wm_workspace_t { wm_layout_id_t layout_id; /* 当前活动布局(可用布局列表中的一个) */ wm_window_id_t focused_window_id; - /* 可用布局列表(启动时根据配置分配,运行时固定) */ - wm_layout_id_t *available_layouts; + /* 当前 workspace 的可用布局列表 */ + const wm_layout_id_t *available_layouts; size_t layout_count; - /* 名称(核心算法不依赖,仅用于状态栏显示) */ - char *name; + /* 名称(核心算法不依赖) */ + const char *name; } wm_workspace_t; typedef struct wm_output_t { wm_output_id_t id; - bool enabled; + wm_workspace_id_t current_workspace_id; + const char *name; wm_rect_t geometry; /* 输出完整几何 */ wm_rect_t workarea; /* 可用区域(排除面板等) */ - wm_workspace_id_t current_workspace_id; } wm_output_t; +/* 全局状态容器 */ typedef struct wm_state_t { + /* 按 id 稳定引用的 workspace / output 集合 */ 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; size_t window_capacity; + /* 与 windows[] 一一对应的堆叠顺序视图,长度等于 window_count */ wm_window_id_t *stack_order; - size_t stack_count; - size_t stack_capacity; - uint64_t generation; - bool initialized; } wm_state_t; + +/* state 容器生命周期接口 */ +void wm_state_init(wm_state_t *state, const wm_output_info_t *outputs, + size_t output_count); +void wm_state_cleanup(wm_state_t *state); +/* + * 根据 workspace 描述表构建 state.workspaces[]。 + * + * workspace_id 由 state 按描述表顺序分配并保持稳定,不从 desc 中读取。 + */ +void wm_state_set_workspaces(wm_state_t *state, + const wm_workspace_desc_t *workspaces, + size_t workspace_count); + +/* + * state 持有的 workspace 集合接口 + * + * 这组接口对外只提供只读访问。 + * workspace 的运行期可变状态必须通过专门的 state 级更新接口修改。 + */ +const wm_workspace_t *wm_state_workspace_get(const wm_state_t *state, + wm_workspace_id_t id); +const wm_workspace_t *wm_state_workspace_at(const wm_state_t *state, + size_t index); +bool wm_state_workspace_cycle_layout(wm_state_t *state, + wm_workspace_id_t workspace_id); +bool wm_state_workspace_set_layout_by_index(wm_state_t *state, + wm_workspace_id_t workspace_id, + size_t index); +bool wm_state_workspace_set_layout_by_id(wm_state_t *state, + wm_workspace_id_t workspace_id, + wm_layout_id_t layout_id); +void wm_state_workspace_set_focused_window(wm_state_t *state, + wm_workspace_id_t workspace_id, + wm_window_id_t window_id); +size_t wm_state_workspace_count(const wm_state_t *state); +bool wm_state_workspace_valid(const wm_state_t *state, wm_workspace_id_t id); + +/* + * state 持有的 output 集合接口 + * + * 这组接口对外只提供只读访问。 + * output 的运行期可变状态必须通过专门的 state 级更新接口修改。 + */ +const wm_output_t *wm_state_output_get(const wm_state_t *state, + wm_output_id_t id); +const wm_output_t *wm_state_output_at(const wm_state_t *state, size_t index); +void wm_state_output_set_workarea(wm_state_t *state, wm_output_id_t output_id, + wm_rect_t workarea); +void wm_state_output_set_current_workspace(wm_state_t *state, + wm_output_id_t output_id, + wm_workspace_id_t workspace_id); +size_t wm_state_output_count(const wm_state_t *state); +bool wm_state_output_valid(const wm_state_t *state, wm_output_id_t id); + +/* + * state 持有的 window 集合接口 + * + * 这组接口负责管理 wm_state_t.windows[] 容器本身,并保持 + * stack_order[] 与 windows[] 同步。 + * 对外只提供只读访问。 + * window 的运行期可变状态必须通过专门的 state 级更新接口修改。 + */ +/* + * 添加窗口,并将其追加到 stack_order[] 顶部。 + * + * info 提供 backend 已探测到的窗口基础信息。 + * workspace 归属与其他策略相关字段由后续 wm_state_window_* 接口设置。 + */ +const wm_window_t *wm_state_window_add(wm_state_t *state, + const wm_window_info_t *info); +const wm_window_t *wm_state_window_get(const wm_state_t *state, + wm_window_id_t id); +const wm_window_t *wm_state_window_at(const wm_state_t *state, size_t index); +/* 删除窗口,并同步从 stack_order[] 中移除。 */ +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); + +/* state 持有的单个 window 状态更新接口 */ +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_fixed_size(wm_state_t *state, wm_window_id_t window_id, + bool fixed_size); +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); + +/* + * state 持有的堆叠顺序接口 + * + * stack_order[] 是全局 z-order 的唯一真相,从下到上排列。 + * 其长度恒等于 wm_state_window_count(state),因此不提供单独的 count 接口。 + */ +const wm_window_id_t *wm_state_stack_order(const wm_state_t *state); +wm_window_id_t wm_state_stack_at(const wm_state_t *state, size_t index); +bool wm_state_stack_raise(wm_state_t *state, wm_window_id_t window_id); +bool wm_state_stack_lower(wm_state_t *state, wm_window_id_t window_id); + +/* 与 min_core_draft 中的查找命名保持一致 */ +const wm_window_t *wm_state_find_window(const wm_state_t *state, + wm_window_id_t id); diff --git a/src/wm_desc.h b/src/wm_desc.h new file mode 100644 index 0000000..381edb8 --- /dev/null +++ b/src/wm_desc.h @@ -0,0 +1,38 @@ +#pragma once + +#include + +#include "core/types.h" + +typedef struct wm_output_info_t { + const char *name; + wm_rect_t geometry; +} wm_output_info_t; + +/* + * 由 backend 提供的窗口基础信息。 + * + * 这些字符串由调用方提供;state 如需长期持有,应自行复制。 + */ +typedef struct wm_window_info_t { + wm_window_id_t id; + wm_rect_t frame_rect; + + const char *title; + const char *app_id; + const char *class_name; + const char *instance_name; + + wm_window_geometry_mode_t geometry_mode; + bool urgent; + bool fixed_size; + bool skip_taskbar; +} wm_window_info_t; + +typedef struct wm_workspace_desc_t { + wm_output_id_t output_id; + const char *name; + const wm_layout_id_t *layout_ids; + size_t layout_count; + wm_layout_id_t initial_layout_id; +} wm_workspace_desc_t;