refactor(core+backend/X11): 将修改窗口几何属性合并到 CONFIGURE_WINDOW 中

将 MOVE/RESIZE/BORDER_WIDTH 三个效果合并进 CONFIGURE_WINDOW 中,通过
changed_fields 掩码提取有效数据
This commit is contained in:
2026-04-29 00:39:19 +08:00
parent a393308704
commit 1485400b4c
7 changed files with 89 additions and 71 deletions

View File

@@ -114,23 +114,6 @@ typedef struct window_state_request_event_t {
window_state_request_action_t action;
} 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_HEIGHT = 1u << 3,
} configure_request_field_t;
typedef struct configure_request_event_t {
window_id_t window;
uint32_t changed_fields;
int32_t x;
int32_t y;
int32_t width;
int32_t height;
} configure_request_event_t;
typedef struct event_t {
event_type_t type;
union {
@@ -145,7 +128,7 @@ typedef struct event_t {
window_hints_changed_event_t window_hints_changed;
window_activate_request_event_t window_activate_request;
window_state_request_event_t window_state_request;
configure_request_event_t configure_request;
configure_data_t configure_request;
} as;
} event_t;

View File

@@ -14,10 +14,8 @@ typedef enum effect_type_t {
ZDWM_EFFECT_MINIMIZE_WINDOW,
ZDWM_EFFECT_MAXIMIZE_WINDOW,
ZDWM_EFFECT_FULLSCREEN_WINDOW,
ZDWM_EFFECT_MOVE_WINDOW,
ZDWM_EFFECT_RESIZE_WINDOW,
ZDWM_EFFECT_CONFIGURE_WINDOW,
ZDWM_EFFECT_CHANGE_BORDER_COLOR,
ZDWM_EFFECT_CHANGE_BORDER_WIDTH,
ZDWM_EFFECT_CHANGE_WINDOW_LIST,
ZDWM_EFFECT_RESTACK_WINDOWS,
ZDWM_EFFECT_BIND_KEY,
@@ -43,11 +41,6 @@ typedef struct effect_change_border_color_t {
const color_t *color;
} effect_change_border_color_t;
typedef struct effect_change_border_width_t {
window_id_t window;
uint32_t border_width;
} effect_change_border_width_t;
typedef struct effect_window_list_t {
const window_id_t *windows;
size_t count;
@@ -74,10 +67,8 @@ typedef struct effect_t {
effect_bool_window_t minimize;
effect_bool_window_t maximize;
effect_bool_window_t fullscreen;
effect_move_window_t move;
effect_resize_window_t resize;
configure_data_t configure;
effect_change_border_color_t change_border_color;
effect_change_border_width_t change_border_width;
effect_window_list_t change_window_list;
effect_window_list_t restack_windows;
effect_bind_key_t bind_key;

View File

@@ -216,27 +216,26 @@ static void runtime_apply_window_rect(
auto need_move = window_need_move(window, rect.x, rect.y);
auto need_resize = window_need_resize(window, rect.width, rect.height);
uint32_t changed_fields = 0u;
if (need_move) {
effect_t move_window_effect = {
.type = ZDWM_EFFECT_MOVE_WINDOW,
.as.move = {
.window = window_id,
.left_top_point = {.x = rect.x, .y = rect.y}
}
};
plan_push_effect(plan, &move_window_effect);
changed_fields |= ZDWM_CONFIGURE_FIELD_X | ZDWM_CONFIGURE_FIELD_Y;
}
if (need_resize) {
effect_t resize_window_effect = {
.type = ZDWM_EFFECT_RESIZE_WINDOW,
.as.resize = {
.window = window_id,
.width = rect.width,
.height = rect.height,
}
};
plan_push_effect(plan, &resize_window_effect);
changed_fields |= ZDWM_CONFIGURE_FIELD_WIDTH | ZDWM_CONFIGURE_FIELD_HEIGHT;
}
effect_t configure_effect = {
.type = ZDWM_EFFECT_CONFIGURE_WINDOW,
.as.configure = {
.window = window_id,
.x = rect.x,
.y = rect.y,
.width = rect.width,
.height = rect.height,
.changed_fields = changed_fields,
}
};
plan_push_effect(plan, &configure_effect);
if (need_move || need_resize) {
state_window_set_frame_rect(state, window_id, rect);

View File

@@ -79,3 +79,25 @@ typedef enum window_state_request_action_t {
ZDWM_WINDOW_STATE_ACTION_REMOVE,
ZDWM_WINDOW_STATE_ACTION_TOGGLE,
} window_state_request_action_t;
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;
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;