104 lines
2.9 KiB
C
104 lines
2.9 KiB
C
#pragma once
|
||
|
||
#include "wm_types.h"
|
||
|
||
typedef struct wm_window_t {
|
||
wm_window_id_t id;
|
||
wm_workspace_id_t workspace_id;
|
||
|
||
/*
|
||
* 这里只保留控制状态,不存标题、类名、实例名等展示元数据。
|
||
*/
|
||
wm_window_geometry_mode_t geometry_mode;
|
||
|
||
/*
|
||
* false: 由当前 workspace 的 layout 决定基础几何
|
||
* true : 使用 float_rect 作为基础几何
|
||
*/
|
||
bool floating;
|
||
|
||
/*
|
||
* sticky 只影响可见性,不改变 workspace 归属。
|
||
*/
|
||
bool sticky;
|
||
bool urgent;
|
||
|
||
/*
|
||
* floating 模式的基准矩形。退出 maximize/fullscreen 后可以回到这里。
|
||
*/
|
||
wm_rect_t float_rect;
|
||
|
||
/*
|
||
* 最近一次实际提交给后端的矩形。
|
||
*/
|
||
wm_rect_t frame_rect;
|
||
} wm_window_t;
|
||
|
||
typedef struct wm_workspace_t {
|
||
wm_workspace_id_t id;
|
||
|
||
/*
|
||
* 这里只保留运行状态,不存名称、bar 符号等描述信息。
|
||
*/
|
||
wm_layout_id_t layout_id;
|
||
wm_window_id_t focused_window_id;
|
||
} wm_workspace_t;
|
||
|
||
typedef struct wm_output_t {
|
||
wm_output_id_t id;
|
||
wm_rect_t geometry;
|
||
wm_rect_t workarea;
|
||
wm_workspace_id_t current_workspace_id;
|
||
} wm_output_t;
|
||
|
||
typedef struct wm_state_t {
|
||
wm_window_t *windows;
|
||
size_t window_count;
|
||
|
||
/*
|
||
* 全局 z-order,从下到上。每个受管窗口最多出现一次。
|
||
*/
|
||
wm_window_id_t *stack_order;
|
||
size_t stack_count;
|
||
|
||
wm_workspace_t *workspaces;
|
||
size_t workspace_count;
|
||
|
||
wm_output_t *outputs;
|
||
size_t output_count;
|
||
|
||
/*
|
||
* 成功提交一次状态变更后递增。
|
||
*/
|
||
uint64_t generation;
|
||
} wm_state_t;
|
||
|
||
void wm_state_init(wm_state_t *state);
|
||
void wm_state_shutdown(wm_state_t *state);
|
||
|
||
wm_window_t *wm_state_find_window(wm_state_t *state, wm_window_id_t id);
|
||
const wm_window_t *wm_state_find_window_const(const wm_state_t *state,
|
||
wm_window_id_t id);
|
||
|
||
wm_workspace_t *wm_state_find_workspace(wm_state_t *state,
|
||
wm_workspace_id_t id);
|
||
const wm_workspace_t *wm_state_find_workspace_const(const wm_state_t *state,
|
||
wm_workspace_id_t id);
|
||
|
||
wm_output_t *wm_state_find_output(wm_state_t *state, wm_output_id_t id);
|
||
const wm_output_t *wm_state_find_output_const(const wm_state_t *state,
|
||
wm_output_id_t id);
|
||
|
||
const wm_output_t *wm_state_find_output_by_point(const wm_state_t *state,
|
||
wm_point_t point);
|
||
|
||
bool wm_state_workspace_is_visible(const wm_state_t *state,
|
||
wm_workspace_id_t workspace_id);
|
||
|
||
bool wm_state_window_should_be_visible(const wm_state_t *state,
|
||
const wm_window_t *window);
|
||
|
||
bool wm_state_window_should_be_visible_on_output(const wm_state_t *state,
|
||
const wm_window_t *window,
|
||
const wm_output_t *output);
|