refactor(core/state): 调整 state_window_remove 接口实现
在 state_window_remove 中用 array_erase 替代手写移位,并在删除窗口后将 其 transient 子窗口的 transient_for 重置为 INVALID,避免悬空引用
This commit is contained in:
@@ -386,14 +386,20 @@ void state_window_remove(state_t *state, window_id_t id) {
|
|||||||
p_delete(&window->class_name);
|
p_delete(&window->class_name);
|
||||||
p_delete(&window->instance_name);
|
p_delete(&window->instance_name);
|
||||||
|
|
||||||
for (size_t i = index + 1; i < state->window_count; i++) {
|
if (array_erase(state->windows, state->window_count, index)) {
|
||||||
state->windows[i - 1] = state->windows[i];
|
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];
|
layer_stack_t *layer = &state->stacks[layer_type];
|
||||||
if (layer) {
|
if (layer) {
|
||||||
|
|||||||
@@ -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_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_get(const state_t *state, window_id_t id);
|
||||||
const window_t *state_window_at(const state_t *state, size_t index);
|
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);
|
void state_window_remove(state_t *state, window_id_t id);
|
||||||
size_t state_window_count(const state_t *state);
|
size_t state_window_count(const state_t *state);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user