core: 实现窗口分层栈维护函数

This commit is contained in:
2026-03-25 22:46:09 +08:00
parent dee0a19f34
commit 4d8092be43
2 changed files with 123 additions and 5 deletions

88
src/core/layer.c Normal file
View File

@@ -0,0 +1,88 @@
#include "core/layer.h"
#include <stddef.h>
#include "base/array.h"
#include "base/memory.h"
#include "core/types.h"
void layer_stack_cleanup(layer_stack_t *layer) {
p_delete(&layer->order);
layer->count = 0;
layer->capacity = 0;
}
void layer_stack_append(layer_stack_t *layer, window_id_t window) {
window_id_t *win_ptr =
array_push(layer->order, layer->count, layer->capacity);
*win_ptr = window;
}
bool layer_stack_remove(layer_stack_t *layer, window_id_t window) {
bool found = false;
size_t index = 0;
for (size_t i = 0; i < layer->count; ++i) {
if (layer->order[i] != window) continue;
found = true;
index = i;
break;
}
if (found) {
for (size_t i = index; i < layer->count - 1; ++i) {
layer->order[i] = layer->order[i + 1];
}
layer->count--;
}
return found;
}
bool layer_stack_raise(layer_stack_t *layer, window_id_t window) {
bool found = false;
size_t index = 0;
for (size_t i = 0; i < layer->count; ++i) {
if (layer->order[i] != window) continue;
found = true;
index = i;
break;
}
if (!found) return false;
bool need_change = index != layer->count - 1;
if (!need_change) return false;
for (size_t i = index; i < layer->count - 1; ++i) {
layer->order[i] = layer->order[i + 1];
}
layer->order[layer->count - 1] = window;
return true;
}
bool layer_stack_lower(layer_stack_t *layer, window_id_t window) {
bool found = false;
size_t index = 0;
for (size_t i = 0; i < layer->count; ++i) {
if (layer->order[i] != window) continue;
found = true;
index = i;
break;
}
if (!found) return false;
bool need_change = index != 0;
if (!need_change) return false;
for (size_t i = index; i > 0; --i) {
layer->order[i] = layer->order[i - 1];
}
layer->order[0] = window;
return true;
}

View File

@@ -20,11 +20,41 @@ typedef struct layer_stack_t {
size_t capacity; size_t capacity;
} layer_stack_t; } layer_stack_t;
void layer_stack_init(layer_stack_t *layer); /**
void layer_stack_reset(layer_stack_t *layer); * @brief 释放层栈内部资源并重置为空状态。
* @param layer 目标层栈。
*/
void layer_stack_cleanup(layer_stack_t *layer);
/**
* @brief 在该层栈顶部追加一个窗口。
* @param layer 目标层栈。
* @param window 待追加的窗口 ID。
*/
void layer_stack_append(layer_stack_t *layer, window_id_t window); 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); * @brief 删除指定窗口。
* @param layer 目标层栈。
* @param window 待删除的窗口 ID。
* @return 找到并删除窗口时返回 true否则返回 false。
*/
bool layer_stack_remove(layer_stack_t *layer, window_id_t window);
/**
* @brief 将指定窗口提升到该层栈顶。
* @param layer 目标层栈。
* @param window 待提升的窗口 ID。
* @return 仅在窗口存在且顺序发生变化时返回 true否则返回 false。
*/
bool layer_stack_raise(layer_stack_t *layer, window_id_t window);
/**
* @brief 将指定窗口下沉到该层栈底。
* @param layer 目标层栈。
* @param window 待下沉的窗口 ID。
* @return 仅在窗口存在且顺序发生变化时返回 true否则返回 false。
*/
bool layer_stack_lower(layer_stack_t *layer, window_id_t window);
layer_type_t layer_classify(const window_props_t *props); layer_type_t layer_classify(const window_props_t *props);