From dee0a19f349111ec21d7cf382c34d60fef031bbd Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Tue, 24 Mar 2026 23:40:46 +0800 Subject: [PATCH] =?UTF-8?q?core:=20=E7=AA=97=E5=8F=A3=E5=88=86=E5=B1=82?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E4=B8=8E=E6=8E=A5=E5=8F=A3=E8=8D=89=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/event.h | 13 +++++------- src/core/layer.h | 30 ++++++++++++++++++++++++++++ src/core/policy.h | 8 ++++++++ src/core/state.h | 22 +++++++++++++-------- src/core/window.h | 50 +++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 107 insertions(+), 16 deletions(-) create mode 100644 src/core/layer.h create mode 100644 src/core/policy.h create mode 100644 src/core/window.h diff --git a/src/core/event.h b/src/core/event.h index e3d4377..9c34e02 100644 --- a/src/core/event.h +++ b/src/core/event.h @@ -3,7 +3,7 @@ #include #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 { diff --git a/src/core/layer.h b/src/core/layer.h new file mode 100644 index 0000000..22b4341 --- /dev/null +++ b/src/core/layer.h @@ -0,0 +1,30 @@ +#pragma once + +#include + +#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); diff --git a/src/core/policy.h b/src/core/policy.h new file mode 100644 index 0000000..d63efa6 --- /dev/null +++ b/src/core/policy.h @@ -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); diff --git a/src/core/state.h b/src/core/state.h index 0bbb66a..a0a0d2c 100644 --- a/src/core/state.h +++ b/src/core/state.h @@ -2,14 +2,17 @@ #include +#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); diff --git a/src/core/window.h b/src/core/window.h new file mode 100644 index 0000000..05fdb64 --- /dev/null +++ b/src/core/window.h @@ -0,0 +1,50 @@ +#pragma once + +#include + +#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;