style: 更新 .clang-format 规则并重新格式化所有源文件

- 重构模块使用新的代码风格
- 老代码 (src 目录下的代码) 继续使用之前的代码风格

通过在需要不同代码风格的目录下放对应 .clang-format 配置文件实现
This commit is contained in:
2026-04-14 01:52:53 +08:00
parent 7b5404e8e0
commit 2fc4b33359
62 changed files with 1248 additions and 728 deletions

1
src/core/.clang-format Symbolic link
View File

@@ -0,0 +1 @@
../../.clang-format

View File

@@ -32,5 +32,8 @@ void backend_detect_destroy(backend_detect_t *detect);
* 无需 cleanup 的状态,调用方可以直接退出循环。
*/
bool backend_next_event(backend_t *backend, event_t *event);
bool backend_apply_effect(backend_t *backend, const effect_t *effects,
size_t effect_count);
bool backend_apply_effect(
backend_t *backend,
const effect_t *effects,
size_t effect_count
);

View File

@@ -13,11 +13,11 @@ void command_buffer_reset(command_buffer_t *buffer) {
void command_buffer_cleanup(command_buffer_t *buffer) {
p_delete(&buffer->items);
buffer->count = 0;
buffer->count = 0;
buffer->capacity = 0;
}
void command_buffer_push(command_buffer_t *buffer, const command_t *command) {
command_t *cmd = array_push(buffer->items, buffer->count, buffer->capacity);
*cmd = *command;
*cmd = *command;
}

View File

@@ -25,15 +25,15 @@ void event_cleanup(event_t *event) {
if (!event) return;
switch (event->type) {
case ZDWM_EVENT_WINDOW_MAP_REQUEST:
window_layer_props_cleanup(&event->as.window_map_request.props);
window_metadata_cleanup(&event->as.window_map_request.metadata);
break;
case ZDWM_EVENT_WINDOW_METADATA_CHANGED:
window_metadata_cleanup(&event->as.window_metadata_change.metadata);
break;
default:
break;
case ZDWM_EVENT_WINDOW_MAP_REQUEST:
window_layer_props_cleanup(&event->as.window_map_request.props);
window_metadata_cleanup(&event->as.window_map_request.metadata);
break;
case ZDWM_EVENT_WINDOW_METADATA_CHANGED:
window_metadata_cleanup(&event->as.window_metadata_change.metadata);
break;
default:
break;
}
}

View File

@@ -22,8 +22,8 @@ typedef enum event_type_t {
typedef enum modifier_bit_t {
ZDWM_MOD_SHIFT = 1u << 0,
ZDWM_MOD_CTRL = 1u << 1,
ZDWM_MOD_ALT = 1u << 2,
ZDWM_MOD_CTRL = 1u << 1,
ZDWM_MOD_ALT = 1u << 2,
ZDWM_MOD_SUPER = 1u << 3,
} modifier_bit_t;
@@ -87,10 +87,10 @@ typedef struct window_remove_event_t {
} window_remove_event_t;
typedef enum window_metadata_change_flags_t {
ZDWM_WINDOW_METADATA_CHANGE_TITLE = 1u << 0,
ZDWM_WINDOW_METADATA_CHANGE_APP_ID = 1u << 1,
ZDWM_WINDOW_METADATA_CHANGE_ROLE = 1u << 2,
ZDWM_WINDOW_METADATA_CHANGE_CLASS = 1u << 3,
ZDWM_WINDOW_METADATA_CHANGE_TITLE = 1u << 0,
ZDWM_WINDOW_METADATA_CHANGE_APP_ID = 1u << 1,
ZDWM_WINDOW_METADATA_CHANGE_ROLE = 1u << 2,
ZDWM_WINDOW_METADATA_CHANGE_CLASS = 1u << 3,
ZDWM_WINDOW_METADATA_CHANGE_INSTANCE = 1u << 4,
} window_metadata_change_flags_t;
@@ -101,9 +101,9 @@ typedef struct window_metadata_change_event_t {
} window_metadata_change_event_t;
typedef enum window_hint_changed_flags_t {
ZDWM_WINDOW_HINT_CHANGED_NONE = 0,
ZDWM_WINDOW_HINT_CHANGED_URGENT = 1u << 0,
ZDWM_WINDOW_HINT_CHANGED_FIXED_SIZE = 1u << 1,
ZDWM_WINDOW_HINT_CHANGED_NONE = 0,
ZDWM_WINDOW_HINT_CHANGED_URGENT = 1u << 0,
ZDWM_WINDOW_HINT_CHANGED_FIXED_SIZE = 1u << 1,
ZDWM_WINDOW_HINT_CHANGED_SKIP_TASKBAR = 1u << 2,
} window_hint_changed_flags_t;
@@ -116,9 +116,9 @@ typedef struct window_hints_changed_event_t {
} window_hints_changed_event_t;
typedef enum window_activation_source_t {
ZDWM_WINDOW_ACTIVATION_SOURCE_LEGACY = 0,
ZDWM_WINDOW_ACTIVATION_SOURCE_LEGACY = 0,
ZDWM_WINDOW_ACTIVATION_SOURCE_APPLICATION = 1,
ZDWM_WINDOW_ACTIVATION_SOURCE_PAGER = 2,
ZDWM_WINDOW_ACTIVATION_SOURCE_PAGER = 2,
} window_activation_source_t;
typedef struct window_activate_request_event_t {
@@ -145,10 +145,10 @@ typedef struct window_state_request_event_t {
} window_state_request_event_t;
typedef enum configure_request_field_t {
ZDWM_CONFIGURE_REQUEST_FIELD_NONE = 0,
ZDWM_CONFIGURE_REQUEST_FIELD_X = 1u << 0,
ZDWM_CONFIGURE_REQUEST_FIELD_Y = 1u << 1,
ZDWM_CONFIGURE_REQUEST_FIELD_WIDTH = 1u << 2,
ZDWM_CONFIGURE_REQUEST_FIELD_NONE = 0,
ZDWM_CONFIGURE_REQUEST_FIELD_X = 1u << 0,
ZDWM_CONFIGURE_REQUEST_FIELD_Y = 1u << 1,
ZDWM_CONFIGURE_REQUEST_FIELD_WIDTH = 1u << 2,
ZDWM_CONFIGURE_REQUEST_FIELD_HEIGHT = 1u << 3,
} configure_request_field_t;

View File

@@ -9,7 +9,7 @@
void layer_stack_cleanup(layer_stack_t *layer) {
p_delete(&layer->order);
layer->count = 0;
layer->count = 0;
layer->capacity = 0;
}
@@ -20,7 +20,7 @@ void layer_stack_append(layer_stack_t *layer, window_id_t window) {
}
bool layer_stack_remove(layer_stack_t *layer, window_id_t window) {
bool found = false;
bool found = false;
size_t index = 0;
for (size_t i = 0; i < layer->count; ++i) {
if (layer->order[i] != window) continue;
@@ -41,7 +41,7 @@ bool layer_stack_remove(layer_stack_t *layer, window_id_t window) {
}
bool layer_stack_raise(layer_stack_t *layer, window_id_t window) {
bool found = false;
bool found = false;
size_t index = 0;
for (size_t i = 0; i < layer->count; ++i) {
if (layer->order[i] != window) continue;
@@ -65,7 +65,7 @@ bool layer_stack_raise(layer_stack_t *layer, window_id_t window) {
}
bool layer_stack_lower(layer_stack_t *layer, window_id_t window) {
bool found = false;
bool found = false;
size_t index = 0;
for (size_t i = 0; i < layer->count; ++i) {
if (layer->order[i] != window) continue;

View File

@@ -10,7 +10,7 @@
void layout_result_cleanup(layout_result_t *result) {
p_delete(&result->items);
result->item_count = 0;
result->item_count = 0;
result->item_capacity = 0;
}
@@ -31,19 +31,19 @@ void layout_registry_cleanup(layout_registry_t *registry) {
}
p_delete(&registry->slots);
registry->slot_count = 0;
registry->slot_count = 0;
registry->slot_capacity = 0;
}
bool layout_registry_move(layout_registry_t *src, layout_registry_t *dest) {
if (!src || !dest) return false;
dest->slots = src->slots;
dest->slot_count = src->slot_count;
dest->slots = src->slots;
dest->slot_count = src->slot_count;
dest->slot_capacity = src->slot_capacity;
src->slots = nullptr;
src->slot_count = 0;
src->slots = nullptr;
src->slot_count = 0;
src->slot_capacity = 0;
return true;
@@ -53,25 +53,29 @@ size_t layout_registry_count(const layout_registry_t *registry) {
return registry->slot_count;
}
const layout_slot_t *layout_registry_at(const layout_registry_t *registry,
size_t index) {
const layout_slot_t *
layout_registry_at(const layout_registry_t *registry, size_t index) {
if (index >= registry->slot_count) return nullptr;
return &registry->slots[index];
}
layout_id_t layout_register(layout_registry_t *registry, const char *name,
const char *symbol, const char *description,
layout_fn fn) {
layout_id_t layout_register(
layout_registry_t *registry,
const char *name,
const char *symbol,
const char *description,
layout_fn fn
) {
if (!name || !symbol) return ZDWM_LAYOUT_ID_INVALID;
layout_id_t id = (layout_id_t)registry->slot_count;
layout_slot_t *r =
array_push(registry->slots, registry->slot_count, registry->slot_capacity);
r->id = id;
r->name = p_strdup(name);
r->symbol = p_strdup(symbol);
r->id = id;
r->name = p_strdup(name);
r->symbol = p_strdup(symbol);
r->description = p_strdup_nullable(description);
r->fn = fn;
r->fn = fn;
return r->id;
}
@@ -82,8 +86,8 @@ layout_fn layout_get(const layout_registry_t *registry, layout_id_t id) {
return nullptr;
}
const layout_slot_t *layout_slot_get(const layout_registry_t *registry,
layout_id_t id) {
const layout_slot_t *
layout_slot_get(const layout_registry_t *registry, layout_id_t id) {
if (id >= registry->slot_count) return nullptr;
return &registry->slots[id];
}

View File

@@ -54,8 +54,8 @@ void layout_result_push(layout_result_t *result, layout_item_t item);
void layout_registry_cleanup(layout_registry_t *registry);
bool layout_registry_move(layout_registry_t *src, layout_registry_t *dest);
size_t layout_registry_count(const layout_registry_t *registry);
const layout_slot_t *layout_registry_at(const layout_registry_t *registry,
size_t index);
const layout_slot_t *
layout_registry_at(const layout_registry_t *registry, size_t index);
/*
* 注册一个布局并返回其稳定 ID。
@@ -75,9 +75,13 @@ const layout_slot_t *layout_registry_at(const layout_registry_t *registry,
*
* 注册成功后,布局 ID 与其在 registry 中的槽位索引保持一致。
*/
layout_id_t layout_register(layout_registry_t *registry, const char *name,
const char *symbol, const char *description,
layout_fn fn);
layout_id_t layout_register(
layout_registry_t *registry,
const char *name,
const char *symbol,
const char *description,
layout_fn fn
);
/*
* 获取可执行的布局函数。
*
@@ -87,5 +91,5 @@ layout_id_t layout_register(layout_registry_t *registry, const char *name,
* - slot 存在,但 fn == NULL表示 floating 布局)
*/
layout_fn layout_get(const layout_registry_t *registry, layout_id_t id);
const layout_slot_t *layout_slot_get(const layout_registry_t *registry,
layout_id_t id);
const layout_slot_t *
layout_slot_get(const layout_registry_t *registry, layout_id_t id);

View File

@@ -12,11 +12,11 @@ void plan_reset(plan_t *plan) {
void plan_cleanup(plan_t *plan) {
p_delete(&plan->effects);
plan->count = 0;
plan->count = 0;
plan->capacity = 0;
}
void plan_push_effect(plan_t *plan, const effect_t *effect) {
effect_t *eft = array_push(plan->effects, plan->count, plan->capacity);
*eft = *effect;
*eft = *effect;
}

View File

@@ -8,7 +8,7 @@
typedef uint32_t dirty_mask_t;
typedef enum dirty_flags_t : dirty_mask_t {
ZDWM_DIRTY_NONE = 0,
ZDWM_DIRTY_NONE = 0,
ZDWM_DIRTY_LAYOUT = 1u << 0,
} dirty_flags_t;

View File

@@ -16,9 +16,12 @@ static workspace_id_t derive_window_workspace(const state_t *state) {
return state->outputs[state->current_output_index].current_workspace_id;
}
static bool route_map_request(const state_t *state, const rules_t *rules,
const window_map_request_event_t *e,
command_buffer_t *out) {
static bool route_map_request(
const state_t *state,
const rules_t *rules,
const window_map_request_event_t *e,
command_buffer_t *out
) {
if (state_window_get(state, e->window)) return false;
layer_type_t layer_type = layer_classify(&e->props);
@@ -28,29 +31,27 @@ static bool route_map_request(const state_t *state, const rules_t *rules,
}
command_t cmd = {
.type = ZDWM_COMMAND_MANAGE_WINDOW,
.as.manage_window =
{
.workspace = derive_window_workspace(state),
.info =
{
.id = e->window,
.transient_for = e->transient_for,
.frame_rect = e->rect,
.type = ZDWM_COMMAND_MANAGE_WINDOW,
.as.manage_window = {
.workspace = derive_window_workspace(state),
.info = {
.id = e->window,
.transient_for = e->transient_for,
.frame_rect = e->rect,
.title = e->metadata.title,
.app_id = e->metadata.app_id,
.role = e->metadata.role,
.class_name = e->metadata.class_name,
.instance_name = e->metadata.instance_name,
.title = e->metadata.title,
.app_id = e->metadata.app_id,
.role = e->metadata.role,
.class_name = e->metadata.class_name,
.instance_name = e->metadata.instance_name,
.geometry_mode = e->geometry_mode,
.layer_type = layer_type,
.urgent = e->urgent,
.fixed_size = e->fixed_size,
.skip_taskbar = e->skip_taskbar,
},
.geometry_mode = e->geometry_mode,
.layer_type = layer_type,
.urgent = e->urgent,
.fixed_size = e->fixed_size,
.skip_taskbar = e->skip_taskbar,
},
},
};
rule_action_t action = {.workspace = ZDWM_WORKSPACE_ID_INVALID};
@@ -73,17 +74,16 @@ static bool route_map_request(const state_t *state, const rules_t *rules,
command_buffer_push(out, &cmd);
if (have_rule_match && action.switch_to_workspace) {
workspace_id_t workspace_id = cmd.as.manage_window.workspace;
workspace_id_t workspace_id = cmd.as.manage_window.workspace;
const workspace_t *workspace = state_workspace_get(state, workspace_id);
if (workspace) {
command_t switch_workspace_cmd = {
.type = ZDWM_COMMAND_SWITCH_WORKSPACE,
.as.switch_workspace =
{
.output = workspace->output_id,
.workspace = workspace_id,
},
.type = ZDWM_COMMAND_SWITCH_WORKSPACE,
.as.switch_workspace = {
.output = workspace->output_id,
.workspace = workspace_id,
},
};
command_buffer_push(out, &switch_workspace_cmd);
@@ -95,17 +95,23 @@ static bool route_map_request(const state_t *state, const rules_t *rules,
bool policy_route_event(const policy_context_t *ctx, command_buffer_t *out) {
switch (ctx->event->type) {
case ZDWM_EVENT_WINDOW_MAP_REQUEST:
return route_map_request(ctx->state, ctx->rules,
&ctx->event->as.window_map_request, out);
default:
return false;
case ZDWM_EVENT_WINDOW_MAP_REQUEST:
return route_map_request(
ctx->state,
ctx->rules,
&ctx->event->as.window_map_request,
out
);
default:
return false;
}
}
bool policy_apply_command(const policy_context_t *ctx,
const command_buffer_t *command_buffer,
plan_t *plan) {
bool policy_apply_command(
const policy_context_t *ctx,
const command_buffer_t *command_buffer,
plan_t *plan
) {
/* TODO: */
return true;
}

View File

@@ -13,5 +13,8 @@ typedef struct policy_context_t {
} policy_context_t;
bool policy_route_event(const policy_context_t *ctx, command_buffer_t *out);
bool policy_apply_command(const policy_context_t *ctx,
const command_buffer_t *command_buffer, plan_t *plan);
bool policy_apply_command(
const policy_context_t *ctx,
const command_buffer_t *command_buffer,
plan_t *plan
);

View File

@@ -10,12 +10,12 @@
bool rules_move(rules_t *src, rules_t *dest) {
if (!dest || !src) return false;
dest->items = src->items;
dest->count = src->count;
dest->items = src->items;
dest->count = src->count;
dest->capacity = src->capacity;
src->items = nullptr;
src->count = 0;
src->items = nullptr;
src->count = 0;
src->capacity = 0;
return true;
@@ -23,7 +23,7 @@ bool rules_move(rules_t *src, rules_t *dest) {
void rules_cleanup(rules_t *rules) {
for (size_t i = 0; i < rules->count; ++i) {
rule_match_t *match = &rules->items[i].match;
rule_match_t *match = &rules->items[i].match;
rule_action_t *action = &rules->items[i].action;
p_delete(&match->app_id);
@@ -37,15 +37,15 @@ void rules_cleanup(rules_t *rules) {
p_delete(&rules->items);
rules->capacity = 0;
rules->count = 0;
rules->count = 0;
}
static inline bool str_match(const char *pattern, const char *value) {
return !pattern || (value && strcmp(pattern, value) == 0);
}
static bool rule_match_window(const rule_match_t *match,
const window_metadata_t *meta) {
static bool
rule_match_window(const rule_match_t *match, const window_metadata_t *meta) {
return str_match(match->app_id, meta->app_id) &&
str_match(match->role, meta->role) &&
str_match(match->class_name, meta->class_name) &&
@@ -59,13 +59,16 @@ static void rule_action_merge(const rule_action_t *src, rule_action_t *dest) {
dest->workspace = src->workspace;
}
dest->switch_to_workspace |= src->switch_to_workspace;
dest->fullscreen |= src->fullscreen;
dest->maximize |= src->maximize;
dest->floating |= src->floating;
dest->fullscreen |= src->fullscreen;
dest->maximize |= src->maximize;
dest->floating |= src->floating;
}
bool rules_resolve(const rules_t *rules, const window_metadata_t *metadata,
rule_action_t *action_out) {
bool rules_resolve(
const rules_t *rules,
const window_metadata_t *metadata,
rule_action_t *action_out
) {
if (!action_out) return false;
bool matched = false;

View File

@@ -19,5 +19,8 @@ typedef struct rules_t {
bool rules_move(rules_t *src, rules_t *dest);
void rules_cleanup(rules_t *rules);
bool rules_resolve(const rules_t *rules, const window_metadata_t *metadata,
rule_action_t *action_out);
bool rules_resolve(
const rules_t *rules,
const window_metadata_t *metadata,
rule_action_t *action_out
);

View File

@@ -14,7 +14,9 @@
#include "core/wm_desc.h"
static bool runtime_workspace_desc_has_valid_layouts(
const layout_registry_t *layouts, const workspace_desc_t *workspace) {
const layout_registry_t *layouts,
const workspace_desc_t *workspace
) {
if (!layouts || !workspace) return false;
for (size_t i = 0; i < workspace->layout_count; i++) {
@@ -50,14 +52,19 @@ bool runtime_init(runtime_t *runtime, runtime_init_desc_t *desc) {
layout_registry_move(&desc->layouts, &runtime->layouts);
rules_move(&desc->rules, &runtime->rules);
runtime->config_module_handle = desc->config_module_handle;
desc->backend = nullptr;
desc->config_module_handle = nullptr;
desc->backend = nullptr;
desc->config_module_handle = nullptr;
state_init(&runtime->state, desc->outputs, desc->output_count,
desc->workspaces, desc->workspace_count);
state_init(
&runtime->state,
desc->outputs,
desc->output_count,
desc->workspaces,
desc->workspace_count
);
workspace_desc_list_cleanup(&desc->workspaces, &desc->workspace_count);
desc->outputs = nullptr;
desc->outputs = nullptr;
desc->output_count = 0;
return true;
@@ -77,7 +84,7 @@ void runtime_init_desc_cleanup(runtime_init_desc_t *desc) {
}
workspace_desc_list_cleanup(&desc->workspaces, &desc->workspace_count);
desc->outputs = nullptr;
desc->outputs = nullptr;
desc->output_count = 0;
if (desc->config_module_handle) dlclose(desc->config_module_handle);
desc->config_module_handle = nullptr;
@@ -99,9 +106,9 @@ void runtime_shutdown(runtime_t *runtime) {
void runtime_run(runtime_t *runtime) {
runtime->running = true;
backend_t *backend = runtime->backend;
backend_t *backend = runtime->backend;
command_buffer_t *command_buffer = &runtime->command_buffer;
plan_t *plan = &runtime->plan;
plan_t *plan = &runtime->plan;
while (runtime->running) {
event_t event = {0};

View File

@@ -13,21 +13,25 @@
#include "core/types.h"
#include "core/wm_desc.h"
void state_init(state_t *state, const output_info_t *outputs,
size_t output_count, const workspace_desc_t *workspaces,
size_t workspace_count) {
void state_init(
state_t *state,
const output_info_t *outputs,
size_t output_count,
const workspace_desc_t *workspaces,
size_t workspace_count
) {
p_clear(state, 1);
state->outputs = p_new(output_t, output_count);
for (size_t i = 0; i < output_count; i++) {
const output_info_t *output_info = &outputs[i];
output_t *output = &state->outputs[i];
output_t *output = &state->outputs[i];
output->id = (output_id_t)i;
output->id = (output_id_t)i;
output->current_workspace_id = ZDWM_WORKSPACE_ID_INVALID;
output->name = p_strdup_nullable(output_info->name);
output->geometry = output_info->geometry;
output->workarea = output_info->geometry;
output->name = p_strdup_nullable(output_info->name);
output->geometry = output_info->geometry;
output->workarea = output_info->geometry;
}
state->output_count = output_count;
@@ -38,16 +42,16 @@ void state_init(state_t *state, const output_info_t *outputs,
fatal("workspace desc at index %zu invalid", i);
}
output_t *output = &state->outputs[workspace_desc->output_index];
output_t *output = &state->outputs[workspace_desc->output_index];
workspace_t *workspace = &state->workspaces[i];
workspace->id = (workspace_id_t)i;
workspace->output_id = output->id;
workspace->id = (workspace_id_t)i;
workspace->output_id = output->id;
workspace->focused_window_id = ZDWM_WINDOW_ID_INVALID;
workspace->available_layouts =
p_copy(workspace_desc->layout_ids, workspace_desc->layout_count);
workspace->layout_id = workspace_desc->initial_layout_id;
workspace->layout_id = workspace_desc->initial_layout_id;
workspace->layout_count = workspace_desc->layout_count;
workspace->name = p_strdup(workspace_desc->name);
workspace->name = p_strdup(workspace_desc->name);
if (output->current_workspace_id == ZDWM_WORKSPACE_ID_INVALID) {
output->current_workspace_id = workspace->id;
@@ -79,7 +83,7 @@ void state_cleanup(state_t *state) {
for (size_t i = 0; i < ZDWM_WINDOW_LAYER_COUNT; ++i) {
layer_stack_t *layer = &state->stacks[i];
p_delete(&layer->order);
layer->order = 0;
layer->order = 0;
layer->capacity = 0;
}
@@ -102,8 +106,8 @@ void state_cleanup(state_t *state) {
p_clear(state, 1);
}
const workspace_t *state_workspace_get(const state_t *state,
workspace_id_t id) {
const workspace_t *
state_workspace_get(const state_t *state, workspace_id_t id) {
if (id < state->workspace_count) return &state->workspaces[id];
return nullptr;
}
@@ -113,8 +117,10 @@ const workspace_t *state_workspace_at(const state_t *state, size_t index) {
return nullptr;
}
static void state_workspace_adjust_focused_window(const state_t *state,
workspace_id_t workspace_id) {
static void state_workspace_adjust_focused_window(
const state_t *state,
workspace_id_t workspace_id
) {
workspace_t *workspace =
(workspace_t *)state_workspace_get(state, workspace_id);
if (!workspace) return;
@@ -127,7 +133,7 @@ static void state_workspace_adjust_focused_window(const state_t *state,
const layer_stack_t *layer = &state->stacks[i];
for (size_t i = layer->count; i > 0; --i) {
window_id_t window_id = layer->order[i - 1];
window = state_window_get(state, window_id);
window = state_window_get(state, window_id);
if (window && window->workspace_id == workspace_id) {
workspace->focused_window_id = window_id;
return;
@@ -144,25 +150,27 @@ bool state_workspace_cycle_layout(state_t *state, workspace_id_t workspace_id) {
if (!workspace) return false;
size_t next_index = 0;
bool matched = false;
bool matched = false;
for (size_t i = 0; i < workspace->layout_count; i++) {
if (workspace->layout_id == workspace->available_layouts[i]) {
next_index = (i + 1) % workspace->layout_count;
matched = true;
matched = true;
break;
}
}
if (!matched) return false;
auto next_layout_id = workspace->available_layouts[next_index];
auto next_layout_id = workspace->available_layouts[next_index];
workspace->layout_id = next_layout_id;
return true;
}
bool state_workspace_set_layout_by_index(state_t *state,
workspace_id_t workspace_id,
size_t index) {
bool state_workspace_set_layout_by_index(
state_t *state,
workspace_id_t workspace_id,
size_t index
) {
workspace_t *workspace =
(workspace_t *)state_workspace_get(state, workspace_id);
if (!workspace) return false;
@@ -172,9 +180,11 @@ bool state_workspace_set_layout_by_index(state_t *state,
return true;
}
bool state_workspace_set_layout_by_id(state_t *state,
workspace_id_t workspace_id,
layout_id_t layout_id) {
bool state_workspace_set_layout_by_id(
state_t *state,
workspace_id_t workspace_id,
layout_id_t layout_id
) {
workspace_t *workspace =
(workspace_t *)state_workspace_get(state, workspace_id);
if (!workspace) return false;
@@ -188,9 +198,11 @@ bool state_workspace_set_layout_by_id(state_t *state,
return false;
}
void state_workspace_set_focused_window(state_t *state,
workspace_id_t workspace_id,
window_id_t window_id) {
void state_workspace_set_focused_window(
state_t *state,
workspace_id_t workspace_id,
window_id_t window_id
) {
workspace_t *workspace =
(workspace_t *)state_workspace_get(state, workspace_id);
if (!workspace) return;
@@ -235,14 +247,20 @@ const output_t *state_output_at(const state_t *state, size_t index) {
return nullptr;
}
void state_output_set_workarea(state_t *state, output_id_t output_id,
rect_t workarea) {
void state_output_set_workarea(
state_t *state,
output_id_t output_id,
rect_t workarea
) {
output_t *output = (output_t *)state_output_get(state, output_id);
if (output) output->workarea = workarea;
}
void state_output_set_current_workspace(state_t *state, output_id_t output_id,
workspace_id_t workspace_id) {
void state_output_set_current_workspace(
state_t *state,
output_id_t output_id,
workspace_id_t workspace_id
) {
output_t *output = (output_t *)state_output_get(state, output_id);
if (!output) return;
const workspace_t *workspace = state_workspace_get(state, workspace_id);
@@ -269,15 +287,17 @@ bool state_output_valid(const state_t *state, output_id_t id) {
}
void state_cycle_current_output(state_t *state, int delta) {
int64_t count = (int64_t)state->output_count;
int64_t count = (int64_t)state->output_count;
int64_t current = (int64_t)state->current_output_index;
int64_t next = (current + (int64_t)delta) % count;
int64_t next = (current + (int64_t)delta) % count;
if (next < 0) next += count;
state->current_output_index = (size_t)next;
}
static inline void window_set_geometry_mode(
window_t *window, window_geometry_mode_t geometry_mode) {
window_t *window,
window_geometry_mode_t geometry_mode
) {
window->geometry_mode = geometry_mode;
}
static inline void window_set_floating(window_t *window, bool floating) {
@@ -317,18 +337,18 @@ static inline void window_set_class(window_t *window, const char *class_name) {
p_delete(&window->class_name);
window->class_name = p_strdup_nullable(class_name);
}
static inline void window_set_instance(window_t *window,
const char *instance_name) {
static inline void
window_set_instance(window_t *window, const char *instance_name) {
p_delete(&window->instance_name);
window->instance_name = p_strdup_nullable(instance_name);
}
static inline void window_set_skip_taskbar(window_t *window,
bool skip_taskbar) {
static inline void
window_set_skip_taskbar(window_t *window, bool skip_taskbar) {
window->skip_taskbar = skip_taskbar;
}
const window_t *state_window_add(state_t *state, const window_info_t *info) {
window_id_t id = info->id;
window_id_t id = info->id;
window_t *window = (window_t *)state_window_get(state, id);
if (!window) {
window =
@@ -338,10 +358,10 @@ const window_t *state_window_add(state_t *state, const window_info_t *info) {
layer_stack_append(layer, id);
p_clear(window, 1);
window->id = id;
window->id = id;
window->transient_for = info->transient_for;
window->workspace_id = ZDWM_WORKSPACE_ID_INVALID;
window->layer = info->layer_type;
window->workspace_id = ZDWM_WORKSPACE_ID_INVALID;
window->layer = info->layer_type;
}
window_set_geometry_mode(window, info->geometry_mode);
@@ -378,14 +398,14 @@ void state_window_remove(state_t *state, window_id_t id) {
for (size_t i = 0; i < state->window_count; i++) {
if (state->windows[i].id == id) {
matched = true;
index = i;
index = i;
break;
}
}
if (!matched) return;
window_t *window = &state->windows[index];
layer_type_t layer_type = window->layer;
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);
@@ -398,7 +418,7 @@ void state_window_remove(state_t *state, window_id_t id) {
}
window = &state->windows[state->window_count - 1];
p_clear(window, 1);
window->id = ZDWM_WINDOW_ID_INVALID;
window->id = ZDWM_WINDOW_ID_INVALID;
window->workspace_id = ZDWM_WORKSPACE_ID_INVALID;
state->window_count--;
@@ -416,13 +436,16 @@ void state_window_remove(state_t *state, window_id_t id) {
size_t state_window_count(const state_t *state) { return state->window_count; }
void state_window_set_workspace(state_t *state, window_id_t window_id,
workspace_id_t workspace_id) {
void state_window_set_workspace(
state_t *state,
window_id_t window_id,
workspace_id_t workspace_id
) {
const workspace_t *workspace = state_workspace_get(state, workspace_id);
window_t *window = (window_t *)state_window_get(state, window_id);
window_t *window = (window_t *)state_window_get(state, window_id);
if (!workspace || !window || window->workspace_id == workspace_id) return;
workspace = state_workspace_get(state, window->workspace_id);
workspace = state_workspace_get(state, window->workspace_id);
window->workspace_id = workspace_id;
if (workspace && workspace->focused_window_id == window_id) {
@@ -432,57 +455,84 @@ void state_window_set_workspace(state_t *state, window_id_t window_id,
state_workspace_adjust_focused_window(state, workspace_id);
}
void state_window_set_geometry_mode(state_t *state, window_id_t window_id,
window_geometry_mode_t geometry_mode) {
void state_window_set_geometry_mode(
state_t *state,
window_id_t window_id,
window_geometry_mode_t geometry_mode
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (window) window_set_geometry_mode(window, geometry_mode);
}
void state_window_set_floating(state_t *state, window_id_t window_id,
bool floating) {
void state_window_set_floating(
state_t *state,
window_id_t window_id,
bool floating
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (window) window_set_floating(window, floating);
}
void state_window_set_sticky(state_t *state, window_id_t window_id,
bool sticky) {
void state_window_set_sticky(
state_t *state,
window_id_t window_id,
bool sticky
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (window) window_set_sticky(window, sticky);
}
void state_window_set_urgent(state_t *state, window_id_t window_id,
bool urgent) {
void state_window_set_urgent(
state_t *state,
window_id_t window_id,
bool urgent
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (window) window_set_urgent(window, urgent);
}
void state_window_set_fixed_size(state_t *state, window_id_t window_id,
bool fixed_size) {
void state_window_set_fixed_size(
state_t *state,
window_id_t window_id,
bool fixed_size
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (window) window_set_fixed_size(window, fixed_size);
}
void state_window_set_skip_taskbar(state_t *state, window_id_t window_id,
bool skip_taskbar) {
void state_window_set_skip_taskbar(
state_t *state,
window_id_t window_id,
bool skip_taskbar
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (window) window_set_skip_taskbar(window, skip_taskbar);
}
void state_window_set_float_rect(state_t *state, window_id_t window_id,
rect_t float_rect) {
void state_window_set_float_rect(
state_t *state,
window_id_t window_id,
rect_t float_rect
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (window) window_set_float_rect(window, float_rect);
}
void state_window_set_frame_rect(state_t *state, window_id_t window_id,
rect_t frame_rect) {
void state_window_set_frame_rect(
state_t *state,
window_id_t window_id,
rect_t frame_rect
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (window) window_set_frame_rect(window, frame_rect);
}
bool state_window_take_metadata(state_t *state, window_id_t window_id,
window_metadata_t *metadata,
uint32_t changed_fields) {
bool state_window_take_metadata(
state_t *state,
window_id_t window_id,
window_metadata_t *metadata,
uint32_t changed_fields
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (!window) return false;
@@ -505,8 +555,11 @@ bool state_window_take_metadata(state_t *state, window_id_t window_id,
return true;
}
bool state_window_set_title(state_t *state, window_id_t window_id,
const char *title) {
bool state_window_set_title(
state_t *state,
window_id_t window_id,
const char *title
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (!window) return false;
@@ -514,8 +567,11 @@ bool state_window_set_title(state_t *state, window_id_t window_id,
return true;
}
bool state_window_set_app_id(state_t *state, window_id_t window_id,
const char *app_id) {
bool state_window_set_app_id(
state_t *state,
window_id_t window_id,
const char *app_id
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (!window) return false;
@@ -523,8 +579,11 @@ bool state_window_set_app_id(state_t *state, window_id_t window_id,
return true;
}
bool state_window_set_role(state_t *state, window_id_t window_id,
const char *role) {
bool state_window_set_role(
state_t *state,
window_id_t window_id,
const char *role
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (!window) return false;
@@ -532,8 +591,11 @@ bool state_window_set_role(state_t *state, window_id_t window_id,
return true;
}
bool state_window_set_class(state_t *state, window_id_t window_id,
const char *class_name) {
bool state_window_set_class(
state_t *state,
window_id_t window_id,
const char *class_name
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (!window) return false;
@@ -541,8 +603,11 @@ bool state_window_set_class(state_t *state, window_id_t window_id,
return true;
}
bool state_window_set_instance(state_t *state, window_id_t window_id,
const char *instance_name) {
bool state_window_set_instance(
state_t *state,
window_id_t window_id,
const char *instance_name
) {
window_t *window = (window_t *)state_window_get(state, window_id);
if (!window) return false;

View File

@@ -90,9 +90,13 @@ typedef struct state_t {
* 每个 output 的 current_workspace_id 会自动设置为首个归属到该 output 的
* workspace若某个 output 没有任何归属 workspacestate_init() 会失败。
*/
void state_init(state_t *state, const output_info_t *outputs,
size_t output_count, const workspace_desc_t *workspaces,
size_t workspace_count);
void state_init(
state_t *state,
const output_info_t *outputs,
size_t output_count,
const workspace_desc_t *workspaces,
size_t workspace_count
);
void state_cleanup(state_t *state);
/*
@@ -104,15 +108,21 @@ void state_cleanup(state_t *state);
const workspace_t *state_workspace_get(const state_t *state, workspace_id_t id);
const workspace_t *state_workspace_at(const state_t *state, size_t index);
bool state_workspace_cycle_layout(state_t *state, workspace_id_t workspace_id);
bool state_workspace_set_layout_by_index(state_t *state,
workspace_id_t workspace_id,
size_t index);
bool state_workspace_set_layout_by_id(state_t *state,
workspace_id_t workspace_id,
layout_id_t layout_id);
void state_workspace_set_focused_window(state_t *state,
workspace_id_t workspace_id,
window_id_t window_id);
bool state_workspace_set_layout_by_index(
state_t *state,
workspace_id_t workspace_id,
size_t index
);
bool state_workspace_set_layout_by_id(
state_t *state,
workspace_id_t workspace_id,
layout_id_t layout_id
);
void state_workspace_set_focused_window(
state_t *state,
workspace_id_t workspace_id,
window_id_t window_id
);
size_t state_workspace_count(const state_t *state);
bool state_workspace_valid(const state_t *state, workspace_id_t id);
@@ -124,10 +134,16 @@ bool state_workspace_valid(const state_t *state, workspace_id_t id);
*/
const output_t *state_output_get(const state_t *state, output_id_t id);
const output_t *state_output_at(const state_t *state, size_t index);
void state_output_set_workarea(state_t *state, output_id_t output_id,
rect_t workarea);
void state_output_set_current_workspace(state_t *state, output_id_t output_id,
workspace_id_t workspace_id);
void state_output_set_workarea(
state_t *state,
output_id_t output_id,
rect_t workarea
);
void state_output_set_current_workspace(
state_t *state,
output_id_t output_id,
workspace_id_t workspace_id
);
size_t state_output_count(const state_t *state);
bool state_output_valid(const state_t *state, output_id_t id);
void state_cycle_current_output(state_t *state, int delta);
@@ -153,24 +169,51 @@ void state_window_remove(state_t *state, window_id_t id);
size_t state_window_count(const state_t *state);
/* state 持有的单个 window 状态更新接口 */
void state_window_set_workspace(state_t *state, window_id_t window_id,
workspace_id_t workspace_id);
void state_window_set_geometry_mode(state_t *state, window_id_t window_id,
window_geometry_mode_t geometry_mode);
void state_window_set_floating(state_t *state, window_id_t window_id,
bool floating);
void state_window_set_sticky(state_t *state, window_id_t window_id,
bool sticky);
void state_window_set_urgent(state_t *state, window_id_t window_id,
bool urgent);
void state_window_set_fixed_size(state_t *state, window_id_t window_id,
bool fixed_size);
void state_window_set_skip_taskbar(state_t *state, window_id_t window_id,
bool skip_taskbar);
void state_window_set_float_rect(state_t *state, window_id_t window_id,
rect_t float_rect);
void state_window_set_frame_rect(state_t *state, window_id_t window_id,
rect_t frame_rect);
void state_window_set_workspace(
state_t *state,
window_id_t window_id,
workspace_id_t workspace_id
);
void state_window_set_geometry_mode(
state_t *state,
window_id_t window_id,
window_geometry_mode_t geometry_mode
);
void state_window_set_floating(
state_t *state,
window_id_t window_id,
bool floating
);
void state_window_set_sticky(
state_t *state,
window_id_t window_id,
bool sticky
);
void state_window_set_urgent(
state_t *state,
window_id_t window_id,
bool urgent
);
void state_window_set_fixed_size(
state_t *state,
window_id_t window_id,
bool fixed_size
);
void state_window_set_skip_taskbar(
state_t *state,
window_id_t window_id,
bool skip_taskbar
);
void state_window_set_float_rect(
state_t *state,
window_id_t window_id,
rect_t float_rect
);
void state_window_set_frame_rect(
state_t *state,
window_id_t window_id,
rect_t frame_rect
);
/**
* @brief 按字段掩码转移窗口元数据的所有权
* @param state 状态实例指针
@@ -185,19 +228,37 @@ void state_window_set_frame_rect(state_t *state, window_id_t window_id,
* 失败时,不接管 metadata 中任何字段的所有权metadata 保持不变,仍由调用方负
* 责后续访问与释放。
*/
bool state_window_take_metadata(state_t *state, window_id_t window_id,
window_metadata_t *metadata,
uint32_t changed_fields);
bool state_window_set_title(state_t *state, window_id_t window_id,
const char *title);
bool state_window_set_app_id(state_t *state, window_id_t window_id,
const char *app_id);
bool state_window_set_role(state_t *state, window_id_t window_id,
const char *role);
bool state_window_set_class(state_t *state, window_id_t window_id,
const char *class_name);
bool state_window_set_instance(state_t *state, window_id_t window_id,
const char *instance_name);
bool state_window_take_metadata(
state_t *state,
window_id_t window_id,
window_metadata_t *metadata,
uint32_t changed_fields
);
bool state_window_set_title(
state_t *state,
window_id_t window_id,
const char *title
);
bool state_window_set_app_id(
state_t *state,
window_id_t window_id,
const char *app_id
);
bool state_window_set_role(
state_t *state,
window_id_t window_id,
const char *role
);
bool state_window_set_class(
state_t *state,
window_id_t window_id,
const char *class_name
);
bool state_window_set_instance(
state_t *state,
window_id_t window_id,
const char *instance_name
);
bool state_stack_raise(state_t *state, window_id_t window_id);
bool state_stack_lower(state_t *state, window_id_t window_id);

View File

@@ -42,13 +42,13 @@ static inline void workspace_desc_cleanup(workspace_desc_t *workspace) {
p_delete(&workspace->name);
p_delete(&workspace->layout_ids);
workspace->output_index = 0;
workspace->layout_count = 0;
workspace->output_index = 0;
workspace->layout_count = 0;
workspace->initial_layout_id = ZDWM_LAYOUT_ID_INVALID;
}
static inline void workspace_desc_list_cleanup(workspace_desc_t **list,
size_t *count) {
static inline void
workspace_desc_list_cleanup(workspace_desc_t **list, size_t *count) {
if (!list || !count) return;
for (size_t i = 0; i < *count; i++) {
@@ -65,7 +65,8 @@ static inline void workspace_desc_list_cleanup(workspace_desc_t **list,
* 这组接口只校验描述表自身的一致性,不访问 state。
*/
static inline bool workspace_desc_layouts_valid(
const workspace_desc_t *workspace) {
const workspace_desc_t *workspace
) {
if (!workspace || !workspace->layout_count || !workspace->layout_ids) {
return false;
}
@@ -77,8 +78,8 @@ static inline bool workspace_desc_layouts_valid(
return false;
}
static inline bool workspace_desc_valid(const workspace_desc_t *workspace,
size_t output_count) {
static inline bool
workspace_desc_valid(const workspace_desc_t *workspace, size_t output_count) {
if (!workspace || !workspace->name) return false;
if (workspace->output_index >= output_count) return false;