bool swap_desktops(monitor_t *m1, desktop_t *d1, monitor_t *m2, desktop_t *d2, bool follow)
{
- if (d1 == NULL || d2 == NULL || d1 == d2 ||
- (m1->desk == d1 && m1->sticky_count > 0) ||
- (m2->desk == d2 && m2->sticky_count > 0)) {
+ if (d1 == NULL || d2 == NULL || d1 == d2) {
return false;
}
bool d2_was_active = (m2->desk == d2);
bool d1_was_focused = (mon->desk == d1);
bool d2_was_focused = (mon->desk == d2);
+ desktop_t *d1_stickies = NULL;
+ desktop_t *d2_stickies = NULL;
+
+ if (m1->sticky_count > 0 && d1 == m1->desk && sticky_count(d1->root) > 0) {
+ d1_stickies = make_desktop(NULL, XCB_NONE);
+ insert_desktop(m1, d1_stickies);
+ transfer_sticky_nodes(m1, d1, m1, d1_stickies, d1->root);
+ }
+
+ if (m2->sticky_count > 0 && d2 == m2->desk && sticky_count(d2->root) > 0) {
+ d2_stickies = make_desktop(NULL, XCB_NONE);
+ insert_desktop(m2, d2_stickies);
+ transfer_sticky_nodes(m2, d2, m2, d2_stickies, d2->root);
+ }
if (m1 != m2) {
if (m1->desk == d1) {
arrange(m2, d1);
}
+ if (d1_stickies != NULL) {
+ transfer_sticky_nodes(m1, d1_stickies, m1, d2, d1_stickies->root);
+ unlink_desktop(m1, d1_stickies);
+ free(d1_stickies);
+ }
+
+ if (d2_stickies != NULL) {
+ transfer_sticky_nodes(m2, d2_stickies, m2, d1, d2_stickies->root);
+ unlink_desktop(m2, d2_stickies);
+ free(d2_stickies);
+ }
+
if (d1_was_active && !d2_was_active) {
if ((!follow && m1 != m2) || !d1_was_focused) {
hide_desktop(d1);