refactor(policy): 统一 output 切换逻辑并添加 workspace 切换通知

This commit is contained in:
2026-06-09 23:05:54 +08:00
parent 4535e171a0
commit 4e713682e4

View File

@@ -14,6 +14,7 @@
#include "core/command_buffer.h" #include "core/command_buffer.h"
#include "core/event.h" #include "core/event.h"
#include "core/layout.h" #include "core/layout.h"
#include "core/listeners.h"
#include "core/plan.h" #include "core/plan.h"
#include "core/rules.h" #include "core/rules.h"
#include "core/state.h" #include "core/state.h"
@@ -1306,11 +1307,25 @@ static void command_window_set_fullscreen(
fullscreen_window(ctx, data->window, data->state, plan); fullscreen_window(ctx, data->window, data->state, plan);
} }
static void static inline void change_current_output(
switch_workspace(state_t *state, workspace_id_t workspace_id, plan_t *plan) { state_t *state,
output_id_t output_id,
const listeners_t *listeners
) {
if (!state_set_current_output(state, output_id)) return;
listeners_notify_current_output(listeners, output_id);
}
static void switch_workspace(
const policy_context_t *ctx,
workspace_id_t workspace_id,
plan_t *plan
) {
auto state = ctx->state;
auto workspace = state_workspace_get(state, workspace_id); auto workspace = state_workspace_get(state, workspace_id);
if (!workspace) return; if (!workspace) return;
auto listeners = ctx->listeners;
auto output_id = workspace->output_id; auto output_id = workspace->output_id;
workspace_id_t old_workspace = ZDWM_WORKSPACE_ID_INVALID; workspace_id_t old_workspace = ZDWM_WORKSPACE_ID_INVALID;
@@ -1322,17 +1337,17 @@ switch_workspace(state_t *state, workspace_id_t workspace_id, plan_t *plan) {
)) { )) {
plan->need_relayout = true; plan->need_relayout = true;
add_switch_workspace_effects(state, old_workspace, workspace_id, plan); add_switch_workspace_effects(state, old_workspace, workspace_id, plan);
listeners_notify_workspace_active(listeners, output_id, workspace_id);
} }
state_set_current_output(state, output_id); change_current_output(state, output_id, listeners);
} }
static void set_current_output( static void set_current_output(
const policy_context_t *ctx, const policy_context_t *ctx,
const set_current_output_command_t *command const set_current_output_command_t *command
) { ) {
if (!state_set_current_output(ctx->state, command->output)) return; change_current_output(ctx->state, command->output, ctx->listeners);
listeners_notify_current_output(ctx->listeners, command->output);
} }
static void set_layout( static void set_layout(
@@ -1461,7 +1476,7 @@ void policy_apply_command(
command_window_set_fullscreen(ctx, &cmd->as.fullscreen, plan); command_window_set_fullscreen(ctx, &cmd->as.fullscreen, plan);
break; break;
case ZDWM_COMMAND_SWITCH_WORKSPACE: case ZDWM_COMMAND_SWITCH_WORKSPACE:
switch_workspace(state, cmd->as.switch_workspace.workspace, plan); switch_workspace(ctx, cmd->as.switch_workspace.workspace, plan);
break; break;
case ZDWM_COMMAND_SET_CURRENT_OUTPUT: case ZDWM_COMMAND_SET_CURRENT_OUTPUT:
set_current_output(ctx, &cmd->as.current_output); set_current_output(ctx, &cmd->as.current_output);