refactor(policy): 提取切换 workspace 和窗口聚焦的命令构造辅助函数

This commit is contained in:
2026-06-04 22:28:39 +08:00
parent 0d43c79ad6
commit d07d2f64e1
2 changed files with 43 additions and 50 deletions

View File

@@ -9,11 +9,13 @@ extern "C" {
#endif #endif
typedef enum zdwm_action_type_t { typedef enum zdwm_action_type_t {
ZDWM_ACTION_NONE,
ZDWM_ACTION_SPAWN, ZDWM_ACTION_SPAWN,
ZDWM_ACTION_QUIT, ZDWM_ACTION_QUIT,
ZDWM_ACTION_RAISE_OR_RUN, ZDWM_ACTION_RAISE_OR_RUN,
ZDWM_ACTION_OUTPUT_CYCLE, ZDWM_ACTION_OUTPUT_CYCLE,
ZDWM_ACTION_WORKSPACE_SWITCH,
ZDWM_ACTION_WORKSPACE_SWITCH_SAME_OUTPUT_BY_INDEX, ZDWM_ACTION_WORKSPACE_SWITCH_SAME_OUTPUT_BY_INDEX,
ZDWM_ACTION_LAYOUT_CYCLE, ZDWM_ACTION_LAYOUT_CYCLE,
ZDWM_ACTION_BINDING_MODE_CYCLE, ZDWM_ACTION_BINDING_MODE_CYCLE,
@@ -52,6 +54,10 @@ typedef struct zdwm_action_data_index_only_t {
uint32_t index; uint32_t index;
} zdwm_action_data_index_only_t; } 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 { typedef struct zdwm_action_data_window_send_to_workspace_t {
uint32_t index; uint32_t index;
bool switch_workspace; 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_raise_or_run_t raise_or_run;
zdwm_action_data_delta_only_t output_cycle; zdwm_action_data_delta_only_t output_cycle;
zdwm_action_data_index_only_t workspace_switch_same_output_by_index; 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 layout_cycle;
zdwm_action_data_delta_only_t binding_mode_cycle; zdwm_action_data_delta_only_t binding_mode_cycle;
zdwm_action_data_delta_only_t window_focus_cycle; zdwm_action_data_delta_only_t window_focus_cycle;

View File

@@ -60,6 +60,26 @@ get_next_window_by_class(const state_t *state, const char *class_name) {
return nullptr; 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( static void raise_or_run(
const state_t *state, const state_t *state,
const zdwm_action_data_raise_or_run_t *data, const zdwm_action_data_raise_or_run_t *data,
@@ -71,17 +91,8 @@ static void raise_or_run(
return; return;
} }
command_t switch_workspace_cmd = { add_switch_workspace_command(command_buffer, window->workspace_id);
.type = ZDWM_COMMAND_SWITCH_WORKSPACE, add_focus_window_command(command_buffer, window->id);
.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);
} }
static output_id_t get_cycled_output(const state_t *state, int32_t delta) { 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 (workspace->output_id != output->id) continue;
if (count == index) { if (count == index) {
command_t switch_workspace_cmd = { add_switch_workspace_command(command_buffer, workspace->id);
.type = ZDWM_COMMAND_SWITCH_WORKSPACE,
.as.switch_workspace.workspace = workspace->id,
};
command_buffer_push(command_buffer, &switch_workspace_cmd);
return; return;
} }
count++; count++;
@@ -269,11 +276,7 @@ static void cycle_focused_window(
auto target = state_window_at(state, indices[next]); auto target = state_window_at(state, indices[next]);
command_t focus_cmd = { add_focus_window_command(command_buffer, target->id);
.type = ZDWM_COMMAND_FOCUS_WINDOW,
.as.focus.window = target->id,
};
command_buffer_push(command_buffer, &focus_cmd);
command_t raise_cmd = { command_t raise_cmd = {
.type = ZDWM_COMMAND_RAISE_WINDOW, .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 (current_workspace->id == target_workspace->id) return;
if (data->switch_workspace) { if (data->switch_workspace) {
command_t switch_workspace_command = { add_switch_workspace_command(command_buffer, target_workspace->id);
.type = ZDWM_COMMAND_SWITCH_WORKSPACE,
.as.switch_workspace.workspace = target_workspace->id,
};
command_buffer_push(command_buffer, &switch_workspace_command);
} }
command_t send_window_to_workspace_command = { command_t send_window_to_workspace_command = {
@@ -362,6 +361,8 @@ static void policy_resolve_action(
command_buffer_t *out command_buffer_t *out
) { ) {
switch (action->type) { switch (action->type) {
case ZDWM_ACTION_NONE:
break;
case ZDWM_ACTION_SPAWN: case ZDWM_ACTION_SPAWN:
spawn(action->as.spawn.command); spawn(action->as.spawn.command);
break; break;
@@ -374,6 +375,9 @@ static void policy_resolve_action(
case ZDWM_ACTION_OUTPUT_CYCLE: case ZDWM_ACTION_OUTPUT_CYCLE:
cycle_current_output(ctx->state, action->as.output_cycle.delta, out); cycle_current_output(ctx->state, action->as.output_cycle.delta, out);
break; 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: { case ZDWM_ACTION_WORKSPACE_SWITCH_SAME_OUTPUT_BY_INDEX: {
auto index = action->as.workspace_switch_same_output_by_index.index; auto index = action->as.workspace_switch_same_output_by_index.index;
switch_workspace_same_output_by_index(ctx->state, index, out); switch_workspace_same_output_by_index(ctx->state, index, out);
@@ -440,11 +444,7 @@ static void route_key_press(
static void static void
route_pointer_enter(state_t *state, window_id_t window, command_buffer_t *out) { route_pointer_enter(state_t *state, window_id_t window, command_buffer_t *out) {
command_t focus_command = { add_focus_window_command(out, window);
.type = ZDWM_COMMAND_FOCUS_WINDOW,
.as.focus.window = window,
};
command_buffer_push(out, &focus_command);
} }
static workspace_id_t derive_window_workspace(const state_t *state) { 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); const workspace_t *workspace = state_workspace_get(state, workspace_id);
if (!workspace) return; if (!workspace) return;
command_t switch_workspace_cmd = { add_switch_workspace_command(out, workspace_id);
.type = ZDWM_COMMAND_SWITCH_WORKSPACE,
.as.switch_workspace.workspace = workspace_id,
};
command_buffer_push(out, &switch_workspace_cmd);
} }
static void route_window_remove( static void route_window_remove(
@@ -594,19 +589,10 @@ static void route_window_activate_request(
}; };
command_buffer_push(out, &change_window_state_cmd); command_buffer_push(out, &change_window_state_cmd);
} break; } break;
case ZDWM_WINDOW_ACTIVATION_SOURCE_PAGER: { case ZDWM_WINDOW_ACTIVATION_SOURCE_PAGER:
command_t switch_workspace_cmd = { add_switch_workspace_command(out, window->workspace_id);
.type = ZDWM_COMMAND_SWITCH_WORKSPACE, add_focus_window_command(out, window->id);
.as.switch_workspace.workspace = window->workspace_id, break;
};
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;
} }
} }