static void client_swap_layout_properties(Client *c1, Client *c2) { // Grid 属性交换 double grid_col_per = c1->grid_col_per; double grid_row_per = c1->grid_row_per; int32_t grid_col_idx = c1->grid_col_idx; int32_t grid_row_idx = c1->grid_row_idx; c1->grid_col_per = c2->grid_col_per; c1->grid_row_per = c2->grid_row_per; c1->grid_col_idx = c2->grid_col_idx; c1->grid_row_idx = c2->grid_row_idx; c2->grid_col_per = grid_col_per; c2->grid_row_per = grid_row_per; c2->grid_col_idx = grid_col_idx; c2->grid_row_idx = grid_row_idx; // Master / Stack 属性交换 double master_inner_per = c1->master_inner_per; double master_mfact_per = c1->master_mfact_per; double stack_inner_per = c1->stack_inner_per; c1->master_inner_per = c2->master_inner_per; c1->master_mfact_per = c2->master_mfact_per; c1->stack_inner_per = c2->stack_inner_per; c2->master_inner_per = master_inner_per; c2->master_mfact_per = master_mfact_per; c2->stack_inner_per = stack_inner_per; } static void client_swap_monitors_and_tags(Client *c1, Client *c2) { Monitor *tmp_mon = c2->mon; uint32_t tmp_tags = c2->tags; c2->mon = c1->mon; c1->mon = tmp_mon; c2->tags = c1->tags; c1->tags = tmp_tags; } static void finish_exchange_arrange_and_focus(Client *c1, Client *c2, Monitor *m1, Monitor *m2) { if (m1 != m2) { arrange(c1->mon, false, false); arrange(c2->mon, false, false); } else { arrange(c1->mon, false, false); } wl_list_remove(&c2->flink); wl_list_insert(&c1->flink, &c2->flink); } void client_tile_resize(Client *c, struct wlr_box geo, int32_t interact) { if (!ISSCROLLTILED(c)) return; if (!c->isfullscreen && !c->ismaximizescreen) { resize(c, geo, interact); } } static uint32_t next_client_id = 0; uint32_t generate_client_id(void) { return ++next_client_id; }