#pragma once #include "wm_types.h" typedef struct wm_manage_window_init_t { wm_window_geometry_mode_t geometry_mode; bool floating; bool sticky; bool urgent; bool set_focus; } wm_manage_window_init_t; typedef enum wm_command_type_t { WM_COMMAND_NONE, WM_COMMAND_MANAGE_WINDOW, WM_COMMAND_UNMANAGE_WINDOW, WM_COMMAND_FOCUS_WINDOW, WM_COMMAND_FOCUS_DIRECTION, WM_COMMAND_RAISE_WINDOW, WM_COMMAND_LOWER_WINDOW, WM_COMMAND_SWITCH_WORKSPACE, WM_COMMAND_SEND_WINDOW_TO_WORKSPACE, WM_COMMAND_SEND_WINDOW_TO_OUTPUT, WM_COMMAND_TOGGLE_FLOATING, WM_COMMAND_TOGGLE_STICKY, WM_COMMAND_TOGGLE_MAXIMIZE, WM_COMMAND_TOGGLE_FULLSCREEN, WM_COMMAND_TOGGLE_MINIMIZE, WM_COMMAND_MOVE_FLOATING_WINDOW, WM_COMMAND_RESIZE_FLOATING_WINDOW, WM_COMMAND_SET_LAYOUT, WM_COMMAND_CYCLE_LAYOUT, WM_COMMAND_REDRAW, WM_COMMAND_QUIT, } wm_command_type_t; typedef struct wm_command_t { wm_command_type_t type; union { struct { wm_window_id_t window_id; wm_workspace_id_t workspace_id; wm_manage_window_init_t initial_state; bool has_initial_float_rect; wm_rect_t initial_float_rect; } manage_window; struct { wm_window_id_t window_id; } unmanage_window; struct { wm_window_id_t window_id; } focus_window; struct { wm_output_id_t output_id; wm_focus_direction_t direction; } focus_direction; struct { wm_window_id_t window_id; } raise_window; struct { wm_window_id_t window_id; } lower_window; struct { wm_output_id_t output_id; wm_workspace_id_t workspace_id; } switch_workspace; struct { wm_window_id_t window_id; wm_workspace_id_t workspace_id; } send_window_to_workspace; struct { wm_window_id_t window_id; wm_output_id_t output_id; wm_cross_output_policy_t policy; } send_window_to_output; struct { wm_window_id_t window_id; } toggle_floating; struct { wm_window_id_t window_id; } toggle_sticky; struct { wm_window_id_t window_id; } toggle_maximize; struct { wm_window_id_t window_id; } toggle_fullscreen; struct { wm_window_id_t window_id; } toggle_minimize; struct { wm_window_id_t window_id; int16_t dx; int16_t dy; bool commit_workspace_change; wm_point_t anchor; wm_cross_output_policy_t policy; } move_floating_window; struct { wm_window_id_t window_id; int16_t dw; int16_t dh; } resize_floating_window; struct { wm_workspace_id_t workspace_id; wm_layout_id_t layout_id; } set_layout; struct { wm_workspace_id_t workspace_id; int direction; // 1: 下一个布局, -1: 上一个布局 } cycle_layout; } as; } wm_command_t;