- 重构模块使用新的代码风格 - 老代码 (src 目录下的代码) 继续使用之前的代码风格 通过在需要不同代码风格的目录下放对应 .clang-format 配置文件实现
104 lines
2.3 KiB
C
104 lines
2.3 KiB
C
#include "core/layer.h"
|
|
|
|
#include <stddef.h>
|
|
|
|
#include "base/array.h"
|
|
#include "base/memory.h"
|
|
#include "core/types.h"
|
|
#include "core/window.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;
|
|
}
|
|
|
|
layer_type_t layer_classify(const window_layer_props_t *props) {
|
|
for (size_t i = 0; i < props->type_count; ++i) {
|
|
window_type_t type = props->types[i];
|
|
if (type == ZDWM_WINDOW_TYPE_NOTIFICATION) return ZDWM_WINDOW_LAYER_OVERLAY;
|
|
}
|
|
|
|
for (size_t i = 0; i < props->state_count; ++i) {
|
|
window_state_t state = props->states[i];
|
|
if (state == ZDWM_WINDOW_STATE_ABOVE) return ZDWM_WINDOW_LAYER_TOP;
|
|
}
|
|
|
|
return ZDWM_WINDOW_LAYER_NORMAL;
|
|
}
|