core: 实现窗口分层栈维护函数
This commit is contained in:
88
src/core/layer.c
Normal file
88
src/core/layer.c
Normal 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;
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user