diff --git a/src/core/layer.c b/src/core/layer.c new file mode 100644 index 0000000..56f706e --- /dev/null +++ b/src/core/layer.c @@ -0,0 +1,88 @@ +#include "core/layer.h" + +#include + +#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; +} diff --git a/src/core/layer.h b/src/core/layer.h index 22b4341..9a6fffe 100644 --- a/src/core/layer.h +++ b/src/core/layer.h @@ -20,11 +20,41 @@ typedef struct layer_stack_t { size_t capacity; } 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_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);