From 1d781d66e94386be8b3dc98fe20942c5765db53b Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Sun, 5 Apr 2026 23:18:59 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=81=E7=A7=BB=E7=AA=97=E5=8F=A3=E5=A0=86?= =?UTF-8?q?=E5=8F=A0=E9=A1=BA=E5=BA=8F=E5=88=B0=E6=96=B0=E6=96=B9=E6=A1=88?= =?UTF-8?q?=EF=BC=88=E5=AE=8C=E6=88=90=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/state.c | 84 +++++++++++----------------------------------- src/core/state.h | 14 +------- src/core/wm_desc.h | 2 ++ 3 files changed, 23 insertions(+), 77 deletions(-) diff --git a/src/core/state.c b/src/core/state.c index e578afc..b615743 100644 --- a/src/core/state.c +++ b/src/core/state.c @@ -2,6 +2,7 @@ #include #include +#include #include "base/array.h" #include "base/log.h" @@ -268,19 +269,15 @@ const window_t *state_window_add(state_t *state, const window_info_t *info) { window_id_t id = info->id; window_t *window = (window_t *)state_window_get(state, id); if (!window) { - size_t index = state->window_count; - size_t old_capacity = state->window_capacity; window = array_push(state->windows, state->window_count, state->window_capacity); - if (old_capacity != state->window_capacity) { - p_realloc(&state->stack_order, state->window_capacity); - } + + layer_stack_t *layer = &state->stacks[info->layer_type]; + layer_stack_append(layer, id); p_clear(window, 1); window->id = id; window->workspace_id = ZDWM_WORKSPACE_ID_INVALID; - - state->stack_order[index] = id; } state_window_set_geometry_mode(state, id, info->geometry_mode); @@ -323,6 +320,7 @@ void state_window_remove(state_t *state, window_id_t id) { if (!matched) return; window_t *window = &state->windows[index]; + layer_type_t layer_type = window->layer; workspace_id_t workspace_id = window->workspace_id; p_delete(&window->title); p_delete(&window->app_id); @@ -336,24 +334,13 @@ void state_window_remove(state_t *state, window_id_t id) { p_clear(window, 1); window->id = ZDWM_WINDOW_ID_INVALID; window->workspace_id = ZDWM_WORKSPACE_ID_INVALID; - - matched = false; - for (size_t i = 0; i < state->window_count; i++) { - if (state->stack_order[i] == id) { - matched = true; - index = i; - break; - } - } - if (matched) { - for (size_t i = index + 1; i < state->window_count; i++) { - state->stack_order[i - 1] = state->stack_order[i]; - } - state->stack_order[state->window_count - 1] = ZDWM_WINDOW_ID_INVALID; - } - state->window_count--; + layer_stack_t *layer = &state->stacks[layer_type]; + if (layer) { + layer_stack_remove(layer, id); + } + workspace_t *workspace = (workspace_t *)state_workspace_get(state, workspace_id); if (workspace && workspace->focused_window_id == id) { @@ -487,53 +474,22 @@ bool state_window_set_instance(state_t *state, window_id_t window_id, return true; } -const window_id_t *state_stack_order(const state_t *state) { - return state->stack_order; -} - -window_id_t state_stack_at(const state_t *state, size_t index) { - if (index >= state->window_count) return ZDWM_WINDOW_ID_INVALID; - return state->stack_order[index]; -} - bool state_stack_raise(state_t *state, window_id_t window_id) { - bool matched = false; - size_t index = 0; - for (size_t i = 0; i < state->window_count; i++) { - if (state->stack_order[i] == window_id) { - matched = true; - index = i; - break; - } - } + const window_t *window = state_window_get(state, window_id); + if (!window) return false; - if (!matched) return false; + layer_stack_t *layer = &state->stacks[window->layer]; + if (!layer) return false; - for (size_t i = index + 1; i < state->window_count; i++) { - state->stack_order[i - 1] = state->stack_order[i]; - } - state->stack_order[state->window_count - 1] = window_id; - - return true; + return layer_stack_raise(layer, window_id); } bool state_stack_lower(state_t *state, window_id_t window_id) { - bool matched = false; - size_t index = 0; - for (size_t i = 0; i < state->window_count; i++) { - if (state->stack_order[i] == window_id) { - matched = true; - index = i; - break; - } - } + const window_t *window = state_window_get(state, window_id); + if (!window) return false; - if (!matched) return false; + layer_stack_t *layer = &state->stacks[window->layer]; + if (!layer) return false; - for (size_t i = index; i > 0; i--) { - state->stack_order[i] = state->stack_order[i - 1]; - } - state->stack_order[0] = window_id; - - return true; + return layer_stack_lower(layer, window_id); } diff --git a/src/core/state.h b/src/core/state.h index a0a0d2c..d6b2a16 100644 --- a/src/core/state.h +++ b/src/core/state.h @@ -67,10 +67,7 @@ typedef struct state_t { size_t window_count; size_t window_capacity; - /* TODO: 过渡期全局 z-order 视图,后续由 layer stack 替代 */ - window_id_t *stack_order; - - /* TODO: 分层堆叠顺序:每层内部从低到高排列 */ + /* 分层堆叠顺序:每层内部从低到高排列 */ layer_stack_t stacks[ZDWM_WINDOW_LAYER_COUNT]; } state_t; @@ -179,14 +176,5 @@ bool state_window_set_class(state_t *state, window_id_t window_id, bool state_window_set_instance(state_t *state, window_id_t window_id, const char *instance_name); -/* - * TODO: state 持有的过渡期堆叠顺序接口 - * - * 这组接口服务于当前保留的全局 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); bool state_stack_raise(state_t *state, window_id_t window_id); bool state_stack_lower(state_t *state, window_id_t window_id); diff --git a/src/core/wm_desc.h b/src/core/wm_desc.h index b078e3f..f62fce0 100644 --- a/src/core/wm_desc.h +++ b/src/core/wm_desc.h @@ -3,6 +3,7 @@ #include #include "base/memory.h" +#include "core/layer.h" #include "core/types.h" /* @@ -20,6 +21,7 @@ typedef struct window_info_t { const char *instance_name; window_geometry_mode_t geometry_mode; + layer_type_t layer_type; bool urgent; bool fixed_size; bool skip_taskbar;