bool swap_desktops(monitor_t *m1, desktop_t *d1, monitor_t *m2, desktop_t *d2) { if (d1 == NULL || d2 == NULL || d1 == d2 || (m1->desk == d1 && m1->sticky_count > 0) || (m2->desk == d2 && m2->sticky_count > 0)) { return false; } put_status(SBSC_MASK_DESKTOP_SWAP, "desktop_swap 0x%08X 0x%08X 0x%08X 0x%08X\n", m1->id, d1->id, m2->id, d2->id); bool d1_focused = (m1->desk == d1); bool d2_focused = (m2->desk == d2); if (m1 != m2) { if (m1->desk == d1) { m1->desk = d2; } if (m1->desk_head == d1) { m1->desk_head = d2; } if (m1->desk_tail == d1) { m1->desk_tail = d2; } if (m2->desk == d2) { m2->desk = d1; } if (m2->desk_head == d2) { m2->desk_head = d1; } if (m2->desk_tail == d2) { m2->desk_tail = d1; } } else { if (m1->desk == d1) { m1->desk = d2; } else if (m1->desk == d2) { m1->desk = d1; } if (m1->desk_head == d1) { m1->desk_head = d2; } else if (m1->desk_head == d2) { m1->desk_head = d1; } if (m1->desk_tail == d1) { m1->desk_tail = d2; } else if (m1->desk_tail == d2) { m1->desk_tail = d1; } } desktop_t *p1 = d1->prev; desktop_t *n1 = d1->next; desktop_t *p2 = d2->prev; desktop_t *n2 = d2->next; if (p1 != NULL && p1 != d2) { p1->next = d2; } if (n1 != NULL && n1 != d2) { n1->prev = d2; } if (p2 != NULL && p2 != d1) { p2->next = d1; } if (n2 != NULL && n2 != d1) { n2->prev = d1; } d1->prev = p2 == d1 ? d2 : p2; d1->next = n2 == d1 ? d2 : n2; d2->prev = p1 == d2 ? d1 : p1; d2->next = n1 == d2 ? d1 : n1; if (m1 != m2) { adapt_geometry(&m1->rectangle, &m2->rectangle, d1->root); adapt_geometry(&m2->rectangle, &m1->rectangle, d2->root); history_swap_desktops(m1, d1, m2, d2); arrange(m1, d2); arrange(m2, d1); } if (d1_focused && !d2_focused) { hide_desktop(d1); show_desktop(d2); } else if (!d1_focused && d2_focused) { show_desktop(d1); hide_desktop(d2); } if (d1 == mon->desk) { focus_node(m2, d1, d1->focus); } else if (d1 == m2->desk) { activate_node(m2, d1, d1->focus); } if (d2 == mon->desk) { focus_node(m1, d2, d2->focus); } else if (d2 == m1->desk) { activate_node(m1, d2, d2->focus); } ewmh_update_wm_desktops(); ewmh_update_desktop_names(); ewmh_update_current_desktop(); put_status(SBSC_MASK_REPORT); return true; }
void swap_desktops(monitor_t *m1, desktop_t *d1, monitor_t *m2, desktop_t *d2) { if (d1 == NULL || d2 == NULL || d1 == d2) return; PRINTF("swap desktops %s %s\n", d1->name, d2->name); bool d1_focused = (m1->desk == d1); bool d2_focused = (m2->desk == d2); if (m1 != m2) { if (m1->desk == d1) m1->desk = d2; if (m1->desk_head == d1) m1->desk_head = d2; if (m1->desk_tail == d1) m1->desk_tail = d2; if (m2->desk == d2) m2->desk = d1; if (m2->desk_head == d2) m2->desk_head = d1; if (m2->desk_tail == d2) m2->desk_tail = d1; } else { if (m1->desk_head == d1) m1->desk_head = d2; else if (m1->desk_head == d2) m1->desk_head = d1; if (m1->desk_tail == d1) m1->desk_tail = d2; else if (m1->desk_tail == d2) m1->desk_tail = d1; } desktop_t *p1 = d1->prev; desktop_t *n1 = d1->next; desktop_t *p2 = d2->prev; desktop_t *n2 = d2->next; if (p1 != NULL && p1 != d2) p1->next = d2; if (n1 != NULL && n1 != d2) n1->prev = d2; if (p2 != NULL && p2 != d1) p2->next = d1; if (n2 != NULL && n2 != d1) n2->prev = d1; d1->prev = p2 == d1 ? d2 : p2; d1->next = n2 == d1 ? d2 : n2; d2->prev = p1 == d2 ? d1 : p1; d2->next = n1 == d2 ? d1 : n1; if (m1 != m2) { for (node_t *n = first_extrema(d1->root); n != NULL; n = next_leaf(n, d1->root)) translate_client(m1, m2, n->client); for (node_t *n = first_extrema(d2->root); n != NULL; n = next_leaf(n, d2->root)) translate_client(m2, m1, n->client); history_swap_desktops(m1, d1, m2, d2); arrange(m1, d2); arrange(m2, d1); if (d1_focused && !d2_focused) { hide_desktop(d1); show_desktop(d2); } else if (!d1_focused && d2_focused) { show_desktop(d1); hide_desktop(d2); } } update_input_focus(); ewmh_update_wm_desktops(); ewmh_update_desktop_names(); ewmh_update_current_desktop(); put_status(); }