core: 抽离状态描述结构并补全 state 容器接口
This commit is contained in:
153
src/core/state.h
153
src/core/state.h
@@ -3,7 +3,9 @@
|
||||
#include <stddef.h>
|
||||
|
||||
#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);
|
||||
|
||||
38
src/wm_desc.h
Normal file
38
src/wm_desc.h
Normal file
@@ -0,0 +1,38 @@
|
||||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#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;
|
||||
Reference in New Issue
Block a user