refactor: 从 core 中抽出跨模块契约建立 interface/common 模块分层

引入 interface/(零实现声明层)与 common/(共享 ADT 操作层),把跨模块
契约从 core 实现里抽出来,依赖方向回到单向(base ← interface ← common ←
各实现层)。docs/module-layering.org 记录完整方案与判定标准。

interface/(纯类型与多态接口声明,零 .c):
- types.h / event.h / backend.h 从 core 移入
- effect.h 新建(effect_t 从 plan.h 抽出)

common/(多实现层共用的自包含操作,.h + .c):
- event.{h,c}:event_reset / event_cleanup
- listeners.{h,c}:listeners 维护(add / cleanup);notify 留 core
- window.{h,c}:window_list + layer_props/metadata cleanup + window_classify_layer
- workspace.{h,c}:workspace_desc(从 wm_desc.h 拆出,改真实函数)

window 相关整理:
- window_layer_type_t 上浮 interface/types.h(common 的 classify 需要)
- window_classify_layer 移 common/window
- window_info_t 独立成 core/window_info.h(state/command 共享,不寄生)
- 删除 wm_desc.h,base/window_list 并入 common/window

全项目 include 路径同步更新
This commit is contained in:
2026-06-25 03:00:30 +08:00
parent e1113c0052
commit 079f41ce8a
57 changed files with 686 additions and 657 deletions

View File

@@ -1,79 +0,0 @@
#pragma once
#include <cairo.h>
#include <stddef.h>
#include "core/event.h"
#include "core/plan.h"
#include "core/types.h"
typedef struct backend_t backend_t;
typedef struct backend_detect_t {
output_info_t *outputs;
size_t output_count;
} backend_detect_t;
backend_t *backend_create(const char *display_name);
void backend_destroy(backend_t *backend);
backend_detect_t *backend_detect(backend_t *backend);
void backend_detect_destroy(backend_detect_t *detect);
int backend_get_fd(backend_t *backend);
/**
* @brief 非阻塞地从 backend 中读取下一个归一化的事件
*
* @details
* 1. 函数立即返回
* 2. 只要取到了事件,函数就返回 true ,事件填充到 event 参数中
*
* @returns 如果还有下一个事件待读取,返回 true ,否则返回 false
*/
bool backend_poll_event(backend_t *backend, event_t *event);
/**
* @brief 阻塞等待 backend 产出下一个可交给 runtime 的归一化事件
* @details
* backend 可以在内部丢弃无关的原始平台事件,直到拿到一个可路由事件或遇到
* stop/error 条件。
*
* 返回 true 时,`event` 已被完整填充;若其中包含堆内存,所有权转交给调用方,
* 调用方必须在本轮处理结束后调用 event_cleanup() 或 event_reset()。
*
* 返回 false 时,表示 backend 请求停止或遇到错误;此时 `event` 必须保持为
* 无需 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
);
typedef struct backend_scan_result_t {
window_map_request_event_t *windows;
size_t count;
size_t capacity;
} backend_scan_result_t;
/**
* @brief 扫描已有窗口
*
* @details 仅扫描窗口并获取其基础信息
*/
backend_scan_result_t *backend_scan_windows(backend_t *backend);
void backend_scan_result_destroy(backend_scan_result_t *result);
typedef struct backend_bar_window_t {
window_id_t window_id;
cairo_t *cr;
} backend_bar_window_t;
backend_bar_window_t backend_create_bar_window(
backend_t *backend,
rect_t geometry,
uint32_t bg_pixel
);
void backend_flush(backend_t *backend);

View File

@@ -12,7 +12,7 @@
#include "base/array.h"
#include "base/macros.h"
#include "base/memory.h"
#include "core/types.h"
#include "interface/types.h"
typedef struct binding_mode_t {
zdwm_binding_mode_id_t id;

View File

@@ -5,7 +5,7 @@
#include <zdwm/action.h>
#include <zdwm/types.h>
#include "core/types.h"
#include "interface/types.h"
typedef struct binding_table_t binding_table_t;

View File

@@ -1,7 +1,7 @@
#pragma once
#include "core/types.h"
#include "core/wm_desc.h"
#include "core/window_info.h"
#include "interface/types.h"
typedef enum command_type_t {
ZDWM_COMMAND_MANAGE_WINDOW,

View File

@@ -1,27 +0,0 @@
#include "core/event.h"
#include "base/memory.h"
#include "core/window.h"
void event_cleanup(event_t *event) {
if (!event || event->type == ZDWM_EVENT_NONE) 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;
}
}
void event_reset(event_t *event) {
if (!event) return;
event_cleanup(event);
p_clear(event, 1);
}

View File

@@ -1,116 +0,0 @@
#pragma once
#include <stdint.h>
#include "core/types.h"
#include "core/window.h"
typedef enum event_type_t {
ZDWM_EVENT_NONE,
ZDWM_EVENT_KEY_PRESS,
ZDWM_EVENT_POINTER_BUTTON_PRESS,
ZDWM_EVENT_POINTER_BUTTON_RELEASE,
ZDWM_EVENT_POINTER_MOTION,
ZDWM_EVENT_POINTER_ENTER,
ZDWM_EVENT_WINDOW_MAP_REQUEST,
ZDWM_EVENT_WINDOW_REMOVE,
ZDWM_EVENT_WINDOW_METADATA_CHANGED,
ZDWM_EVENT_WINDOW_HINTS_CHANGED,
ZDWM_EVENT_WINDOW_ACTIVATE_REQUEST,
ZDWM_EVENT_WINDOW_STATE_REQUEST,
ZDWM_EVENT_CONFIGURE_REQUEST,
} event_type_t;
typedef struct key_press_event_t {
modifier_mask_t modifiers;
keysym_t keysym;
uint32_t keycode;
} key_press_event_t;
typedef struct pointer_button_event_t {
modifier_mask_t modifiers;
button_t button;
window_id_t window;
point_t root;
point_t local;
} pointer_button_event_t;
typedef struct pointer_motion_event_t {
window_id_t window;
point_t root;
point_t local;
} pointer_motion_event_t;
typedef struct window_map_request_event_t {
window_id_t window;
window_id_t transient_for;
bool override_redirect;
bool skip_taskbar;
bool urgent;
bool fullscreen;
bool maximized;
bool minimized;
rect_t rect;
zdwm_size_t min_size;
zdwm_size_t max_size;
window_layer_props_t props;
window_metadata_t metadata;
} window_map_request_event_t;
typedef enum window_remove_reason_t {
ZDWM_WINDOW_REMOVE_WITHDRAWN,
ZDWM_WINDOW_REMOVE_DESTROY,
} window_remove_reason_t;
typedef struct window_remove_event_t {
window_id_t window;
window_remove_reason_t reason;
} window_remove_event_t;
typedef struct window_metadata_change_event_t {
window_id_t window;
uint32_t changed_fields;
window_metadata_t metadata;
} window_metadata_change_event_t;
/* clang-format off */
typedef enum window_activation_source_t {
ZDWM_WINDOW_ACTIVATION_SOURCE_LEGACY = 0,
ZDWM_WINDOW_ACTIVATION_SOURCE_APPLICATION = 1,
ZDWM_WINDOW_ACTIVATION_SOURCE_PAGER = 2,
} window_activation_source_t;
/* clang-format on */
typedef struct window_activate_request_event_t {
window_id_t window;
window_activation_source_t source;
} window_activate_request_event_t;
typedef struct window_state_request_event_t {
window_id_t window;
window_state_request_type_t type;
window_state_request_action_t action;
} window_state_request_event_t;
typedef struct event_t {
event_type_t type;
union {
key_press_event_t key_press;
pointer_button_event_t pointer_button_press;
pointer_button_event_t pointer_button_release;
pointer_motion_event_t pointer_motion;
only_window_data_t pointer_enter;
window_map_request_event_t window_map_request;
window_remove_event_t window_remove;
window_metadata_change_event_t window_metadata_change;
hints_data_t hints;
window_activate_request_event_t window_activate_request;
window_state_request_event_t window_state_request;
configure_data_t configure_request;
} as;
} event_t;
void event_cleanup(event_t *event);
void event_reset(event_t *event);

View File

@@ -4,7 +4,7 @@
#include "base/array.h"
#include "base/memory.h"
#include "core/types.h"
#include "interface/types.h"
void layer_stack_cleanup(layer_stack_t *layer) {
p_delete(&layer->order);

View File

@@ -2,7 +2,7 @@
#include <stddef.h>
#include "core/types.h"
#include "interface/types.h"
typedef struct layer_stack_t {
window_id_t *order;

View File

@@ -6,7 +6,7 @@
#include "base/array.h"
#include "base/memory.h"
#include "core/types.h"
#include "interface/types.h"
void layout_result_cleanup(layout_result_t *result) {
p_delete(&result->items);

View File

@@ -3,7 +3,7 @@
#include <stddef.h>
#include <zdwm/layout.h>
#include "core/types.h"
#include "interface/types.h"
typedef zdwm_layout_ctx_t layout_ctx_t;
typedef zdwm_layout_item_t layout_item_t;

View File

@@ -1,112 +1,11 @@
#include "core/listeners.h"
#include "base/array.h"
#include "base/memory.h"
#include "common/listeners.h"
#include "core/binding.h"
#include "core/layout.h"
#include "core/state.h"
#define ADD_LISTENER(FIELD) \
auto list = &listeners->FIELD; \
auto item = array_push(list->items, list->count, list->capacity); \
item->fn = fn; \
item->user_data = user_data
void listeners_add_output_listener(
listeners_t *listeners,
zdwm_current_output_id_listener fn,
void *user_data
) {
ADD_LISTENER(output_listeners);
}
void listeners_add_initial_workspace_listener(
listeners_t *listeners,
zdwm_initial_workspace_list fn,
void *user_data
) {
ADD_LISTENER(initial_workspace_listeners);
}
void listeners_add_active_workspace_listener(
listeners_t *listeners,
zdwm_workspace_active_updated fn,
void *user_data
) {
ADD_LISTENER(active_workspace_listeners);
}
void listeners_add_layout_notify(
listeners_t *listeners,
zdwm_layout_notify fn,
void *user_data
) {
ADD_LISTENER(layout_listeners);
}
void listeners_add_binding_mode_notify(
listeners_t *listeners,
zdwm_binding_mode_notify fn,
void *user_data
) {
ADD_LISTENER(binding_mode_listeners);
}
void listeners_add_initial_window_listener(
listeners_t *listeners,
zdwm_initial_window_list fn,
void *user_data
) {
ADD_LISTENER(initial_window_listeners);
}
void listeners_add_window_added_listener(
listeners_t *listeners,
zdwm_window_added fn,
void *user_data
) {
ADD_LISTENER(window_added_listeners);
}
void listeners_add_window_updated_listener(
listeners_t *listeners,
zdwm_window_updated fn,
void *user_data
) {
ADD_LISTENER(window_updated_listeners);
}
void listeners_add_window_removed_listener(
listeners_t *listeners,
zdwm_window_removed fn,
void *user_data
) {
ADD_LISTENER(window_removed_listeners);
}
#undef ADD_LISTENER
#define CLEANUP_LIST(FIELD) \
p_delete(&listeners->FIELD.items); \
listeners->FIELD.count = 0; \
listeners->FIELD.capacity = 0
void listeners_cleanup(listeners_t *listeners) {
if (!listeners) return;
CLEANUP_LIST(output_listeners);
CLEANUP_LIST(initial_workspace_listeners);
CLEANUP_LIST(active_workspace_listeners);
CLEANUP_LIST(layout_listeners);
CLEANUP_LIST(binding_mode_listeners);
CLEANUP_LIST(initial_window_listeners);
CLEANUP_LIST(window_added_listeners);
CLEANUP_LIST(window_updated_listeners);
CLEANUP_LIST(window_removed_listeners);
}
#undef CLEANUP_LIST
#define FOR_EACH_LISTENER(FIELD, BODY) \
do { \
if (!(listeners)) return; \

View File

@@ -3,98 +3,8 @@
#include <stddef.h>
#include <zdwm/listeners.h>
#include "core/types.h"
typedef struct binding_table_t binding_table_t;
typedef struct layout_registry_t layout_registry_t;
typedef struct state_t state_t;
#define ITEM(NAME, FN_TYPE) \
typedef struct NAME##_listener_item_t { \
FN_TYPE *fn; \
void *user_data; \
} NAME##_listener_item_t
#define LISTENERS(NAME, FN_TYPE) \
ITEM(NAME, FN_TYPE); \
typedef struct NAME##_listeners_t { \
NAME##_listener_item_t *items; \
size_t count; \
size_t capacity; \
} NAME##_listeners_t
LISTENERS(output, zdwm_current_output_id_listener);
LISTENERS(initial_workspace_list, zdwm_initial_workspace_list);
LISTENERS(workspace_active, zdwm_workspace_active_updated);
LISTENERS(layout, zdwm_layout_notify);
LISTENERS(binding_mode, zdwm_binding_mode_notify);
LISTENERS(initial_window_list, zdwm_initial_window_list);
LISTENERS(window_added, zdwm_window_added);
LISTENERS(window_updated, zdwm_window_updated);
LISTENERS(window_removed, zdwm_window_removed);
#undef ITEM
#undef LISTENERS
typedef struct listeners_t {
output_listeners_t output_listeners;
initial_workspace_list_listeners_t initial_workspace_listeners;
workspace_active_listeners_t active_workspace_listeners;
layout_listeners_t layout_listeners;
binding_mode_listeners_t binding_mode_listeners;
initial_window_list_listeners_t initial_window_listeners;
window_added_listeners_t window_added_listeners;
window_updated_listeners_t window_updated_listeners;
window_removed_listeners_t window_removed_listeners;
} listeners_t;
void listeners_add_output_listener(
listeners_t *listeners,
zdwm_current_output_id_listener fn,
void *user_data
);
void listeners_add_initial_workspace_listener(
listeners_t *listeners,
zdwm_initial_workspace_list fn,
void *user_data
);
void listeners_add_active_workspace_listener(
listeners_t *listeners,
zdwm_workspace_active_updated fn,
void *user_data
);
void listeners_add_layout_notify(
listeners_t *listeners,
zdwm_layout_notify fn,
void *user_data
);
void listeners_add_binding_mode_notify(
listeners_t *listeners,
zdwm_binding_mode_notify fn,
void *user_data
);
void listeners_add_initial_window_listener(
listeners_t *listeners,
zdwm_initial_window_list fn,
void *user_data
);
void listeners_add_window_added_listener(
listeners_t *listeners,
zdwm_window_added fn,
void *user_data
);
void listeners_add_window_updated_listener(
listeners_t *listeners,
zdwm_window_updated fn,
void *user_data
);
void listeners_add_window_removed_listener(
listeners_t *listeners,
zdwm_window_removed fn,
void *user_data
);
void listeners_cleanup(listeners_t *listeners);
#include "common/listeners.h"
#include "interface/types.h"
/**
* @brief 通知当前 output 信息

View File

@@ -4,7 +4,8 @@
#include "base/array.h"
#include "base/memory.h"
#include "core/types.h"
#include "interface/effect.h"
#include "interface/types.h"
static void free_memory_hold_by_effects(effect_t *effects, size_t count) {
for (size_t i = 0; i < count; ++i) {

View File

@@ -1,89 +1,10 @@
#pragma once
#include <stddef.h>
#include <stdint.h>
#include "base/color.h"
#include "core/types.h"
typedef enum effect_type_t {
ZDWM_EFFECT_MAP_WINDOW = 1,
ZDWM_EFFECT_UNMAP_WINDOW,
ZDWM_EFFECT_FOCUS_WINDOW,
ZDWM_EFFECT_KILL_WINDOW,
ZDWM_EFFECT_WITHDRAW_WINDOW,
ZDWM_EFFECT_START_MOVE_WINDOW,
ZDWM_EFFECT_START_RESIZE_WINDOW,
ZDWM_EFFECT_MINIMIZE_WINDOW,
ZDWM_EFFECT_MAXIMIZE_WINDOW,
ZDWM_EFFECT_FULLSCREEN_WINDOW,
ZDWM_EFFECT_CONFIGURE_WINDOW,
ZDWM_EFFECT_CHANGE_BORDER_COLOR,
ZDWM_EFFECT_CHANGE_WINDOW_LIST,
ZDWM_EFFECT_RESTACK_WINDOWS,
ZDWM_EFFECT_BIND_KEY,
ZDWM_EFFECT_GRAB_BUTTON,
ZDWM_EFFECT_UNGRAB_POINTER,
} effect_type_t;
typedef struct effect_move_window_t {
window_id_t window;
point_t left_top_point;
} effect_move_window_t;
typedef struct effect_resize_window_t {
window_id_t window;
int32_t width;
int32_t height;
} effect_resize_window_t;
typedef struct effect_change_border_color_t {
window_id_t window;
const color_t *color;
} effect_change_border_color_t;
typedef struct effect_window_list_t {
const window_id_t *windows;
size_t count;
} effect_window_list_t;
typedef struct effect_bind_key_t {
const key_bind_t *keys;
size_t count;
} effect_bind_key_t;
typedef struct effect_grab_button_t {
window_id_t window;
const grab_button_t *buttons;
size_t count;
} effect_grab_button_t;
typedef struct effect_bool_window_t {
window_id_t window;
bool value;
} effect_bool_window_t;
typedef struct effect_t {
effect_type_t type;
union {
only_window_data_t map;
only_window_data_t unmap;
only_window_data_t focus;
only_window_data_t kill;
only_window_data_t withdraw;
only_window_data_t move;
only_window_data_t resize;
effect_bool_window_t minimize;
effect_bool_window_t maximize;
effect_bool_window_t fullscreen;
configure_data_t configure;
effect_change_border_color_t change_border_color;
effect_window_list_t change_window_list;
effect_window_list_t restack_windows;
effect_bind_key_t bind_key;
effect_grab_button_t grab_button;
} as;
} effect_t;
#include "interface/effect.h"
#include "interface/types.h"
typedef struct plan_t {
effect_t *effects;

View File

@@ -10,19 +10,19 @@
#include "base/memory.h"
#include "base/process.h"
#include "base/time.h"
#include "base/window_list.h"
#include "common/listeners.h"
#include "common/window.h"
#include "core/binding.h"
#include "core/command.h"
#include "core/command_buffer.h"
#include "core/event.h"
#include "core/layout.h"
#include "core/listeners.h"
#include "core/plan.h"
#include "core/rules.h"
#include "core/state.h"
#include "core/types.h"
#include "core/window.h"
#include "core/wm_desc.h"
#include "interface/event.h"
#include "interface/types.h"
static void quit(bool restart, command_buffer_t *command_buffer) {
command_t quit_command = {

View File

@@ -3,16 +3,29 @@
#include <stdint.h>
#include <zdwm/action.h>
#include "base/window_list.h"
#include "common/listeners.h"
#include "common/window.h"
#include "core/binding.h"
#include "core/command_buffer.h"
#include "core/event.h"
#include "core/layout.h"
#include "core/listeners.h"
#include "core/plan.h"
#include "core/rules.h"
#include "core/state.h"
#include "core/types.h"
#include "interface/event.h"
typedef enum window_interaction_mode_t {
ZDWM_WINDOW_INTERACTION_NONE,
ZDWM_WINDOW_INTERACTION_MOVE,
ZDWM_WINDOW_INTERACTION_RESIZE,
} window_interaction_mode_t;
typedef struct window_interaction_state_t {
window_interaction_mode_t mode;
window_id_t window;
point_t start_coordinate;
rect_t origin_rect;
uint64_t last_change_time;
} window_interaction_state_t;
typedef struct policy_bar_t {
bool *visible;

View File

@@ -5,7 +5,7 @@
#include <zdwm/types.h>
#include "base/memory.h"
#include "core/types.h"
#include "interface/types.h"
bool rules_move(rules_t *src, rules_t *dest) {
if (!dest || !src) return false;

View File

@@ -2,8 +2,7 @@
#include <stddef.h>
#include "core/types.h"
#include "core/window.h"
#include "interface/types.h"
typedef struct rule_item_t {
rule_match_t match;

View File

@@ -8,11 +8,12 @@
#include "base/array.h"
#include "base/log.h"
#include "base/memory.h"
#include "base/window_list.h"
#include "common/window.h"
#include "common/workspace.h"
#include "core/layer.h"
#include "core/types.h"
#include "core/window.h"
#include "core/wm_desc.h"
#include "core/window_info.h"
#include "interface/types.h"
void state_init(
state_t *state,

View File

@@ -3,11 +3,12 @@
#include <stddef.h>
#include <stdint.h>
#include "base/window_list.h"
#include "common/window.h"
#include "common/workspace.h"
#include "core/layer.h"
#include "core/types.h"
#include "core/window.h"
#include "core/wm_desc.h"
#include "core/window_info.h"
#include "interface/types.h"
typedef struct workspace_t {
workspace_id_t id;

View File

@@ -1,140 +0,0 @@
#pragma once
#include <stdint.h>
#include <zdwm/rules.h>
#include <zdwm/types.h>
#include "base/color.h"
/* clang-format off */
typedef zdwm_layout_id_t layout_id_t;
typedef zdwm_window_id_t window_id_t;
typedef zdwm_workspace_id_t workspace_id_t;
typedef zdwm_output_id_t output_id_t;
typedef zdwm_rect_t rect_t;
typedef zdwm_output_info_t output_info_t;
typedef zdwm_rule_match_t rule_match_t;
typedef zdwm_rule_action_t rule_action_t;
typedef enum zdwm_button_t button_t;
typedef enum zdwm_modifier_bit_t modifier_bit_t;
typedef zdwm_modifier_mask_t modifier_mask_t;
/* clang-format on */
typedef uint32_t keysym_t;
#define ZDWM_OUTPUT_ID_INVALID ((output_id_t)UINT32_MAX)
typedef struct point_t {
int32_t x;
int32_t y;
} point_t;
typedef enum focus_direction_t {
ZDWM_FOCUS_PREV,
ZDWM_FOCUS_NEXT,
} focus_direction_t;
typedef enum cross_output_policy_t {
ZDWM_CROSS_OUTPUT_KEEP_WORKSPACE,
ZDWM_CROSS_OUTPUT_MOVE_TO_TARGET_WORKSPACE,
} cross_output_policy_t;
typedef struct key_bind_t {
modifier_mask_t modifiers;
keysym_t keysym;
} key_bind_t;
typedef struct grab_button_t {
modifier_mask_t modifiers;
button_t button;
} grab_button_t;
typedef enum window_state_request_type_t {
ZDWM_WINDOW_STATE_REQUEST_FULLSCREEN,
ZDWM_WINDOW_STATE_REQUEST_MAXIMIZED,
ZDWM_WINDOW_STATE_REQUEST_MINIMIZED,
ZDWM_WINDOW_STATE_REQUEST_SKIP_TASKBAR,
} window_state_request_type_t;
typedef enum window_state_request_action_t {
ZDWM_WINDOW_STATE_ACTION_ADD,
ZDWM_WINDOW_STATE_ACTION_REMOVE,
ZDWM_WINDOW_STATE_ACTION_TOGGLE,
} window_state_request_action_t;
/* clang-format off */
typedef enum configure_field_t {
ZDWM_CONFIGURE_FIELD_X = 1u << 0,
ZDWM_CONFIGURE_FIELD_Y = 1u << 1,
ZDWM_CONFIGURE_FIELD_WIDTH = 1u << 2,
ZDWM_CONFIGURE_FIELD_HEIGHT = 1u << 3,
ZDWM_CONFIGURE_FIELD_BORDER_WIDTH = 1u << 4,
ZDWM_CONFIGURE_FIELD_SIBLING = 1u << 5,
ZDWM_CONFIGURE_FIELD_STACK_MODE = 1u << 6,
} configure_field_t;
/* clang-format on */
typedef struct configure_data_t {
window_id_t window;
uint32_t changed_fields;
int32_t x;
int32_t y;
int32_t width;
int32_t height;
uint32_t border_width;
window_id_t sibling;
uint32_t stack_mode;
} configure_data_t;
typedef struct border_config_t {
uint32_t width;
color_t normal_color;
color_t focused_color;
} border_config_t;
typedef struct only_window_data_t {
window_id_t window;
} only_window_data_t;
typedef enum hint_field_t {
ZDWM_HINT_FIELD_URGENT,
ZDWM_HINT_FIELD_SIZE,
} hint_field_t;
typedef struct zdwm_size_t {
int32_t width;
int32_t height;
} zdwm_size_t;
typedef struct hints_data_t {
window_id_t window;
uint32_t changed_fields;
bool urgent;
zdwm_size_t min_size;
zdwm_size_t max_size;
} hints_data_t;
typedef enum window_interaction_mode_t {
ZDWM_WINDOW_INTERACTION_NONE,
ZDWM_WINDOW_INTERACTION_MOVE,
ZDWM_WINDOW_INTERACTION_RESIZE,
} window_interaction_mode_t;
typedef struct window_interaction_state_t {
window_interaction_mode_t mode;
window_id_t window;
point_t start_coordinate;
rect_t origin_rect;
uint64_t last_change_time;
} window_interaction_state_t;
static inline bool window_id_invalid(window_id_t window_id) {
return window_id == ZDWM_WINDOW_ID_INVALID;
}
static inline bool workspace_id_invalid(workspace_id_t workspace_id) {
return workspace_id == ZDWM_WORKSPACE_ID_INVALID;
}

View File

@@ -1,40 +1,7 @@
#include "core/window.h"
#include "base/memory.h"
#include "core/types.h"
window_layer_type_t window_classify_layer(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;
}
void window_layer_props_cleanup(window_layer_props_t *props) {
if (!props) return;
p_delete(&props->types);
props->type_count = 0;
p_delete(&props->states);
props->state_count = 0;
}
void window_metadata_cleanup(window_metadata_t *metadata) {
if (!metadata) return;
p_delete(&metadata->title);
p_delete(&metadata->app_id);
p_delete(&metadata->role);
p_delete(&metadata->class_name);
p_delete(&metadata->instance_name);
}
#include "interface/types.h"
void window_set_fullscreen(window_t *window, bool fullscreen) {
window->fullscreen = fullscreen;

View File

@@ -3,68 +3,7 @@
#include <stddef.h>
#include <stdint.h>
#include "core/types.h"
/* Internal semantic window types mapped from backend-specific protocols. */
typedef enum window_type_t {
ZDWM_WINDOW_TYPE_NORMAL = 0,
ZDWM_WINDOW_TYPE_DESKTOP,
ZDWM_WINDOW_TYPE_DOCK,
ZDWM_WINDOW_TYPE_TOOLBAR,
ZDWM_WINDOW_TYPE_DIALOG,
ZDWM_WINDOW_TYPE_UTILITY,
ZDWM_WINDOW_TYPE_SPLASH,
ZDWM_WINDOW_TYPE_MENU,
ZDWM_WINDOW_TYPE_DROPDOWN_MENU,
ZDWM_WINDOW_TYPE_POPUP_MENU,
ZDWM_WINDOW_TYPE_TOOLTIP,
ZDWM_WINDOW_TYPE_COMBO,
ZDWM_WINDOW_TYPE_DND,
ZDWM_WINDOW_TYPE_NOTIFICATION,
} window_type_t;
/* Internal semantic window states mapped from backend-specific protocols. */
typedef enum window_state_t {
ZDWM_WINDOW_STATE_ABOVE = 0,
ZDWM_WINDOW_STATE_FULLSCREEN,
ZDWM_WINDOW_STATE_MODAL,
ZDWM_WINDOW_STATE_STICKY,
} window_state_t;
/* 层级从低到高 */
typedef enum window_layer_type_t {
ZDWM_WINDOW_LAYER_DESKTOP = 0,
ZDWM_WINDOW_LAYER_NORMAL,
ZDWM_WINDOW_LAYER_TOP,
ZDWM_WINDOW_LAYER_OVERLAY,
ZDWM_WINDOW_LAYER_COUNT,
} window_layer_type_t;
/* clang-format off */
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_INSTANCE = 1u << 4,
} window_metadata_change_flags_t;
/* clang-format on */
typedef struct window_layer_props_t {
window_type_t *types;
size_t type_count;
window_state_t *states;
size_t state_count;
} window_layer_props_t;
typedef struct window_metadata_t {
char *title;
char *app_id;
char *role;
char *class_name;
char *instance_name;
} window_metadata_t;
#include "interface/types.h"
typedef struct window_t {
window_id_t id;
@@ -97,11 +36,6 @@ typedef struct window_t {
uint32_t border_width;
} window_t;
window_layer_type_t window_classify_layer(const window_layer_props_t *props);
void window_layer_props_cleanup(window_layer_props_t *props);
void window_metadata_cleanup(window_metadata_t *metadata);
void window_set_fullscreen(window_t *window, bool fullscreen);
void window_set_maximized(window_t *window, bool maximized);
void window_set_minimized(window_t *window, bool minimized);

30
src/core/window_info.h Normal file
View File

@@ -0,0 +1,30 @@
#pragma once
#include "interface/types.h"
/*
* 由 backend 提供的窗口基础信息。
*
* 这些字符串由调用方提供state 如需长期持有,应自行复制。
*/
typedef struct window_info_t {
window_id_t id;
window_id_t transient_for;
rect_t frame_rect;
const char *title;
const char *app_id;
const char *role;
const char *class_name;
const char *instance_name;
window_layer_type_t layer_type;
bool fullscreen;
bool maximized;
bool minimized;
bool urgent;
bool skip_taskbar;
zdwm_size_t min_size;
zdwm_size_t max_size;
} window_info_t;

View File

@@ -1,91 +0,0 @@
#pragma once
#include <stddef.h>
#include "base/memory.h"
#include "core/types.h"
#include "core/window.h"
/*
* 由 backend 提供的窗口基础信息。
*
* 这些字符串由调用方提供state 如需长期持有,应自行复制。
*/
typedef struct window_info_t {
window_id_t id;
window_id_t transient_for;
rect_t frame_rect;
const char *title;
const char *app_id;
const char *role;
const char *class_name;
const char *instance_name;
window_layer_type_t layer_type;
bool fullscreen;
bool maximized;
bool minimized;
bool urgent;
bool skip_taskbar;
zdwm_size_t min_size;
zdwm_size_t max_size;
} window_info_t;
typedef struct workspace_desc_t {
size_t output_index; /* 对应 state_init() 中 outputs[] 的索引 */
const char *name;
const layout_id_t *layout_ids;
size_t layout_count;
layout_id_t initial_layout_id;
} workspace_desc_t;
static inline void workspace_desc_cleanup(workspace_desc_t *workspace) {
if (!workspace) return;
p_delete(&workspace->name);
p_delete(&workspace->layout_ids);
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) {
if (!list || !count) return;
for (size_t i = 0; i < *count; i++) {
workspace_desc_cleanup(&(*list)[i]);
}
p_delete(list);
*count = 0;
}
/*
* workspace 描述校验接口。
*
* 这组接口只校验描述表自身的一致性,不访问 state。
*/
static inline bool workspace_desc_layouts_valid(
const workspace_desc_t *workspace
) {
if (!workspace || !workspace->layout_count || !workspace->layout_ids) {
return false;
}
for (size_t i = 0; i < workspace->layout_count; i++) {
if (workspace->layout_ids[i] == workspace->initial_layout_id) return true;
}
return false;
}
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;
return workspace_desc_layouts_valid(workspace);
}