From 3349a912cc65984a66f1534b6198176c4ba26bce Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Sat, 2 May 2026 23:22:50 +0800 Subject: [PATCH] =?UTF-8?q?refactor(plan):=20=E6=B7=BB=E5=8A=A0=E5=BE=80?= =?UTF-8?q?=20plan=20=E4=B8=AD=E6=96=B0=E5=A2=9E=20effect=20=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E8=BE=85=E5=8A=A9=E5=87=BD=E6=95=B0=E4=BB=A5=E6=B6=88?= =?UTF-8?q?=E9=99=A4=E6=A8=A1=E6=9D=BF=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/plan.c | 119 ++++++++++++++++++++++++++++++++++++++++++ src/core/plan.h | 18 +++++++ src/core/policy.c | 129 +++++++++------------------------------------- src/core/types.h | 4 ++ 4 files changed, 164 insertions(+), 106 deletions(-) diff --git a/src/core/plan.c b/src/core/plan.c index 8d7a942..a27b635 100644 --- a/src/core/plan.c +++ b/src/core/plan.c @@ -4,6 +4,7 @@ #include "base/array.h" #include "base/memory.h" +#include "core/types.h" static void free_memory_hold_by_effects(effect_t *effects, size_t count) { for (size_t i = 0; i < count; ++i) { @@ -43,3 +44,121 @@ void plan_push_effect(plan_t *plan, const effect_t *effect) { effect_t *eft = array_push(plan->effects, plan->count, plan->capacity); *eft = *effect; } + +void plan_push_map_effect(plan_t *plan, window_id_t window_id) { + if (window_id_invalid(window_id)) return; + + effect_t effect = { + .type = ZDWM_EFFECT_MAP_WINDOW, + .as.map.window = window_id, + }; + plan_push_effect(plan, &effect); +} + +void plan_push_unmap_effect(plan_t *plan, window_id_t window_id) { + if (window_id_invalid(window_id)) return; + + effect_t effect = { + .type = ZDWM_EFFECT_UNMAP_WINDOW, + .as.unmap.window = window_id, + }; + plan_push_effect(plan, &effect); +} + +void plan_push_focus_effect(plan_t *plan, window_id_t window_id) { + if (window_id_invalid(window_id)) return; + + effect_t effect = { + .type = ZDWM_EFFECT_FOCUS_WINDOW, + .as.focus.window = window_id, + }; + plan_push_effect(plan, &effect); +} + +void plan_push_kill_effect(plan_t *plan, window_id_t window_id) { + if (window_id_invalid(window_id)) return; + + effect_t effect = { + .type = ZDWM_EFFECT_KILL_WINDOW, + .as.kill.window = window_id, + }; + plan_push_effect(plan, &effect); +} + +void plan_push_withdraw_effect(plan_t *plan, window_id_t window_id) { + if (window_id_invalid(window_id)) return; + + effect_t effect = { + .type = ZDWM_EFFECT_WITHDRAW_WINDOW, + .as.withdraw.window = window_id, + }; + plan_push_effect(plan, &effect); +} + +void plan_push_fullscreen_effect( + plan_t *plan, + window_id_t window_id, + bool value +) { + if (window_id_invalid(window_id)) return; + + effect_t effect = { + .type = ZDWM_EFFECT_FULLSCREEN_WINDOW, + .as.fullscreen = { + .window = window_id, + .value = value, + }, + }; + plan_push_effect(plan, &effect); +} + +void plan_push_maximize_effect( + plan_t *plan, + window_id_t window_id, + bool value +) { + if (window_id_invalid(window_id)) return; + + effect_t effect = { + .type = ZDWM_EFFECT_MAXIMIZE_WINDOW, + .as.maximize = { + .window = window_id, + .value = value, + }, + }; + plan_push_effect(plan, &effect); +} + +void plan_push_minimize_effect( + plan_t *plan, + window_id_t window_id, + bool value +) { + if (window_id_invalid(window_id)) return; + + effect_t effect = { + .type = ZDWM_EFFECT_MINIMIZE_WINDOW, + .as.minimize = { + .window = window_id, + .value = value, + }, + }; + plan_push_effect(plan, &effect); +} + +void plan_push_change_border_color_effect( + plan_t *plan, + window_id_t window_id, + const color_t *color +) { + if (window_id_invalid(window_id) || color == nullptr) return; + + effect_t effect = { + .type = ZDWM_EFFECT_CHANGE_BORDER_COLOR, + .as.change_border_color = { + .window = window_id, + .color = color, + }, + }; + plan_push_effect(plan, &effect); +} diff --git a/src/core/plan.h b/src/core/plan.h index 47d1fb9..45eb1bb 100644 --- a/src/core/plan.h +++ b/src/core/plan.h @@ -82,3 +82,21 @@ typedef struct plan_t { void plan_reset(plan_t *plan); void plan_cleanup(plan_t *plan); void plan_push_effect(plan_t *plan, const effect_t *effect); + +void plan_push_map_effect(plan_t *plan, window_id_t window_id); +void plan_push_unmap_effect(plan_t *plan, window_id_t window_id); +void plan_push_focus_effect(plan_t *plan, window_id_t window_id); +void plan_push_kill_effect(plan_t *plan, window_id_t window_id); +void plan_push_withdraw_effect(plan_t *plan, window_id_t window_id); +void plan_push_fullscreen_effect( + plan_t *plan, + window_id_t window_id, + bool value +); +void plan_push_maximize_effect(plan_t *plan, window_id_t window_id, bool value); +void plan_push_minimize_effect(plan_t *plan, window_id_t window_id, bool value); +void plan_push_change_border_color_effect( + plan_t *plan, + window_id_t window_id, + const color_t *color +); diff --git a/src/core/policy.c b/src/core/policy.c index 2b6875b..18ed02b 100644 --- a/src/core/policy.c +++ b/src/core/policy.c @@ -4,7 +4,6 @@ #include #include -#include "base/color.h" #include "base/macros.h" #include "base/window_list.h" #include "core/binding.h" @@ -222,18 +221,6 @@ static void adjust_layout_windows_border_width( window_list_reset(&list); } -static void window_change_border_color( - window_id_t window_id, - const color_t *color, - plan_t *plan -) { - effect_t change_border_color_effect = { - .type = ZDWM_EFFECT_CHANGE_BORDER_COLOR, - .as.change_border_color = {.window = window_id, .color = color} - }; - plan_push_effect(plan, &change_border_color_effect); -} - static void set_foucs_window( const policy_context_t *ctx, workspace_id_t workspace_id, @@ -250,18 +237,15 @@ static void set_foucs_window( if (window_id == old_focused_window_id) return; state_workspace_set_focused_window(state, workspace_id, window_id); - effect_t focus_effect = { - .type = ZDWM_EFFECT_FOCUS_WINDOW, - .as.focus.window = window_id, - }; - plan_push_effect(plan, &focus_effect); + plan_push_focus_effect(plan, window_id); if (state_window_get(state, window_id)) { - window_change_border_color(window_id, &border->focused_color, plan); + auto color = &border->focused_color; + plan_push_change_border_color_effect(plan, window_id, color); } if (state_window_get(state, old_focused_window_id)) { auto color = &border->normal_color; - window_change_border_color(old_focused_window_id, color, plan); + plan_push_change_border_color_effect(plan, old_focused_window_id, color); } } @@ -287,16 +271,8 @@ static void manage_window( if (!state_workspace_show(state, command->workspace)) return; - effect_t map_effect = { - .type = ZDWM_EFFECT_MAP_WINDOW, - .as.map.window = window_id, - }; - effect_t focus_effect = { - .type = ZDWM_EFFECT_FOCUS_WINDOW, - .as.focus.window = window_id, - }; - plan_push_effect(plan, &map_effect); - plan_push_effect(plan, &focus_effect); + plan_push_map_effect(plan, window_id); + plan_push_focus_effect(plan, window_id); if (window_need_layout(window)) { plan->need_relayout = true; @@ -333,28 +309,16 @@ static void add_switch_workspace_effects( if (window->sticky) continue; if (window->workspace_id == old_workspace) { - effect_t unmap_effect = { - .type = ZDWM_EFFECT_UNMAP_WINDOW, - .as.unmap.window = window->id, - }; - plan_push_effect(plan, &unmap_effect); + plan_push_unmap_effect(plan, window->id); } else if (window->workspace_id == new_workspace) { - effect_t map_effect = { - .type = ZDWM_EFFECT_MAP_WINDOW, - .as.map.window = window->id, - }; - plan_push_effect(plan, &map_effect); + plan_push_map_effect(plan, window->id); } } const workspace_t *workspace = state_workspace_get(state, new_workspace); if (!workspace) return; - effect_t focus_effect = { - .type = ZDWM_EFFECT_FOCUS_WINDOW, - .as.focus.window = workspace->focused_window_id - }; - plan_push_effect(plan, &focus_effect); + plan_push_focus_effect(plan, workspace->focused_window_id); } static void @@ -378,11 +342,7 @@ unmanage_window(const policy_context_t *ctx, window_id_t window, plan_t *plan) { if (output->current_workspace_id != workspace_id) return; if (old_focused_window != workspace->focused_window_id) { - effect_t focus_effect = { - .type = ZDWM_EFFECT_FOCUS_WINDOW, - .as.focus.window = workspace->focused_window_id - }; - plan_push_effect(plan, &focus_effect); + plan_push_focus_effect(plan, workspace->focused_window_id); } } @@ -399,33 +359,21 @@ focus_window(const policy_context_t *ctx, window_id_t window, plan_t *plan) { set_foucs_window(ctx, workspace_id, window, plan); if (old_focused_window == workspace->focused_window_id) return; - effect_t focus_effect = { - .type = ZDWM_EFFECT_FOCUS_WINDOW, - .as.focus.window = workspace->focused_window_id, - }; - plan_push_effect(plan, &focus_effect); + plan_push_focus_effect(plan, workspace->focused_window_id); } static void kill_window(state_t *state, window_id_t window, plan_t *plan) { auto win = state_window_get(state, window); if (!win) return; - effect_t kill_effect = { - .type = ZDWM_EFFECT_KILL_WINDOW, - .as.kill.window = window, - }; - plan_push_effect(plan, &kill_effect); + plan_push_kill_effect(plan, window); } static void withdraw_window(state_t *state, window_id_t window, plan_t *plan) { auto win = state_window_get(state, window); if (!win) return; - effect_t withdraw_window_effect = { - .type = ZDWM_EFFECT_WITHDRAW_WINDOW, - .as.withdraw.window = window, - }; - plan_push_effect(plan, &withdraw_window_effect); + plan_push_withdraw_effect(plan, window); } static void @@ -494,11 +442,7 @@ static void fullscreen_window( } state_window_set_border_width(state, window_id, 0); - effect_t fullscreen_window_effect = { - .type = ZDWM_EFFECT_FULLSCREEN_WINDOW, - .as.fullscreen = {.window = window_id, .value = value}, - }; - plan_push_effect(plan, &fullscreen_window_effect); + plan_push_fullscreen_effect(plan, window_id, value); if (value) { state_window_set_geometry_mode(state, window_id, ZDWM_GEOMETRY_FULLSCREEN); @@ -536,11 +480,7 @@ static void maximize_window( } state_window_set_border_width(state, window_id, 0); - effect_t maximize_window_effect = { - .type = ZDWM_EFFECT_MAXIMIZE_WINDOW, - .as.maximize = {.window = window_id, .value = value}, - }; - plan_push_effect(plan, &maximize_window_effect); + plan_push_maximize_effect(plan, window_id, value); if (value) { state_window_set_geometry_mode(state, window_id, ZDWM_GEOMETRY_MAXIMIZED); @@ -576,48 +516,25 @@ static void minimize_window( return; } - effect_t minimize_window_effect = { - .type = ZDWM_EFFECT_MINIMIZE_WINDOW, - .as.minimize = {.window = window_id, .value = value}, - }; - plan_push_effect(plan, &minimize_window_effect); + plan_push_minimize_effect(plan, window_id, value); if (value) { - effect_t unmap_effect = { - .type = ZDWM_EFFECT_UNMAP_WINDOW, - .as.unmap.window = window_id, - }; - plan_push_effect(plan, &unmap_effect); + plan_push_unmap_effect(plan, window_id); auto workspace = state_workspace_get(state, window->workspace_id); auto old_focused_window_id = workspace->focused_window_id; state_window_set_geometry_mode(state, window_id, ZDWM_GEOMETRY_MINIMIZED); auto new_focused_window_id = workspace->focused_window_id; if (old_focused_window_id != new_focused_window_id) { - effect_t change_old_border_color_effect = { - .type = ZDWM_EFFECT_CHANGE_BORDER_COLOR, - .as.change_border_color = { - .window = old_focused_window_id, - .color = &ctx->border->normal_color - } - }; - effect_t change_new_border_color_effect = { - .type = ZDWM_EFFECT_CHANGE_BORDER_COLOR, - .as.change_border_color = { - .window = new_focused_window_id, - .color = &ctx->border->normal_color - } - }; - plan_push_effect(plan, &change_old_border_color_effect); - plan_push_effect(plan, &change_new_border_color_effect); + auto color = &ctx->border->normal_color; + plan_push_change_border_color_effect(plan, old_focused_window_id, color); + + color = &ctx->border->focused_color; + plan_push_change_border_color_effect(plan, new_focused_window_id, color); } } else { state_window_set_geometry_mode(state, window_id, ZDWM_GEOMETRY_NORMAL); - effect_t map_effect = { - .type = ZDWM_EFFECT_MAP_WINDOW, - .as.map.window = window_id - }; - plan_push_effect(plan, &map_effect); + plan_push_map_effect(plan, window_id); set_foucs_window(ctx, window->workspace_id, window_id, plan); } diff --git a/src/core/types.h b/src/core/types.h index 7617b5a..2dd81d8 100644 --- a/src/core/types.h +++ b/src/core/types.h @@ -105,3 +105,7 @@ typedef struct border_config_t { typedef struct only_window_data_t { window_id_t window; } only_window_data_t; + +static inline bool window_id_invalid(window_id_t window_id) { + return window_id == ZDWM_WINDOW_ID_INVALID; +}