Merge pull request #2135 from zed-industries/handle-window-moved-crash

Max Brunsfeld created

Fix crash when unplugging display containing a zed window

Change summary

crates/gpui/src/app.rs | 27 +++++++++++++--------------
1 file changed, 13 insertions(+), 14 deletions(-)

Detailed changes

crates/gpui/src/app.rs 🔗

@@ -910,15 +910,14 @@ impl MutableAppContext {
             .map_or(false, |window| window.is_fullscreen)
     }
 
-    pub fn window_bounds(&self, window_id: usize) -> WindowBounds {
-        self.presenters_and_platform_windows[&window_id].1.bounds()
+    pub fn window_bounds(&self, window_id: usize) -> Option<WindowBounds> {
+        let (_, window) = self.presenters_and_platform_windows.get(&window_id)?;
+        Some(window.bounds())
     }
 
     pub fn window_display_uuid(&self, window_id: usize) -> Option<Uuid> {
-        self.presenters_and_platform_windows[&window_id]
-            .1
-            .screen()
-            .display_uuid()
+        let (_, window) = self.presenters_and_platform_windows.get(&window_id)?;
+        window.screen().display_uuid()
     }
 
     pub fn render_view(&mut self, params: RenderParams) -> Result<ElementBox> {
@@ -2375,8 +2374,10 @@ impl MutableAppContext {
                 callback(is_fullscreen, this)
             });
 
-            if let Some(uuid) = this.window_display_uuid(window_id) {
-                let bounds = this.window_bounds(window_id);
+            if let Some((uuid, bounds)) = this
+                .window_display_uuid(window_id)
+                .zip(this.window_bounds(window_id))
+            {
                 let mut bounds_observations = this.window_bounds_observations.clone();
                 bounds_observations.emit(window_id, this, |callback, this| {
                     callback(bounds, uuid, this)
@@ -2560,8 +2561,10 @@ impl MutableAppContext {
     }
 
     fn handle_window_moved(&mut self, window_id: usize) {
-        if let Some(display) = self.window_display_uuid(window_id) {
-            let bounds = self.window_bounds(window_id);
+        if let Some((display, bounds)) = self
+            .window_display_uuid(window_id)
+            .zip(self.window_bounds(window_id))
+        {
             self.window_bounds_observations
                 .clone()
                 .emit(window_id, self, move |callback, this| {
@@ -3733,10 +3736,6 @@ impl<'a, T: View> ViewContext<'a, T> {
         self.app.toggle_window_full_screen(self.window_id)
     }
 
-    pub fn window_bounds(&self) -> WindowBounds {
-        self.app.window_bounds(self.window_id)
-    }
-
     pub fn prompt(
         &self,
         level: PromptLevel,