bool transfer_desktop(monitor_t *ms, monitor_t *md, desktop_t *d) { if (ms == NULL || md == NULL || d == NULL || ms == md) { return false; } bool was_active = (d == ms->desk); unlink_desktop(ms, d); if (md->desk != NULL) { hide_desktop(d); } insert_desktop(md, d); history_transfer_desktop(md, d); if (was_active) { if (mon == ms) { focus_node(ms, NULL, NULL); } else { activate_node(ms, NULL, NULL); } } if (ms->sticky_count > 0 && was_active) { sticky_still = false; transfer_sticky_nodes(ms, d, ms->desk, d->root); sticky_still = true; } adapt_geometry(&ms->rectangle, &md->rectangle, d->root); arrange(md, d); if (md->desk == d) { if (mon == md) { focus_node(md, d, d->focus); } else { activate_node(md, d, d->focus); } } ewmh_update_wm_desktops(); ewmh_update_desktop_names(); ewmh_update_current_desktop(); put_status(SBSC_MASK_DESKTOP_TRANSFER, "desktop_transfer 0x%08X 0x%08X 0x%08X\n", ms->id, d->id, md->id); put_status(SBSC_MASK_REPORT); return true; }
void activate_desktop(monitor_t *m, desktop_t *d) { if (d == m->desk) { return; } show_desktop(d); hide_desktop(m->desk); m->desk = d; put_status(SBSC_MASK_DESKTOP_ACTIVATE, "desktop_activate %s %s\n", m->name, d->name); put_status(SBSC_MASK_REPORT); }
void focus_desktop(monitor_t *m, desktop_t *d) { focus_monitor(m); show_desktop(d); if (m->desk != d) { hide_desktop(m->desk); } m->desk = d; ewmh_update_current_desktop(); put_status(SBSC_MASK_DESKTOP_FOCUS, "desktop_focus %s %s\n", m->name, d->name); }
void focus_desktop(monitor_t *m, desktop_t *d) { focus_monitor(m); if (d == mon->desk) return; PRINTF("focus desktop %s\n", d->name); show_desktop(d); hide_desktop(mon->desk); mon->desk = d; ewmh_update_current_desktop(); put_status(); }
bool activate_desktop(monitor_t *m, desktop_t *d) { if (m == mon || d == m->desk) { return false; } if (m->sticky_count > 0) { sticky_still = false; transfer_sticky_nodes(m, m->desk, d, m->desk->root); sticky_still = true; } show_desktop(d); hide_desktop(m->desk); m->desk = d; put_status(SBSC_MASK_DESKTOP_ACTIVATE, "desktop_activate 0x%08X 0x%08X\n", m->id, d->id); put_status(SBSC_MASK_REPORT); return true; }
void focus_desktop(monitor_t *m, desktop_t *d) { bool changed = (m != mon || m->desk != d); focus_monitor(m); if (m->desk != d) { if (focus_follows_pointer) { listen_enter_notify(d->root, false); } show_desktop(d); hide_desktop(m->desk); if (focus_follows_pointer) { listen_enter_notify(d->root, true); } m->desk = d; } if (changed) { ewmh_update_current_desktop(); put_status(SBSC_MASK_DESKTOP_FOCUS, "desktop_focus 0x%08X 0x%08X\n", m->id, d->id); } }
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(); }