on master help sign in
More responsive key input
a0a5bd5Ivan Tham
helix-term/src/application.rs+11−12
@@ -9,6 +9,7 @@ use log::error;
9use std::{
9use std::{
10 io::{stdout, Write},
10 io::{stdout, Write},
11 sync::Arc,
11 sync::Arc,
12+ time::{Duration, Instant},
12};
13};
13
14
14use anyhow::Error;
15use anyhow::Error;
@@ -130,6 +131,8 @@ impl Application {
130
131
131 pub async fn event_loop(&mut self) {
132 pub async fn event_loop(&mut self) {
132 let mut reader = EventStream::new();
133 let mut reader = EventStream::new();
134+ let mut last_render = Instant::now();
135+ let deadline = Duration::from_secs(1) / 60;
133
136
134 self.render();
137 self.render();
135
138
@@ -139,26 +142,22 @@ impl Application {
139 break;
142 break;
140 }
143 }
141
144
142− use futures_util::{FutureExt, StreamExt};
145+ use futures_util::StreamExt;
143
146
144 tokio::select! {
147 tokio::select! {
148+ biased;
149+
145 event = reader.next() => {
150 event = reader.next() => {
146 self.handle_terminal_events(event)
151 self.handle_terminal_events(event)
147 }
152 }
148 Some((id, call)) = self.editor.language_servers.incoming.next() => {
153 Some((id, call)) = self.editor.language_servers.incoming.next() => {
149 self.handle_language_server_message(call, id).await;
154 self.handle_language_server_message(call, id).await;
150−
155+ // limit render calls for fast language server messages
151− // eagerly process any other available notifications/calls
152− let now = std::time::Instant::now();
153− let deadline = std::time::Duration::from_millis(10);
154− while let Some(Some((id, call))) = self.editor.language_servers.incoming.next().now_or_never() {
156+ let last = self.editor.language_servers.incoming.is_empty();
155− self.handle_language_server_message(call, id).await;
156−
157− if now.elapsed() > deadline { // use a deadline so we don't block too long
157+ if last || last_render.elapsed() > deadline {
158− break;
158+ self.render();
159− }
159+ last_render = Instant::now();
160 }
160 }
161− self.render();
162 }
161 }
163 Some(callback) = self.jobs.futures.next() => {
162 Some(callback) = self.jobs.futures.next() => {
164 self.jobs.handle_callback(&mut self.editor, &mut self.compositor, callback);
163 self.jobs.handle_callback(&mut self.editor, &mut self.compositor, callback);