迁移窗口堆叠顺序到新方案(完成)
This commit is contained in:
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <zdwm/types.h>
|
||||
|
||||
#include "base/array.h"
|
||||
#include "base/log.h"
|
||||
@@ -268,19 +269,15 @@ const window_t *state_window_add(state_t *state, const window_info_t *info) {
|
||||
window_id_t id = info->id;
|
||||
window_t *window = (window_t *)state_window_get(state, id);
|
||||
if (!window) {
|
||||
size_t index = state->window_count;
|
||||
size_t old_capacity = state->window_capacity;
|
||||
window =
|
||||
array_push(state->windows, state->window_count, state->window_capacity);
|
||||
if (old_capacity != state->window_capacity) {
|
||||
p_realloc(&state->stack_order, state->window_capacity);
|
||||
}
|
||||
|
||||
layer_stack_t *layer = &state->stacks[info->layer_type];
|
||||
layer_stack_append(layer, id);
|
||||
|
||||
p_clear(window, 1);
|
||||
window->id = id;
|
||||
window->workspace_id = ZDWM_WORKSPACE_ID_INVALID;
|
||||
|
||||
state->stack_order[index] = id;
|
||||
}
|
||||
|
||||
state_window_set_geometry_mode(state, id, info->geometry_mode);
|
||||
@@ -323,6 +320,7 @@ void state_window_remove(state_t *state, window_id_t id) {
|
||||
if (!matched) return;
|
||||
|
||||
window_t *window = &state->windows[index];
|
||||
layer_type_t layer_type = window->layer;
|
||||
workspace_id_t workspace_id = window->workspace_id;
|
||||
p_delete(&window->title);
|
||||
p_delete(&window->app_id);
|
||||
@@ -336,24 +334,13 @@ void state_window_remove(state_t *state, window_id_t id) {
|
||||
p_clear(window, 1);
|
||||
window->id = ZDWM_WINDOW_ID_INVALID;
|
||||
window->workspace_id = ZDWM_WORKSPACE_ID_INVALID;
|
||||
|
||||
matched = false;
|
||||
for (size_t i = 0; i < state->window_count; i++) {
|
||||
if (state->stack_order[i] == id) {
|
||||
matched = true;
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (matched) {
|
||||
for (size_t i = index + 1; i < state->window_count; i++) {
|
||||
state->stack_order[i - 1] = state->stack_order[i];
|
||||
}
|
||||
state->stack_order[state->window_count - 1] = ZDWM_WINDOW_ID_INVALID;
|
||||
}
|
||||
|
||||
state->window_count--;
|
||||
|
||||
layer_stack_t *layer = &state->stacks[layer_type];
|
||||
if (layer) {
|
||||
layer_stack_remove(layer, id);
|
||||
}
|
||||
|
||||
workspace_t *workspace =
|
||||
(workspace_t *)state_workspace_get(state, workspace_id);
|
||||
if (workspace && workspace->focused_window_id == id) {
|
||||
@@ -487,53 +474,22 @@ bool state_window_set_instance(state_t *state, window_id_t window_id,
|
||||
return true;
|
||||
}
|
||||
|
||||
const window_id_t *state_stack_order(const state_t *state) {
|
||||
return state->stack_order;
|
||||
}
|
||||
|
||||
window_id_t state_stack_at(const state_t *state, size_t index) {
|
||||
if (index >= state->window_count) return ZDWM_WINDOW_ID_INVALID;
|
||||
return state->stack_order[index];
|
||||
}
|
||||
|
||||
bool state_stack_raise(state_t *state, window_id_t window_id) {
|
||||
bool matched = false;
|
||||
size_t index = 0;
|
||||
for (size_t i = 0; i < state->window_count; i++) {
|
||||
if (state->stack_order[i] == window_id) {
|
||||
matched = true;
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
const window_t *window = state_window_get(state, window_id);
|
||||
if (!window) return false;
|
||||
|
||||
if (!matched) return false;
|
||||
layer_stack_t *layer = &state->stacks[window->layer];
|
||||
if (!layer) return false;
|
||||
|
||||
for (size_t i = index + 1; i < state->window_count; i++) {
|
||||
state->stack_order[i - 1] = state->stack_order[i];
|
||||
}
|
||||
state->stack_order[state->window_count - 1] = window_id;
|
||||
|
||||
return true;
|
||||
return layer_stack_raise(layer, window_id);
|
||||
}
|
||||
|
||||
bool state_stack_lower(state_t *state, window_id_t window_id) {
|
||||
bool matched = false;
|
||||
size_t index = 0;
|
||||
for (size_t i = 0; i < state->window_count; i++) {
|
||||
if (state->stack_order[i] == window_id) {
|
||||
matched = true;
|
||||
index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
const window_t *window = state_window_get(state, window_id);
|
||||
if (!window) return false;
|
||||
|
||||
if (!matched) return false;
|
||||
layer_stack_t *layer = &state->stacks[window->layer];
|
||||
if (!layer) return false;
|
||||
|
||||
for (size_t i = index; i > 0; i--) {
|
||||
state->stack_order[i] = state->stack_order[i - 1];
|
||||
}
|
||||
state->stack_order[0] = window_id;
|
||||
|
||||
return true;
|
||||
return layer_stack_lower(layer, window_id);
|
||||
}
|
||||
|
||||
@@ -67,10 +67,7 @@ typedef struct state_t {
|
||||
size_t window_count;
|
||||
size_t window_capacity;
|
||||
|
||||
/* TODO: 过渡期全局 z-order 视图,后续由 layer stack 替代 */
|
||||
window_id_t *stack_order;
|
||||
|
||||
/* TODO: 分层堆叠顺序:每层内部从低到高排列 */
|
||||
/* 分层堆叠顺序:每层内部从低到高排列 */
|
||||
layer_stack_t stacks[ZDWM_WINDOW_LAYER_COUNT];
|
||||
} state_t;
|
||||
|
||||
@@ -179,14 +176,5 @@ bool state_window_set_class(state_t *state, window_id_t window_id,
|
||||
bool state_window_set_instance(state_t *state, window_id_t window_id,
|
||||
const char *instance_name);
|
||||
|
||||
/*
|
||||
* TODO: state 持有的过渡期堆叠顺序接口
|
||||
*
|
||||
* 这组接口服务于当前保留的全局 stack_order[] 视图;后续会由 layer stack
|
||||
* 取代。stack_order[] 从下到上排列,其长度恒等于 state_window_count(state),
|
||||
* 因此不提供单独的 count 接口。
|
||||
*/
|
||||
const window_id_t *state_stack_order(const state_t *state);
|
||||
window_id_t state_stack_at(const state_t *state, size_t index);
|
||||
bool state_stack_raise(state_t *state, window_id_t window_id);
|
||||
bool state_stack_lower(state_t *state, window_id_t window_id);
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
#include <stddef.h>
|
||||
|
||||
#include "base/memory.h"
|
||||
#include "core/layer.h"
|
||||
#include "core/types.h"
|
||||
|
||||
/*
|
||||
@@ -20,6 +21,7 @@ typedef struct window_info_t {
|
||||
const char *instance_name;
|
||||
|
||||
window_geometry_mode_t geometry_mode;
|
||||
layer_type_t layer_type;
|
||||
bool urgent;
|
||||
bool fixed_size;
|
||||
bool skip_taskbar;
|
||||
|
||||
Reference in New Issue
Block a user