From 28ebb086b16a05ef684dfe7c9f326273ab9cacfd Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Thu, 23 Apr 2026 04:12:59 +0800 Subject: [PATCH] =?UTF-8?q?refactor(core/state):=20=E8=B0=83=E6=95=B4=20st?= =?UTF-8?q?ate=5Fwindow=5Fremove=20=E6=8E=A5=E5=8F=A3=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 state_window_remove 中用 array_erase 替代手写移位,并在删除窗口后将 其 transient 子窗口的 transient_for 重置为 INVALID,避免悬空引用 --- src/core/state.c | 20 +++++++++++++------- src/core/state.h | 2 +- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/core/state.c b/src/core/state.c index 769b884..53e08a3 100644 --- a/src/core/state.c +++ b/src/core/state.c @@ -386,14 +386,20 @@ void state_window_remove(state_t *state, window_id_t id) { p_delete(&window->class_name); p_delete(&window->instance_name); - for (size_t i = index + 1; i < state->window_count; i++) { - state->windows[i - 1] = state->windows[i]; + if (array_erase(state->windows, state->window_count, index)) { + window = &state->windows[state->window_count]; + p_clear(window, 1); + window->id = ZDWM_WINDOW_ID_INVALID; + window->transient_for = ZDWM_WINDOW_ID_INVALID; + window->workspace_id = ZDWM_WORKSPACE_ID_INVALID; + + for (size_t i = 0; i < state->window_count; ++i) { + window = &state->windows[i]; + if (window->transient_for != id) continue; + + window->transient_for = ZDWM_WINDOW_ID_INVALID; + } } - window = &state->windows[state->window_count - 1]; - p_clear(window, 1); - window->id = ZDWM_WINDOW_ID_INVALID; - window->workspace_id = ZDWM_WORKSPACE_ID_INVALID; - state->window_count--; layer_stack_t *layer = &state->stacks[layer_type]; if (layer) { diff --git a/src/core/state.h b/src/core/state.h index ff8d13b..a4f14f9 100644 --- a/src/core/state.h +++ b/src/core/state.h @@ -166,7 +166,7 @@ bool state_set_current_output(state_t *state, output_id_t output_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); -/* 删除窗口,并同步将其从对应的堆叠栈中移除 */ +/* 删除窗口,同步将其从对应的堆叠栈中移除,并调整对应 workspace 的焦点窗口 */ void state_window_remove(state_t *state, window_id_t id); size_t state_window_count(const state_t *state);