diff --git a/helix-term/src/events.rs b/helix-term/src/events.rs index 415213c22..15d811529 100644 --- a/helix-term/src/events.rs +++ b/helix-term/src/events.rs @@ -1,6 +1,8 @@ use helix_event::{events, register_event}; use helix_view::document::Mode; -use helix_view::events::{DiagnosticsDidChange, DocumentDidChange, SelectionDidChange}; +use helix_view::events::{ + DiagnosticsDidChange, DocumentDidChange, DocumentFocusLost, SelectionDidChange, +}; use crate::commands; use crate::keymap::MappableCommand; @@ -16,6 +18,7 @@ pub fn register() { register_event::(); register_event::(); register_event::(); + register_event::(); register_event::(); register_event::(); } diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs index ba7337f22..7b9c9aff8 100644 --- a/helix-view/src/editor.rs +++ b/helix-view/src/editor.rs @@ -3,6 +3,7 @@ use crate::{ document::{ DocumentOpenError, DocumentSavedEventFuture, DocumentSavedEventResult, Mode, SavePoint, }, + events::DocumentFocusLost, graphics::{CursorKind, Rect}, handlers::Handlers, info::Info, @@ -13,6 +14,7 @@ use crate::{ Document, DocumentId, View, ViewId, }; use dap::StackFrame; +use helix_event::dispatch; use helix_vcs::DiffProviderRegistry; use futures_util::stream::select_all::SelectAll; @@ -1553,7 +1555,7 @@ impl Editor { self.enter_normal_mode(); } - match action { + let focust_lost = match action { Action::Replace => { let (view, doc) = current_ref!(self); // If the current view is an empty scratch buffer and is not displayed in any other views, delete it. @@ -1603,6 +1605,10 @@ impl Editor { self.replace_document_in_view(view_id, id); + dispatch(DocumentFocusLost { + editor: self, + doc: id, + }); return; } Action::Load => { @@ -1613,6 +1619,7 @@ impl Editor { return; } Action::HorizontalSplit | Action::VerticalSplit => { + let focus_lost = self.tree.try_get(self.tree.focus).map(|view| view.doc); // copy the current view, unless there is no view yet let view = self .tree @@ -1632,10 +1639,17 @@ impl Editor { let doc = doc_mut!(self, &id); doc.ensure_view_init(view_id); doc.mark_as_focused(); + focus_lost } - } + }; self._refresh(); + if let Some(focus_lost) = focust_lost { + dispatch(DocumentFocusLost { + editor: self, + doc: focus_lost, + }); + } } /// Generate an id for a new document and register it. @@ -1862,11 +1876,15 @@ impl Editor { let doc = doc_mut!(self, &view.doc); view.sync_changes(doc); } + let view = view!(self, view_id); + let doc = doc_mut!(self, &view.doc); + doc.mark_as_focused(); + let focus_lost = self.tree.get(prev_id).doc; + dispatch(DocumentFocusLost { + editor: self, + doc: focus_lost, + }); } - - let view = view!(self, view_id); - let doc = doc_mut!(self, &view.doc); - doc.mark_as_focused(); } pub fn focus_next(&mut self) { diff --git a/helix-view/src/events.rs b/helix-view/src/events.rs index 136d60c51..eb97268ce 100644 --- a/helix-view/src/events.rs +++ b/helix-view/src/events.rs @@ -13,4 +13,6 @@ events! { } SelectionDidChange<'a> { doc: &'a mut Document, view: ViewId } DiagnosticsDidChange<'a> { editor: &'a mut Editor, doc: DocumentId } + // called **after** a document loses focus (but not when its closed) + DocumentFocusLost<'a> { editor: &'a mut Editor, doc: DocumentId } }