From d07d2f64e19082eef361661d562e4e4b6b54aae4 Mon Sep 17 00:00:00 2001 From: Zedhugh Chen Date: Thu, 4 Jun 2026 22:28:39 +0800 Subject: [PATCH] =?UTF-8?q?refactor(policy):=20=E6=8F=90=E5=8F=96=E5=88=87?= =?UTF-8?q?=E6=8D=A2=20workspace=20=E5=92=8C=E7=AA=97=E5=8F=A3=E8=81=9A?= =?UTF-8?q?=E7=84=A6=E7=9A=84=E5=91=BD=E4=BB=A4=E6=9E=84=E9=80=A0=E8=BE=85?= =?UTF-8?q?=E5=8A=A9=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/zdwm/action.h | 7 ++++ src/core/policy.c | 86 ++++++++++++++++++------------------------- 2 files changed, 43 insertions(+), 50 deletions(-) diff --git a/include/zdwm/action.h b/include/zdwm/action.h index 916c384..3511185 100644 --- a/include/zdwm/action.h +++ b/include/zdwm/action.h @@ -9,11 +9,13 @@ extern "C" { #endif typedef enum zdwm_action_type_t { + ZDWM_ACTION_NONE, ZDWM_ACTION_SPAWN, ZDWM_ACTION_QUIT, ZDWM_ACTION_RAISE_OR_RUN, ZDWM_ACTION_OUTPUT_CYCLE, + ZDWM_ACTION_WORKSPACE_SWITCH, ZDWM_ACTION_WORKSPACE_SWITCH_SAME_OUTPUT_BY_INDEX, ZDWM_ACTION_LAYOUT_CYCLE, ZDWM_ACTION_BINDING_MODE_CYCLE, @@ -52,6 +54,10 @@ typedef struct zdwm_action_data_index_only_t { uint32_t index; } zdwm_action_data_index_only_t; +typedef struct zdwm_action_data_switch_workspace_t { + zdwm_workspace_id_t workspace; +} zdwm_action_data_switch_workspace_t; + typedef struct zdwm_action_data_window_send_to_workspace_t { uint32_t index; bool switch_workspace; @@ -70,6 +76,7 @@ typedef struct zdwm_action_t { zdwm_action_data_raise_or_run_t raise_or_run; zdwm_action_data_delta_only_t output_cycle; zdwm_action_data_index_only_t workspace_switch_same_output_by_index; + zdwm_action_data_switch_workspace_t switch_workspace; zdwm_action_data_delta_only_t layout_cycle; zdwm_action_data_delta_only_t binding_mode_cycle; zdwm_action_data_delta_only_t window_focus_cycle; diff --git a/src/core/policy.c b/src/core/policy.c index 7e3bed5..c7c9e69 100644 --- a/src/core/policy.c +++ b/src/core/policy.c @@ -60,6 +60,26 @@ get_next_window_by_class(const state_t *state, const char *class_name) { return nullptr; } +static void add_switch_workspace_command( + command_buffer_t *command_buffer, + workspace_id_t workspace +) { + command_t switch_workspace_cmd = { + .type = ZDWM_COMMAND_SWITCH_WORKSPACE, + .as.switch_workspace.workspace = workspace, + }; + command_buffer_push(command_buffer, &switch_workspace_cmd); +} + +static void +add_focus_window_command(command_buffer_t *command_buffer, window_id_t window) { + command_t focus_command = { + .type = ZDWM_COMMAND_FOCUS_WINDOW, + .as.focus.window = window, + }; + command_buffer_push(command_buffer, &focus_command); +} + static void raise_or_run( const state_t *state, const zdwm_action_data_raise_or_run_t *data, @@ -71,17 +91,8 @@ static void raise_or_run( return; } - command_t switch_workspace_cmd = { - .type = ZDWM_COMMAND_SWITCH_WORKSPACE, - .as.switch_workspace.workspace = window->workspace_id, - }; - command_buffer_push(command_buffer, &switch_workspace_cmd); - - command_t focus_cmd = { - .type = ZDWM_COMMAND_FOCUS_WINDOW, - .as.focus.window = window->id, - }; - command_buffer_push(command_buffer, &focus_cmd); + add_switch_workspace_command(command_buffer, window->workspace_id); + add_focus_window_command(command_buffer, window->id); } static output_id_t get_cycled_output(const state_t *state, int32_t delta) { @@ -123,11 +134,7 @@ static void switch_workspace_same_output_by_index( if (workspace->output_id != output->id) continue; if (count == index) { - command_t switch_workspace_cmd = { - .type = ZDWM_COMMAND_SWITCH_WORKSPACE, - .as.switch_workspace.workspace = workspace->id, - }; - command_buffer_push(command_buffer, &switch_workspace_cmd); + add_switch_workspace_command(command_buffer, workspace->id); return; } count++; @@ -269,11 +276,7 @@ static void cycle_focused_window( auto target = state_window_at(state, indices[next]); - command_t focus_cmd = { - .type = ZDWM_COMMAND_FOCUS_WINDOW, - .as.focus.window = target->id, - }; - command_buffer_push(command_buffer, &focus_cmd); + add_focus_window_command(command_buffer, target->id); command_t raise_cmd = { .type = ZDWM_COMMAND_RAISE_WINDOW, @@ -339,11 +342,7 @@ static void send_window_to_workspace_same_output_by_index( if (current_workspace->id == target_workspace->id) return; if (data->switch_workspace) { - command_t switch_workspace_command = { - .type = ZDWM_COMMAND_SWITCH_WORKSPACE, - .as.switch_workspace.workspace = target_workspace->id, - }; - command_buffer_push(command_buffer, &switch_workspace_command); + add_switch_workspace_command(command_buffer, target_workspace->id); } command_t send_window_to_workspace_command = { @@ -362,6 +361,8 @@ static void policy_resolve_action( command_buffer_t *out ) { switch (action->type) { + case ZDWM_ACTION_NONE: + break; case ZDWM_ACTION_SPAWN: spawn(action->as.spawn.command); break; @@ -374,6 +375,9 @@ static void policy_resolve_action( case ZDWM_ACTION_OUTPUT_CYCLE: cycle_current_output(ctx->state, action->as.output_cycle.delta, out); break; + case ZDWM_ACTION_WORKSPACE_SWITCH: + add_switch_workspace_command(out, action->as.switch_workspace.workspace); + break; case ZDWM_ACTION_WORKSPACE_SWITCH_SAME_OUTPUT_BY_INDEX: { auto index = action->as.workspace_switch_same_output_by_index.index; switch_workspace_same_output_by_index(ctx->state, index, out); @@ -440,11 +444,7 @@ static void route_key_press( static void route_pointer_enter(state_t *state, window_id_t window, command_buffer_t *out) { - command_t focus_command = { - .type = ZDWM_COMMAND_FOCUS_WINDOW, - .as.focus.window = window, - }; - command_buffer_push(out, &focus_command); + add_focus_window_command(out, window); } static workspace_id_t derive_window_workspace(const state_t *state) { @@ -511,12 +511,7 @@ static void route_map_request( const workspace_t *workspace = state_workspace_get(state, workspace_id); if (!workspace) return; - command_t switch_workspace_cmd = { - .type = ZDWM_COMMAND_SWITCH_WORKSPACE, - .as.switch_workspace.workspace = workspace_id, - }; - - command_buffer_push(out, &switch_workspace_cmd); + add_switch_workspace_command(out, workspace_id); } static void route_window_remove( @@ -594,19 +589,10 @@ static void route_window_activate_request( }; command_buffer_push(out, &change_window_state_cmd); } break; - case ZDWM_WINDOW_ACTIVATION_SOURCE_PAGER: { - command_t switch_workspace_cmd = { - .type = ZDWM_COMMAND_SWITCH_WORKSPACE, - .as.switch_workspace.workspace = window->workspace_id, - }; - command_buffer_push(out, &switch_workspace_cmd); - - command_t focus_cmd = { - .type = ZDWM_COMMAND_FOCUS_WINDOW, - .as.focus.window = window->id, - }; - command_buffer_push(out, &focus_cmd); - } break; + case ZDWM_WINDOW_ACTIVATION_SOURCE_PAGER: + add_switch_workspace_command(out, window->workspace_id); + add_focus_window_command(out, window->id); + break; } }