From 833a5c7647f8977ed42b1916051da21cbb4a4047 Mon Sep 17 00:00:00 2001
From: Pascal Kuthe <pascal.kuthe@semimod.de>
Date: Sun, 2 Jul 2023 17:57:32 +0200
Subject: [PATCH] use redraw handle for debouncing LSP messages

---
 helix-term/src/application.rs | 13 +------------
 helix-view/src/editor.rs      |  2 +-
 2 files changed, 2 insertions(+), 13 deletions(-)

diff --git a/helix-term/src/application.rs b/helix-term/src/application.rs
index e1a622f9d06b..4c86a19f7ac7 100644
--- a/helix-term/src/application.rs
+++ b/helix-term/src/application.rs
@@ -34,7 +34,6 @@ use std::{
     io::{stdin, stdout},
     path::Path,
     sync::Arc,
-    time::{Duration, Instant},
 };
 
 use anyhow::{Context, Error};
@@ -45,8 +44,6 @@ use {signal_hook::consts::signal, signal_hook_tokio::Signals};
 #[cfg(windows)]
 type Signals = futures_util::stream::Empty<()>;
 
-const LSP_DEADLINE: Duration = Duration::from_millis(16);
-
 #[cfg(not(feature = "integration"))]
 use tui::backend::CrosstermBackend;
 
@@ -76,7 +73,6 @@ pub struct Application {
     signals: Signals,
     jobs: Jobs,
     lsp_progress: LspProgressMap,
-    last_render: Instant,
 }
 
 #[cfg(feature = "integration")]
@@ -253,7 +249,6 @@ impl Application {
             signals,
             jobs: Jobs::new(),
             lsp_progress: LspProgressMap::new(),
-            last_render: Instant::now(),
         };
 
         Ok(app)
@@ -300,7 +295,6 @@ impl Application {
         S: Stream<Item = crossterm::Result<crossterm::event::Event>> + Unpin,
     {
         self.render().await;
-        self.last_render = Instant::now();
 
         loop {
             if !self.event_loop_until_idle(input_stream).await {
@@ -609,12 +603,7 @@ impl Application {
             EditorEvent::LanguageServerMessage((id, call)) => {
                 self.handle_language_server_message(call, id).await;
                 // limit render calls for fast language server messages
-                let last = self.editor.language_servers.incoming.is_empty();
-
-                if last || self.last_render.elapsed() > LSP_DEADLINE {
-                    self.render().await;
-                    self.last_render = Instant::now();
-                }
+                self.editor.redraw_handle.0.notify_one();
             }
             EditorEvent::DebuggerEvent(payload) => {
                 let needs_render = self.editor.handle_debugger_message(payload).await;
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index 61d148d32c56..107baa9fc692 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -1703,7 +1703,7 @@ impl Editor {
                 _ = self.redraw_handle.0.notified() => {
                     if  !self.needs_redraw{
                         self.needs_redraw = true;
-                        let timeout = Instant::now() + Duration::from_millis(96);
+                        let timeout = Instant::now() + Duration::from_millis(33);
                         if timeout < self.idle_timer.deadline(){
                             self.idle_timer.as_mut().reset(timeout)
                         }