Wait to add workspace to multi-workspace until deserialization finishes

Max Brunsfeld created

Change summary

crates/workspace/src/workspace.rs | 28 ++++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)

Detailed changes

crates/workspace/src/workspace.rs 🔗

@@ -1914,6 +1914,7 @@ impl Workspace {
                 OpenMode::NewWindow => None,
                 _ => requesting_window,
             };
+            let reuse_existing_window = window_to_replace.is_some();
 
             let (window, workspace): (WindowHandle<MultiWorkspace>, Entity<Workspace>) =
                 if let Some(window) = window_to_replace {
@@ -1922,7 +1923,7 @@ impl Workspace {
                         .map(|w| w.centered_layout)
                         .unwrap_or(false);
 
-                    let workspace = window.update(cx, |multi_workspace, window, cx| {
+                    let workspace = window.update(cx, |_multi_workspace, window, cx| {
                         let workspace = cx.new(|cx| {
                             let mut workspace = Workspace::new(
                                 Some(workspace_id),
@@ -1941,17 +1942,6 @@ impl Workspace {
 
                             workspace
                         });
-                        match open_mode {
-                            OpenMode::Activate => {
-                                multi_workspace.activate(workspace.clone(), window, cx);
-                            }
-                            OpenMode::Add => {
-                                multi_workspace.add(workspace.clone(), &*window, cx);
-                            }
-                            OpenMode::NewWindow => {
-                                unreachable!()
-                            }
-                        }
                         workspace
                     })?;
                     (window, workspace)
@@ -2059,6 +2049,20 @@ impl Workspace {
                 }
             }
 
+            if reuse_existing_window {
+                window.update(cx, |multi_workspace, window, cx| match open_mode {
+                    OpenMode::Activate => {
+                        multi_workspace.activate(workspace.clone(), window, cx);
+                    }
+                    OpenMode::Add => {
+                        multi_workspace.add(workspace.clone(), &*window, cx);
+                    }
+                    OpenMode::NewWindow => {
+                        unreachable!()
+                    }
+                })?;
+            }
+
             window
                 .update(cx, |_, _window, cx| {
                     workspace.update(cx, |this: &mut Workspace, cx| {