feat(core/policy): 实现 policy_apply_command 命令分发功能

This commit is contained in:
2026-04-19 23:38:43 +08:00
parent 92dcec0e79
commit a7225836e4
6 changed files with 151 additions and 16 deletions

View File

@@ -237,6 +237,12 @@ bool state_workspace_valid(const state_t *state, workspace_id_t id) {
#endif
}
bool state_workspace_show(const state_t *state, workspace_id_t workspace_id) {
auto workspace = state_workspace_get(state, workspace_id);
auto output = state_output_get(state, workspace->output_id);
return output->current_workspace_id == workspace_id;
}
const output_t *state_output_get(const state_t *state, output_id_t id) {
if (id < state->output_count) return &state->outputs[id];
return nullptr;
@@ -256,17 +262,20 @@ void state_output_set_workarea(
if (output) output->workarea = workarea;
}
void state_output_set_current_workspace(
bool state_output_set_current_workspace(
state_t *state,
output_id_t output_id,
workspace_id_t workspace_id
) {
output_t *output = (output_t *)state_output_get(state, output_id);
if (!output) return;
if (!output) return false;
const workspace_t *workspace = state_workspace_get(state, workspace_id);
if (!workspace || workspace->output_id != output_id) return;
if (!workspace || workspace->output_id != output_id) return false;
if (output->current_workspace_id == workspace_id) return false;
output->current_workspace_id = workspace_id;
return true;
}
size_t state_output_count(const state_t *state) { return state->output_count; }
@@ -294,6 +303,21 @@ void state_cycle_current_output(state_t *state, int delta) {
state->current_output_index = (size_t)next;
}
bool state_set_current_output(state_t *state, output_id_t output_id) {
for (size_t i = 0; i < state->output_count; ++i) {
auto output = &state->outputs[i];
if (output->id != output_id) continue;
if (i == state->current_output_index) return false;
state->current_output_index = i;
return true;
}
warn("state_set_current_output: invalid output_id %u", output_id);
return false;
}
static inline void window_set_geometry_mode(
window_t *window,
window_geometry_mode_t geometry_mode
@@ -634,3 +658,19 @@ bool state_stack_lower(state_t *state, window_id_t window_id) {
return layer_stack_lower(layer, window_id);
}
bool window_need_layout(const window_t *window) {
if (window->sticky || window->floating) {
return false;
}
switch (window->geometry_mode) {
case ZDWM_GEOMETRY_FULLSCREEN:
case ZDWM_GEOMETRY_MAXIMIZED:
case ZDWM_GEOMETRY_MINIMIZED:
return false;
default:
}
return true;
}