diff --git a/sway/input/seat.c b/sway/input/seat.c
index 675edb2d..f5cb2f9e 100644
--- a/sway/input/seat.c
+++ b/sway/input/seat.c
@@ -667,10 +667,8 @@ void seat_set_focus_warp(struct sway_seat *seat, struct sway_node *node,
 	}
 
 	// find new output's old workspace, which might have to be removed if empty
-	struct sway_workspace *new_output_last_ws = NULL;
-	if (new_output && last_output != new_output) {
-		new_output_last_ws = output_get_active_workspace(new_output);
-	}
+	struct sway_workspace *new_output_last_ws =
+		new_output ? output_get_active_workspace(new_output) : NULL;
 
 	// Unfocus the previous focus
 	if (last_focus) {
@@ -719,8 +717,17 @@ void seat_set_focus_warp(struct sway_seat *seat, struct sway_node *node,
 		ipc_event_window(container, "focus");
 	}
 
-	if (new_output_last_ws) {
-		workspace_consider_destroy(new_output_last_ws);
+	// Move sticky containers to new workspace
+	if (new_output_last_ws && new_workspace != new_output_last_ws) {
+		for (int i = 0; i < new_output_last_ws->floating->length; ++i) {
+			struct sway_container *floater =
+				new_output_last_ws->floating->items[i];
+			if (floater->is_sticky) {
+				container_detach(floater);
+				workspace_add_floating(new_workspace, floater);
+				--i;
+			}
+		}
 	}
 
 	// Close any popups on the old focus
@@ -754,11 +761,14 @@ void seat_set_focus_warp(struct sway_seat *seat, struct sway_node *node,
 		container_raise_floating(container);
 	}
 
-	if (last_focus) {
-		if (last_workspace) {
-			workspace_consider_destroy(last_workspace);
-		}
+	if (new_output_last_ws) {
+		workspace_consider_destroy(new_output_last_ws);
+	}
+	if (last_workspace && last_workspace != new_output_last_ws) {
+		workspace_consider_destroy(last_workspace);
+	}
 
+	if (last_focus) {
 		if (config->mouse_warping && warp && new_output != last_output) {
 			double x = 0;
 			double y = 0;
diff --git a/sway/tree/workspace.c b/sway/tree/workspace.c
index e9e5dfa2..b357d83d 100644
--- a/sway/tree/workspace.c
+++ b/sway/tree/workspace.c
@@ -369,7 +369,6 @@ struct sway_workspace *workspace_prev(struct sway_workspace *current) {
 bool workspace_switch(struct sway_workspace *workspace,
 		bool no_auto_back_and_forth) {
 	struct sway_seat *seat = input_manager_current_seat(input_manager);
-	struct sway_node *focus = seat_get_focus_inactive(seat, &root->node);
 	struct sway_workspace *active_ws = seat_get_focused_workspace(seat);
 
 	if (!no_auto_back_and_forth && config->auto_back_and_forth
@@ -392,27 +391,6 @@ bool workspace_switch(struct sway_workspace *workspace,
 		strcpy(prev_workspace_name, active_ws->name);
 	}
 
-	// Move sticky containers to new workspace
-	struct sway_output *next_output = workspace->output;
-	struct sway_workspace *next_output_prev_ws =
-		output_get_active_workspace(next_output);
-	if (workspace != next_output_prev_ws) {
-		for (int i = 0; i < next_output_prev_ws->floating->length; ++i) {
-			struct sway_container *floater =
-				next_output_prev_ws->floating->items[i];
-			if (floater->is_sticky) {
-				container_detach(floater);
-				workspace_add_floating(workspace, floater);
-				if (&floater->node == focus) {
-					seat_set_focus(seat, NULL);
-					seat_set_focus_container(seat, floater);
-					cursor_send_pointer_motion(seat->cursor, 0, true);
-				}
-				--i;
-			}
-		}
-	}
-
 	wlr_log(WLR_DEBUG, "Switching to workspace %p:%s",
 		workspace, workspace->name);
 	struct sway_node *next = seat_get_focus_inactive(seat, &workspace->node);