+ put_status();
+}
+
+void transfer_desktop(monitor_t *ms, monitor_t *md, desktop_t *d)
+{
+ if (ms == md)
+ return;
+
+ desktop_t *dd = ms->desk;
+ unlink_desktop(ms, d);
+ insert_desktop(md, d);
+
+ if (d == dd) {
+ if (ms->desk != NULL)
+ desktop_show(ms->desk);
+ if (md->desk != d)
+ desktop_hide(d);
+ }
+
+ for (node_t *n = first_extrema(d->root); n != NULL; n = next_leaf(n, d->root))
+ fit_monitor(md, n->client);
+ arrange(md, d);
+ if (d != dd && md->desk == d) {
+ desktop_show(d);
+ }
+
+ ewmh_update_wm_desktops();
+ ewmh_update_desktop_names();
+ ewmh_update_current_desktop();
+ put_status();
+}
+
+void merge_monitors(monitor_t *ms, monitor_t *md)
+{
+ PRINTF("merge %s into %s\n", ms->name, md->name);
+
+ desktop_t *d = ms->desk_head;
+ while (d != NULL) {
+ desktop_t *next = d->next;
+ transfer_desktop(ms, md, d);
+ d = next;
+ }
+}
+
+void swap_monitors(monitor_t *m1, monitor_t *m2)
+{
+ if (m1 == NULL || m2 == NULL || m1 == m2)
+ return;
+
+ if (mon_head == m1)
+ mon_head = m2;
+ else if (mon_head == m2)
+ mon_head = m1;
+ if (mon_tail == m1)
+ mon_tail = m2;
+ else if (mon_tail == m2)
+ mon_tail = m1;
+
+ monitor_t *p1 = m1->prev;
+ monitor_t *n1 = m1->next;
+ monitor_t *p2 = m2->prev;
+ monitor_t *n2 = m2->next;
+
+ if (p1 != NULL && p1 != m2)
+ p1->next = m2;
+ if (n1 != NULL && n1 != m2)
+ n1->prev = m2;
+ if (p2 != NULL && p2 != m1)
+ p2->next = m1;
+ if (n2 != NULL && n2 != m1)
+ n2->prev = m1;
+
+ m1->prev = p2 == m1 ? m2 : p2;
+ m1->next = n2 == m1 ? m2 : n2;
+ m2->prev = p1 == m2 ? m1 : p1;
+ m2->next = n1 == m2 ? m1 : n1;
+
+ ewmh_update_wm_desktops();
+ ewmh_update_desktop_names();
+ ewmh_update_current_desktop();
+ put_status();