Fix panic caused by focusing the same thing twice

Conrad Irwin created

Change summary

crates/command_palette2/src/command_palette.rs | 1 -
crates/gpui2/src/window.rs                     | 4 ++++
crates/workspace2/src/modal_layer.rs           | 5 +++--
3 files changed, 7 insertions(+), 3 deletions(-)

Detailed changes

crates/command_palette2/src/command_palette.rs 🔗

@@ -268,7 +268,6 @@ impl PickerDelegate for CommandPaletteDelegate {
     }
 
     fn dismissed(&mut self, cx: &mut ViewContext<Picker<Self>>) {
-        cx.focus(&self.previous_focus_handle);
         self.command_palette
             .update(cx, |_, cx| cx.emit(ModalEvent::Dismissed))
             .log_err();

crates/gpui2/src/window.rs 🔗

@@ -407,6 +407,10 @@ impl<'a> WindowContext<'a> {
 
     /// Move focus to the element associated with the given `FocusHandle`.
     pub fn focus(&mut self, handle: &FocusHandle) {
+        if self.window.focus == Some(handle.id) {
+            return;
+        }
+
         if self.window.last_blur.is_none() {
             self.window.last_blur = Some(self.window.focus);
         }

crates/workspace2/src/modal_layer.rs 🔗

@@ -36,8 +36,9 @@ impl ModalLayer {
         let previous_focus = cx.focused();
 
         if let Some(active_modal) = &self.active_modal {
-            if active_modal.modal.clone().downcast::<V>().is_ok() {
-                self.hide_modal(cx);
+            let is_close = active_modal.modal.clone().downcast::<V>().is_ok();
+            self.hide_modal(cx);
+            if is_close {
                 return;
             }
         }