feat(core+backend/X11): 区分窗口销毁和撤销

This commit is contained in:
2026-04-27 22:28:43 +08:00
parent 8d838135d6
commit 722d3946c6
7 changed files with 76 additions and 7 deletions

View File

@@ -6,6 +6,7 @@
typedef enum command_type_t {
ZDWM_COMMAND_MANAGE_WINDOW,
ZDWM_COMMAND_UNMANAGE_WINDOW,
ZDWM_COMMAND_WITHDRAW_WINDOW,
ZDWM_COMMAND_FOCUS_WINDOW,
ZDWM_COMMAND_KILL_WINDOW,
ZDWM_COMMAND_SWITCH_WORKSPACE,
@@ -40,6 +41,7 @@ typedef struct command_t {
union {
manage_window_command_t manage_window;
only_window_command_t unmanage;
only_window_command_t withdraw;
only_window_command_t focus;
only_window_command_t kill;
switch_workspace_command_t switch_workspace;

View File

@@ -10,6 +10,7 @@ typedef enum effect_type_t {
ZDWM_EFFECT_UNMAP_WINDOW,
ZDWM_EFFECT_FOCUS_WINDOW,
ZDWM_EFFECT_KILL_WINDOW,
ZDWM_EFFECT_WITHDRAW_WINDOW,
ZDWM_EFFECT_MOVE_WINDOW,
ZDWM_EFFECT_RESIZE_WINDOW,
ZDWM_EFFECT_CHANGE_BORDER_COLOR,
@@ -61,6 +62,7 @@ typedef struct effect_t {
effect_only_window_id_t unmap;
effect_only_window_id_t focus;
effect_only_window_id_t kill;
effect_only_window_id_t withdraw;
effect_move_window_t move;
effect_resize_window_t resize;
effect_change_border_color_t change_border_color;

View File

@@ -119,11 +119,22 @@ static void route_window_remove(
const window_t *window = state_window_get(state, e->window);
if (!window) return;
command_t unmanage_window_cmd = {
.type = ZDWM_COMMAND_UNMANAGE_WINDOW,
.as.unmanage.window = e->window,
};
command_buffer_push(out, &unmanage_window_cmd);
switch (e->reason) {
case ZDWM_WINDOW_REMOVE_WITHDRAWN:
command_t withdrawn_window_cmd = {
.type = ZDWM_COMMAND_WITHDRAW_WINDOW,
.as.withdraw.window = e->window,
};
command_buffer_push(out, &withdrawn_window_cmd);
break;
case ZDWM_WINDOW_REMOVE_DESTROY:
command_t unmanage_window_cmd = {
.type = ZDWM_COMMAND_UNMANAGE_WINDOW,
.as.unmanage.window = e->window,
};
command_buffer_push(out, &unmanage_window_cmd);
break;
}
}
void policy_route_event(
@@ -232,6 +243,18 @@ static void unmanage_window(state_t *state, window_id_t window, plan_t *plan) {
}
}
static void
withdraw_window(const 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 = win->id,
};
plan_push_effect(plan, &withdraw_window_effect);
}
static void focus_window(state_t *state, window_id_t window, plan_t *plan) {
auto win = state_window_get(state, window);
if (!win) return;
@@ -298,6 +321,9 @@ void policy_apply_command(
case ZDWM_COMMAND_UNMANAGE_WINDOW:
unmanage_window(state, cmd->as.unmanage.window, plan);
break;
case ZDWM_COMMAND_WITHDRAW_WINDOW:
withdraw_window(state, cmd->as.withdraw.window, plan);
break;
case ZDWM_COMMAND_FOCUS_WINDOW:
focus_window(state, cmd->as.focus.window, plan);
break;