on master help sign in
factor editor event handling into function
commit8c667ef8deea1311a8e9569909ac11d79cc993ed authorSkyler Hawthorne <skyler@dead10ck.com> dateFri 22 Jul 2022, 01:07 (4 years ago) parentaaa1450
2 files changed+55−52
helix-term/src/application.rs+52−49 helix-term/src/ui/mod.rs+3−3
helix-term/src/application.rs+52−49
@@ -287,9 +287,6 @@ impl Application {
287287 where
288288 S: Stream<Item = crossterm::Result<crossterm::event::Event>> + Unpin,
289289 {
290− #[cfg(feature = "integration")]
291− let mut idle_handled = false;
292−
293290 loop {
294291 if self.editor.should_close() {
295292 return false;
@@ -315,56 +312,19 @@ impl Application {
315312 self.render();
316313 }
317314 event = self.editor.wait_event() => {
318− log::debug!("received editor event: {:?}", event);
315+ let _idle_handled = self.handle_editor_event(event).await;
319316
320− match event {
321− EditorEvent::DocumentSave(event) => {
322− self.handle_document_write(event);
323− self.render();
324− }
325− EditorEvent::ConfigEvent(event) => {
326− self.handle_config_events(event);
327− self.render();
328− }
329− EditorEvent::LanguageServerMessage((id, call)) => {
330− self.handle_language_server_message(call, id).await;
331− // limit render calls for fast language server messages
332− let last = self.editor.language_servers.incoming.is_empty();
333−
334− if last || self.last_render.elapsed() > LSP_DEADLINE {
335− self.render();
336− self.last_render = Instant::now();
337− }
338− }
339− EditorEvent::DebuggerEvent(payload) => {
340− let needs_render = self.editor.handle_debugger_message(payload).await;
341− if needs_render {
342− self.render();
343− }
344− }
345− EditorEvent::IdleTimer => {
346− self.editor.clear_idle_timer();
347− self.handle_idle_timeout();
348−
349− #[cfg(feature = "integration")]
350− {
351− log::debug!("idle handled");
352− idle_handled = true;
353− }
317+ // for integration tests only, reset the idle timer after every
318+ // event to signal when test events are done processing
319+ #[cfg(feature = "integration")]
320+ {
321+ if _idle_handled {
322+ return true;
354323 }
355− }
356− }
357− }
358324
359− // for integration tests only, reset the idle timer after every
360− // event to signal when test events are done processing
361− #[cfg(feature = "integration")]
362− {
363− if idle_handled {
364− return true;
325+ self.editor.reset_idle_timer();
326+ }
365327 }
366−
367− self.editor.reset_idle_timer();
368328 }
369329 }
370330 }
@@ -517,6 +477,49 @@ impl Application {
517477 }
518478 }
519479
480+ #[inline(always)]
481+ pub async fn handle_editor_event(&mut self, event: EditorEvent) -> bool {
482+ log::debug!("received editor event: {:?}", event);
483+
484+ match event {
485+ EditorEvent::DocumentSave(event) => {
486+ self.handle_document_write(event);
487+ self.render();
488+ }
489+ EditorEvent::ConfigEvent(event) => {
490+ self.handle_config_events(event);
491+ self.render();
492+ }
493+ EditorEvent::LanguageServerMessage((id, call)) => {
494+ self.handle_language_server_message(call, id).await;
495+ // limit render calls for fast language server messages
496+ let last = self.editor.language_servers.incoming.is_empty();
497+
498+ if last || self.last_render.elapsed() > LSP_DEADLINE {
499+ self.render();
500+ self.last_render = Instant::now();
501+ }
502+ }
503+ EditorEvent::DebuggerEvent(payload) => {
504+ let needs_render = self.editor.handle_debugger_message(payload).await;
505+ if needs_render {
506+ self.render();
507+ }
508+ }
509+ EditorEvent::IdleTimer => {
510+ self.editor.clear_idle_timer();
511+ self.handle_idle_timeout();
512+
513+ #[cfg(feature = "integration")]
514+ {
515+ return true;
516+ }
517+ }
518+ }
519+
520+ false
521+ }
522+
520523 pub fn handle_terminal_events(&mut self, event: Result<CrosstermEvent, crossterm::ErrorKind>) {
521524 let mut cx = crate::compositor::Context {
522525 editor: &mut self.editor,
helix-term/src/ui/mod.rs+3−3
@@ -14,7 +14,7 @@ mod statusline;
1414mod text;
1515
1616use crate::compositor::{Component, Compositor};
17−use crate::job;
17+use crate::job::{self, Callback};
1818pub use completion::Completion;
1919pub use editor::EditorView;
2020pub use markdown::Markdown;
@@ -121,7 +121,7 @@ pub fn regex_prompt(
121121
122122 if event == PromptEvent::Validate {
123123 let callback = async move {
124− let call: job::Callback = Box::new(
124+ let call: job::Callback = Callback::EditorCompositor(Box::new(
125125 move |_editor: &mut Editor, compositor: &mut Compositor| {
126126 let contents = Text::new(format!("{}", err));
127127 let size = compositor.size();
@@ -135,7 +135,7 @@ pub fn regex_prompt(
135135
136136 compositor.replace_or_push("invalid-regex", popup);
137137 },
138− );
138+ ));
139139 Ok(call)
140140 };
141141