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

@@ -466,6 +466,29 @@ find_or_push_configure(window_configure_list_t *configs, xcb_window_t window) {
return cfg;
}
static void merge_window_configure_params(
backend_t *backend,
const configure_data_t *data
) {
auto cfg = find_or_push_configure(&backend->config_list, data->window);
#define FIELD_MERGE(MASK, VALUE_FIELD, DATA_FIELD) \
if (data->changed_fields & (MASK)) { \
cfg->mask |= (MASK); \
cfg->value.VALUE_FIELD = data->DATA_FIELD; \
}
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_X, x, x);
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_Y, y, y);
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_WIDTH, width, width);
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_HEIGHT, height, height);
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_BORDER_WIDTH, border_width, border_width);
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_SIBLING, sibling, sibling);
FIELD_MERGE(ZDWM_CONFIGURE_FIELD_STACK_MODE, stack_mode, stack_mode);
#undef FIELD_MERGE
}
static void
backend_bind_key(backend_t *backend, const effect_bind_key_t *bind_key) {
auto root = backend->screen->root;
@@ -477,8 +500,6 @@ static void backend_merge_effects(
const effect_t *effects,
size_t effect_count
) {
window_configure_list_t *configs = &backend->config_list;
for (size_t i = 0; i < effect_count; ++i) {
const effect_t *e = &effects[i];
switch (e->type) {
@@ -529,20 +550,9 @@ static void backend_merge_effects(
window_set_net_wm_state(backend, window, 0, nullptr);
}
} break;
case ZDWM_EFFECT_MOVE_WINDOW: {
window_configure_t *cfg =
find_or_push_configure(configs, e->as.move.window);
cfg->mask |= XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y;
cfg->value.x = e->as.move.left_top_point.x;
cfg->value.y = e->as.move.left_top_point.y;
} break;
case ZDWM_EFFECT_RESIZE_WINDOW: {
window_configure_t *cfg =
find_or_push_configure(configs, e->as.resize.window);
cfg->mask |= XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
cfg->value.width = (uint32_t)e->as.resize.width;
cfg->value.height = (uint32_t)e->as.resize.height;
} break;
case ZDWM_EFFECT_CONFIGURE_WINDOW:
merge_window_configure_params(backend, &e->as.configure);
break;
case ZDWM_EFFECT_CHANGE_BORDER_COLOR: {
xcb_change_window_attributes_value_list_t value = {
.border_pixel = e->as.change_border_color.color->argb
@@ -554,12 +564,6 @@ static void backend_merge_effects(
&value
);
} break;
case ZDWM_EFFECT_CHANGE_BORDER_WIDTH: {
window_configure_t *cfg =
find_or_push_configure(configs, e->as.change_border_width.window);
cfg->mask |= XCB_CONFIG_WINDOW_BORDER_WIDTH;
cfg->value.border_width = e->as.change_border_width.border_width;
} break;
case ZDWM_EFFECT_CHANGE_WINDOW_LIST:
backend_change_window_list(backend, false, &e->as.change_window_list);
break;

View File

@@ -199,8 +199,27 @@ static bool handle_configure_request(
event_t *event,
const xcb_configure_request_event_t *xcb_event
) {
event->type = ZDWM_EVENT_CONFIGURE_REQUEST;
/* TODO: */
event->type = ZDWM_EVENT_CONFIGURE_REQUEST;
auto data = &event->as.configure_request;
data->window = xcb_event->window;
data->changed_fields = 0u;
#define EXTRACT_FIELD(XCB_MASK, FIELD_MASK, DATA_FIELD, EVENT_FIELD) \
if (xcb_event->value_mask & XCB_CONFIG_WINDOW_##XCB_MASK) { \
data->DATA_FIELD = xcb_event->EVENT_FIELD; \
data->changed_fields |= ZDWM_CONFIGURE_FIELD_##FIELD_MASK; \
}
EXTRACT_FIELD(X, X, x, x);
EXTRACT_FIELD(Y, Y, y, y);
EXTRACT_FIELD(WIDTH, WIDTH, width, width);
EXTRACT_FIELD(HEIGHT, HEIGHT, height, height);
EXTRACT_FIELD(BORDER_WIDTH, BORDER_WIDTH, border_width, border_width);
EXTRACT_FIELD(SIBLING, SIBLING, sibling, sibling);
EXTRACT_FIELD(STACK_MODE, STACK_MODE, stack_mode, stack_mode);
#undef EXTRACT_FIELD
return true;
}

View File

@@ -60,7 +60,7 @@ typedef struct atoms_t {
typedef struct window_configure_t {
xcb_window_t window;
uint16_t mask;
uint32_t mask;
xcb_configure_window_value_list_t value;
} window_configure_t;