core: 窗口分层类型与接口草案
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
#include <stdint.h>
|
||||
|
||||
#include "core/types.h"
|
||||
#include "core/wm_desc.h"
|
||||
#include "core/window.h"
|
||||
|
||||
typedef enum event_type_t {
|
||||
ZDWM_EVENT_KEY_PRESS,
|
||||
@@ -63,9 +63,9 @@ typedef struct pointer_enter_event_t {
|
||||
} pointer_enter_event_t;
|
||||
|
||||
typedef struct window_map_request_event_t {
|
||||
window_info_t info;
|
||||
window_id_t transient_for;
|
||||
bool is_dialog;
|
||||
window_id_t id;
|
||||
window_props_t props;
|
||||
window_metadata_t metadata;
|
||||
} window_map_request_event_t;
|
||||
|
||||
typedef enum window_remove_reason_t {
|
||||
@@ -88,10 +88,7 @@ typedef enum window_metadata_change_flags_t {
|
||||
typedef struct window_metadata_change_event_t {
|
||||
window_id_t window;
|
||||
uint32_t changed_fields;
|
||||
const char *title;
|
||||
const char *app_id;
|
||||
const char *class_name;
|
||||
const char *instance_name;
|
||||
window_metadata_t metadata;
|
||||
} window_metadata_change_event_t;
|
||||
|
||||
typedef enum window_hint_changed_flags_t {
|
||||
|
||||
30
src/core/layer.h
Normal file
30
src/core/layer.h
Normal file
@@ -0,0 +1,30 @@
|
||||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "core/types.h"
|
||||
#include "core/window.h"
|
||||
|
||||
/* 层级从低到高 */
|
||||
typedef enum layer_type_t {
|
||||
ZDWM_WINDOW_LAYER_DESKTOP = 0,
|
||||
ZDWM_WINDOW_LAYER_NORMAL,
|
||||
ZDWM_WINDOW_LAYER_TOP,
|
||||
ZDWM_WINDOW_LAYER_OVERLAY,
|
||||
ZDWM_WINDOW_LAYER_COUNT,
|
||||
} layer_type_t;
|
||||
|
||||
typedef struct layer_stack_t {
|
||||
window_id_t *order;
|
||||
size_t count;
|
||||
size_t capacity;
|
||||
} layer_stack_t;
|
||||
|
||||
void layer_stack_init(layer_stack_t *layer);
|
||||
void layer_stack_reset(layer_stack_t *layer);
|
||||
void layer_stack_append(layer_stack_t *layer, window_id_t window);
|
||||
void layer_stack_remove(layer_stack_t *layer, window_id_t window);
|
||||
void layer_stack_raise(layer_stack_t *layer, window_id_t window);
|
||||
void layer_stack_lower(layer_stack_t *layer, window_id_t window);
|
||||
|
||||
layer_type_t layer_classify(const window_props_t *props);
|
||||
8
src/core/policy.h
Normal file
8
src/core/policy.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
#include "core/layer.h"
|
||||
#include "core/state.h"
|
||||
#include "core/types.h"
|
||||
|
||||
layer_type_t policy_adjust_window_layer_from_transient(
|
||||
const state_t *state, window_id_t transient_for, layer_type_t base_layer);
|
||||
@@ -2,14 +2,17 @@
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "core/layer.h"
|
||||
#include "core/types.h"
|
||||
#include "core/wm_desc.h"
|
||||
|
||||
/* 核心实体定义 */
|
||||
typedef struct window_t {
|
||||
window_id_t id;
|
||||
window_id_t transient_for;
|
||||
workspace_id_t workspace_id;
|
||||
|
||||
layer_type_t layer;
|
||||
window_geometry_mode_t geometry_mode;
|
||||
bool floating;
|
||||
bool sticky;
|
||||
@@ -64,9 +67,11 @@ typedef struct state_t {
|
||||
size_t window_count;
|
||||
size_t window_capacity;
|
||||
|
||||
/* 与 windows[] 一一对应的堆叠顺序视图,长度等于 window_count */
|
||||
/* TODO: 过渡期全局 z-order 视图,后续由 layer stack 替代 */
|
||||
window_id_t *stack_order;
|
||||
|
||||
/* TODO: 分层堆叠顺序:每层内部从低到高排列 */
|
||||
layer_stack_t stacks[ZDWM_WINDOW_LAYER_COUNT];
|
||||
} state_t;
|
||||
|
||||
/*
|
||||
@@ -128,13 +133,13 @@ bool state_output_valid(const state_t *state, output_id_t id);
|
||||
/*
|
||||
* state 持有的 window 集合接口
|
||||
*
|
||||
* 这组接口负责管理 state_t.windows[] 容器本身,并保持
|
||||
* stack_order[] 与 windows[] 同步。
|
||||
* TODO: 这组接口负责管理 state_t.windows[] 容器本身,并维护当前过渡期的
|
||||
* stack_order[] 视图;后续会切换到 layer stack 为主。
|
||||
* 对外只提供只读访问。
|
||||
* window 的运行期可变状态必须通过专门的 state 级更新接口修改。
|
||||
*/
|
||||
/*
|
||||
* 添加窗口,并将其追加到 stack_order[] 顶部。
|
||||
* TODO: 添加窗口,并将其追加到当前过渡期的 stack_order[] 顶部。
|
||||
*
|
||||
* info 提供 backend 已探测到的窗口基础信息。
|
||||
* workspace 归属与其他策略相关字段由后续 state_window_* 接口设置。
|
||||
@@ -142,7 +147,7 @@ bool state_output_valid(const state_t *state, output_id_t id);
|
||||
const window_t *state_window_add(state_t *state, const window_info_t *info);
|
||||
const window_t *state_window_get(const state_t *state, window_id_t id);
|
||||
const window_t *state_window_at(const state_t *state, size_t index);
|
||||
/* 删除窗口,并同步从 stack_order[] 中移除。 */
|
||||
/* TODO: 删除窗口,并同步从当前过渡期的 stack_order[] 中移除。 */
|
||||
void state_window_remove(state_t *state, window_id_t id);
|
||||
size_t state_window_count(const state_t *state);
|
||||
|
||||
@@ -175,10 +180,11 @@ bool state_window_set_instance(state_t *state, window_id_t window_id,
|
||||
const char *instance_name);
|
||||
|
||||
/*
|
||||
* state 持有的堆叠顺序接口
|
||||
* TODO: state 持有的过渡期堆叠顺序接口
|
||||
*
|
||||
* stack_order[] 是全局 z-order 的唯一真相,从下到上排列。
|
||||
* 其长度恒等于 state_window_count(state),因此不提供单独的 count 接口。
|
||||
* 这组接口服务于当前保留的全局 stack_order[] 视图;后续会由 layer stack
|
||||
* 取代。stack_order[] 从下到上排列,其长度恒等于 state_window_count(state),
|
||||
* 因此不提供单独的 count 接口。
|
||||
*/
|
||||
const window_id_t *state_stack_order(const state_t *state);
|
||||
window_id_t state_stack_at(const state_t *state, size_t index);
|
||||
|
||||
50
src/core/window.h
Normal file
50
src/core/window.h
Normal file
@@ -0,0 +1,50 @@
|
||||
#pragma once
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "core/types.h"
|
||||
|
||||
/* Internal semantic window types mapped from backend-specific protocols. */
|
||||
typedef enum window_type_t {
|
||||
ZDWM_WINDOW_TYPE_NORMAL = 0,
|
||||
ZDWM_WINDOW_TYPE_DESKTOP,
|
||||
ZDWM_WINDOW_TYPE_DOCK,
|
||||
ZDWM_WINDOW_TYPE_TOOLBAR,
|
||||
ZDWM_WINDOW_TYPE_DIALOG,
|
||||
ZDWM_WINDOW_TYPE_UTILITY,
|
||||
ZDWM_WINDOW_TYPE_SPLASH,
|
||||
ZDWM_WINDOW_TYPE_MENU,
|
||||
ZDWM_WINDOW_TYPE_DROPDOWN_MENU,
|
||||
ZDWM_WINDOW_TYPE_POPUP_MENU,
|
||||
ZDWM_WINDOW_TYPE_TOOLTIP,
|
||||
ZDWM_WINDOW_TYPE_COMBO,
|
||||
ZDWM_WINDOW_TYPE_DND,
|
||||
ZDWM_WINDOW_TYPE_NOTIFICATION,
|
||||
} window_type_t;
|
||||
|
||||
/* Internal semantic window states mapped from backend-specific protocols. */
|
||||
typedef enum window_state_t {
|
||||
ZDWM_WINDOW_STATE_ABOVE = 0,
|
||||
ZDWM_WINDOW_STATE_FULLSCREEN,
|
||||
ZDWM_WINDOW_STATE_MODAL,
|
||||
ZDWM_WINDOW_STATE_STICKY,
|
||||
} window_state_t;
|
||||
|
||||
typedef struct window_props_t {
|
||||
window_id_t transient_for;
|
||||
|
||||
bool override_redirect;
|
||||
|
||||
window_type_t *types;
|
||||
size_t type_count;
|
||||
|
||||
window_state_t *states;
|
||||
size_t state_count;
|
||||
} window_props_t;
|
||||
|
||||
typedef struct window_metadata_t {
|
||||
const char *title;
|
||||
const char *app_id;
|
||||
const char *class_name;
|
||||
const char *instance_name;
|
||||
} window_metadata_t;
|
||||
Reference in New Issue
Block a user